전사 메시지 플랫폼에서 Kafka exactly-once transaction의 hanging 문제가 대형 장애로 번진 것을 계기로, 그 기능을 걷어내고 중복 차단을 다시 설계한 뒤 3배 트래픽 요구까지 대응한 개선기다. partition을 720개에서 100개로 줄이면서도 latency·처리량을 높인 과정을 다룬다.
핵심 포인트- exactly-once transaction은 여러 message를 묶는 장점이 있으나 consumer business logic의 멱등성까지 보장하지 못하고 hanging transaction은 사람이 진단·복구해야 해 오히려 유지 비용을 키워, 제거하고 API request hash를 cache key·topic retention을 TTL로 쓰는 Redis dedup으로 Kafka 내부 중복만 차단
- Redis 용량을 `MEMORY USAGE` 기준 key당 120byte로 잡고 4GB cluster를 배포했으나 실제 overhead 포함 272byte로 약 2.5배였고 eviction·replication 부하 위험에 rollback해 TTL·key 수·용량을 재조정한 함정
- partition 증설은 recovery·commit latency를 키우고 되돌릴 수 없으므로, timeout과 무관하게 15분+ 멈춰 rebalance를 유발하는 FCM outlier를 application time limiter로 끊고, 순서 불필요 message는 비동기 commit + TTL dead-letter topic 재시도, metadata 조회·발송 분리, 트래픽 성격별 thread pool, router 제거, 100건 batch commit으로 partition을 720→100개로 줄이고도 2배 트래픽 대부분 1분·실시간 10초 내 처리
왜 읽나Kafka 기반 대규모 발송 플랫폼 운영자에게 exactly-once의 함정과 Redis dedup·time limiter·비동기화·partition 축소라는 실전 개선 레퍼런스를 준다.