20190826

Kafka 2.3 Exactly-once 운영 메모

카프카 2.3 올리면서 exactly-once 기능을 프로듀서 쪽에서 제대로 설정했다. 2.1 때부터 multi-partition EoS 가능했는데 우린 그냥 at-least-once에 consumer 쪽에서 idempotent 처리하는 구조로 버티고 있었음. 이제 한 번 정리.

브로커 설정은 기존과 크게 안 바뀜. 프로듀서 쪽만.

acks=all
enable.idempotence=true
max.in.flight.requests.per.connection=5
retries=Integer.MAX_VALUE
transactional.id=order-service-1

스트리밍 앱 쪽은 이렇게.

props.put(StreamsConfig.PROCESSING_GUARANTEE_CONFIG, "exactly_once");

운영 포인트:

  • transactional.id는 인스턴스 유니크하게 줘야 한다. 컨테이너 재시작 시 같은 id면 괜찮지만 수평 확장시 인스턴스별로 달라야 함.
  • 트랜잭션 커밋 실패 시 ProducerFencedException 나오면 프로세스 종료하고 restart. 복구 시도하지 말 것.
  • commit interval 짧게 하면 throughput 떨어짐. 우리는 500ms로 잡고 있음.

성능 영향 — 기존 대비 write throughput 15~20% 감소. 근데 컨슈머 쪽 중복 제거 로직 없애니까 전체 코드 엄청 줄었다. 트레이드오프 괜찮음.

2.3 들어온 Incremental Cooperative Rebalancing도 같이 켬. 컨슈머 리밸런싱이 한 번에 전체 멈추는 게 아니라 점진적으로 바뀌어서 p99 latency 스파이크가 훨씬 덜함.

댓글 없음: