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: 원문 보기