• 카테고리

    질문 & 답변
  • 세부 분야

    데이터 엔지니어링

  • 해결 여부

    미해결

오프셋 커밋 과정에서 장애 발생 시 카프카에서는 어떤 처리가 일어나는지 궁금합니다

24.04.08 14:56 작성 24.04.08 18:32 수정 조회수 103

0

자동 커밋 옵션을 활성화한 경우 일정 시간마다 오프셋 커밋을 실행하는 것을 이해했습니다.

 

결제 이벤트를 처리하는 카프카 컨슈머가 100건의 레코드를 가져와서 한번에 처리하도록 구현되어 있을 때 레코드 처리 중간에 장애가 발생하여 오프셋 커밋을 하지 못하는 경우 어떤 일이 일어나는지 궁금합니다.

 

50번째 레코드를 처리하다가 장애가 발생했다고 가정하면 오프셋 커밋이 되지 못했으므로 다른 컨슈머 애플리케이션이 이미 처리된 100건의 레코드를 다시 가져와서 1~50번째 레코드가 중복으로 이벤트가 처리될 것 같습니다.

 

이는 컨슈머 애플리케이션은 언제든지 중복으로 레코드를 소비할 수 있다는 것으로 이해가 되고, 컨슈머 애플리케이션 로직을 작성할 때는 항상 중복 레코드가 처리되지 않도록 방어해야한다는 것을 의미한다고 생각합니다.

 

제가 만약 방어 로직을 작성한다고 하면 레코드의 메시지마다 유일한 키값을 같이 전송하여 해당 값을 Redis에 저장하고, redis에 저장된 상태라면 메시지를 처리하지 않도록 구현할 것 같습니다.

 

제가 오프셋과 관련하여 이해한 내용이 정확한지, 그리고 실무에서도 Redis를 활용한 중복 처리 방지 로직이 효과적인 방법인지 궁금합니다. 또한, 이와 같은 상황을 해결하기 위해 다른 방법을 사용하시는지도 알고 싶습니다. 답변 주시면 감사하겠습니다! 

답변 3

·

답변을 작성해보세요.

0

박의성님의 프로필

박의성

질문자

2024.04.14

안녕하세요.

첨부해주신 영상 링크에 궁금한 부분이 모두 있네요!

 

완벽하게 이해된 상태에서 질문한 것이 아니라서 두서가 없었을텐데 상세하게 답변 주셔서 감사합니다!

0

안녕하세요.

자동 커밋 옵션이 실행되는 경우 레코드 처리 중간에 장애가 발생하면 마지막으로 커밋된 오프셋부터 마지막으로 처리했던 데이터까지 중복처리가 발생하게 됩니다. 이에 따라 실무환경에서도 컨슈머는 언제든 중복이 될 수 있는 가능성에 대해 염려하고 있으며, 가장 정확한 방법은 유니크 키를 가진 처리방식을 사용함으로써 데이터가 중복으로 들어오더라도 단 한번만 처리하는 idempotence 처리를 만족할 수 있게 됩니다.

말씀하신 바와 같이 레디스를 사용하는 방식도 있고 또는 rdb의 unique key 등을 활용하는 방식도 있습니다. 이외에도 upsert, WAL 방식을 예로 들 수 있겠는데요. 관련 내용을 담은 유튜브 링크를 하나 공유해드리겠습니다!

0

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2024.04.08

안녕하세요, 인프런 AI 인턴입니다.

박의성님의 질문에 대하여 아파치 카프카 컨슈머의 오프셋 커밋 과정과 장애 상황 대응에 관련된 구체적인 설명을 포함한 답변 링크를 추천해드리겠습니다.

자동 커밋 설정을 활성화한 상황에서 중간에 장애가 발생하는 경우, 컨슈머는 커밋하지 못한 마지막 오프셋 위치에서부터 다시 시작하게 됩니다. 이는 컨슈머 측에서 오프셋을 직접 관리하지 않아도, 카프카가 마지막 커밋된 오프셋 근처에서 읽기를 재개할 수 있게 해주며, 이 과정에서 재처리나 중복 처리 가능성을 내포하고 있습니다.

질문하신 내용과 매우 유사한 상황에 대한 설명이 포함된 답변을 찾았습니다. 이는 오프셋 커밋 실패 후 다음 동작에 대한 질문에 대한 해답을 포함하고 있으며, 중복 처리에 대한 예방 및 방어 로직 필요성을 잘 설명하고 있습니다. 해당 설명은 다음과 같습니다:

  • 카프카 컨슈머와 오프셋 커밋 실패 대응“에서 컨슈머가 오프셋 커밋을 실패한 경우, 컨슈머 그룹의 오프셋 커밋 위치가 변경되지 않아, 다음 poll() 호출 시 마지막 성공적으로 커밋된 오프셋 다음부터 메시지를 다시 읽기 시작한다고 설명하고 있습니다.

이 내용은 박의성님의 질문에 부합하는 정보를 제공하며, 컨슈머 애플리케이션에서 중복 레코드를 소비할 가능성에 대비하여 방어 로직을 구현하는 것이 중요함을 강조합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.