작성
·
913
·
수정됨
0
안녕하세요, 수업 잘 듣고 있습니다!
카프카 리밸런싱에 대해 수업을 들었습니다.
그런데 리밸런싱시 메시지를 중복 컨슘할 수 있을것 같은 생각이 들어서 문의드려요!
예를들어 하나의 토픽에 파티션 2개가 있고
하나의 컨슈머그룹에 컨슈머 2개가 각 파티션에 연결되어 동작하고 있는 상황입니다.
1번 컨슈머가 1번 파티션에 연결되어 있고
2번 컨슈머는 2번 파티션에 연결되어 있습니다.
1번 컨슈머가 1번 파티션에 들어있는 1번 레코드를 처리하는 도중, 장애가 나서 죽었습니다.
2번 컨슈머는 이를 감지하고 1번 파티션에 리밸런싱 되었습니다.
그리고 처리되지 못한 1번 레코드를 읽어서 처리하기 시작했습니다. 그러던 도중에 1번 컨슈머가 살아나서 다시 리밸런싱이 되어 1번 파티션으로 예전과 같이 연결되었습니다.
1번 레코드는 아직 커밋되지 않은 상태여서 1번 컨슈머는 1번 레코드를 읽었습니다. 그리고 1번 레코드를 처리하기 시작하여 동시에 1번 컨슈머와 2번 컨슈머가 1번 레코드를 처리하는 일이 벌어졌습니다.
이런 일이 발생할 수 있는걸까요?
혹시 이런 경우 어떻게 하면 중복처리를 막을 수 있을까요?
아니면 혹시 오프셋이 컨슈머 그룹기준이라서 1번 레코드를 컨슈머 2번이 읽고 '처리중' 이라면 1번 컨슈머가 다시 1번 파티션에 연결됐을 때 1번 레코드를 polling 하지 않게 될까요?
답변 1
0
안녕하세요!
말씀대로 컨슈머가 데이터를 처리하고 커밋하기 직전에 죽는다면 데이터가 중복 처리될 가능성이 있습니다. 그렇기 때문에 최종적으로 처리되는 데이터의 중복을 막으시려면 멱등성 동작을 수행하시는 것이 가장 좋습니다. 여러번 동일 레코드가 오더라도 결과는 동일하게 처리하게 로직을 짜는 것이죠.