How We Cut Kafka Consumer Deployment Costs by 83% (trivago)

Author: ZhongLi Shen (trivago) | Source: tech.trivago.com | Published: 2026-06-12


한 줄 요약

PSE-kafka의 만성적 consumer lag·19건 P1 사고가 단일 원인이 아닌 여러 문제의 동시 작용(느린 poll·delayElement 천장·gRPC 풀 병목)임을 계층적 디버깅으로 밝혀, 셋을 모두 고쳐 파드 60→6(비용 83%↓).

핵심 주장/내용

  • 증상: 프로덕션 CPU ~10%, 시작 시 컨슈머 그룹 합류 느림, 높은 lag(replica가 이미 파티션 수와 같아 더 못 늘림). 가격 만료로 expired price를 점점 더 push
  • 모든 도구가 “정상”이라고 함(BlockHound로 blocking 없음, 스레드 풀 안 참, JFR로 모든 스레드 idle). poll()이 ~10초 간격 → broker가 죽은 것으로 간주해 그룹에서 축출
  • 세 가지 원인의 동시 작용(각각 단독 수정은 효과 없음):
    • 자체 KafkaReceiverFlux는 auto-commit만 → poll() 지연 시 commit 지연(reactor-kafka는 별도 스레드 commit)
    • Mono.delayElement(75s)로 메시지당 75초 in-memory 지연 + flatMap concurrency(기본 256) 천장
    • gRPC 클라이언트 스레드 풀 15개 vs 평균 7s/최대 30s 지연 서버 → 병목
  • 해결: reactor-kafka 마이그레이션 + flatMap concurrency↑ + gRPC 풀↑. 프로덕션엔 IsFinished 플래그로 delayElement 제거

주요 수치 / 사실

  • 파드 60→6(비용 83%↓), lag P1 알림 사라짐, 파드 시작 60s→10s, 비즈니스 영향 없음
  • 테스트에서 8k msg/s 달성(프로덕션엔 보수적 설정)
  • 교훈: pull-based는 안정적이나 문제를 숨김, in-memory delay는 위험, 한때 충분하던 파라미터가 시간이 지나며 병목

관련 위키


Source: 원문 보기