-
신뢰성 있는 카프카 애플리케이션을 만드는 3가지 방법세미나, 영상 요약정리 2023. 10. 23. 00:01
https://www.youtube.com/watch?v=7_VdIFH6M6Q
최원영 님의 Kakao Tech Meet의 발표를 요약해보고자 합니다.
메시지 전달 신뢰성
- 정확히 한 번
- 적어도 한 번
- 최대 한 번
보통 정확히 한 번을 요구하는 경우가 많은데 어떻게 요구사항을 잘 반영할 수 있을까요?
방법 1 - Producer의 메시지 전달 신뢰도
실제로 적재되었지만 네트워크로 인해 Acknowlegement가 유실되는 경우에 Retry를 수행하게 되고 2번 레코드(이벤트 메시지) 적재될 수 있습니다.
불안정한 경우에는 2번 이상 발생할 수도 있습니다.
Kafka에서는 멱등성 producer를 활용할 수 있습니다.
enable.idempotence라는 옵션을 활용할 수 있는데 kafka 3.0이후로는 옵션이 true로 설정됩니다.
각 레코드를 전송할때 PID와 Seq를 전달하고 브로커는 이를 가지고 있다가 중복 적재 요청이 발생하면 이후 요청은 적재하지 않습니다.
방법 2 - Topic to Topic의 메시지 전달
클릭 한 번에 비용 청구 1번 수익 제공 1번이 발생해야 합니다.
하지만 A topic을 가져오는 Consumer에 장애가 발생하면 중복이 발생할 가능성이 있습니다.
데이터는 가져왔지만 commit은 하지 못하는 경우!
트랜잭션 프로듀서를 옵션을 설정하고 메시지를 Consume 하고 Produce를 수행할 때 트랜잭션으로 묶어줍니다.
트랜잭션이 완료되는 시점에서 Commit을 수행합니다.
B Topic을 Consume하는 부분에서는 isolcation.level을 read_committed로 주어야 합니다. (기본은 read_uncommitted)
방법 3) Consumer 중복 적재 방지
첫 번째로 DB의 Unique Key를 사용하여 저장소에 중복된 데이터 적재를 막을 수 있습니다.
두 번째로 Upsert를 활용하여 첫 번째로 Consume 하는 경우에는 Insert 두 번째로 Consume 하는 경우에는 Update를 수행합니다.
마무리
- 메시지 전달 신뢰성 테스트는 실제로 수행하기 까다롭다.. (레플리케이션 속도, 커밋 시점, 파티션 분배 등)
- 단일 카프카 클러스터에서 대응할 수 있고, 서로 다른 카프카 클러스터를 연동시에는 다른 관점의 고민이 필요하다
- 가장 중요한 것은 우리는 어느 정도 신뢰성을 가질것인지 먼저 생각하는 게 필요하다 (꼭 정확히 한 번이 필요하지 않을 수 있다.)
'세미나, 영상 요약정리' 카테고리의 다른 글
대규모 트랜잭션을 처리하는 배민 주문시스템 규모에 따른 진화 (0) 2023.12.31 토스 SLASH 23 - 토스는 Gateway 이렇게 씁니다. (0) 2023.11.18 폭증하는 카카오톡 트래픽에 대처하는 방법 - 신성열 (0) 2023.10.22 스프링과 함께 더 나은 개발자 되기 - 이일민(토비) (0) 2023.10.18 점진적 추상화 - 이승천 (0) 2023.09.26