작성
·
11
0
안녕하세요 강사님
카프카에서 컨슈머가 메시지를 읽은 후 처리 과정에서 실패했을 때 재처리 전략을 어떻게 잡으면 좋은지 궁금합니다.
consume 이후 비즈니스 로직 실행중에 예외가 발생하여 실패한 경우
OOM 등의 이유로 서버가 비정상적으로 종료되어 실패한 경우
위의 두가지 상황에서 일반적으로 어떻게 처리하는지 궁금합니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. 김용철님.
Kafka에서 이벤트를 처리할 때 실패하는 경우를 고려한 재처리 전략은 매우 중요합니다. 질문하신 두 가지 상황에 대해 각각의 사례와 일반적으로 사용되는 전략을 설명드리겠습니다.
일반적으로 비즈니스 로직의 예외 발생 시 다음과 같은 처리 방안을 고려할 수 있습니다:
Dead Letter Queue(DLQ): 메시지가 처리되지 않을 경우 해당 메시지를 별도의 DLQ로 보내어 추후에 분석하거나 수동으로 처리할 수 있도록 설정합니다. Spring Kafka에서는 @RetryableTopic
을 통한 자동 재시도 및 DLQ 처리를 쉽게 설정할 수 있습니다.
재시도 로직: 특정 횟수만큼 메시지 처리를 재시도하고, 실패할 경우 DLQ로 넘기도록 합니다. 이때, 재시도 간격(backoff
)을 점차 늘려가는 방식의 exponential backoff를 적용하여 시스템 부하를 줄일 수 있습니다.
이 경우에는 다음과 같은 방안이 있습니다:
오프셋 관리: Kafka는 메시지를 읽음에 따라 오프셋(컨슈머가 읽은 마지막 메시지의 위치)을 관리합니다. 따라서, 처리하기 전에 오프셋을 커밋하지 않도록 설정하여 비정상 종료 후에도 다시 처리할 수 있도록 합니다.
지속 가능한 상태 체크: 서버가 교착 상태에 빠지거나 비정상적으로 종료될 경우, 자동으로 새로운 인스턴스가 가동되도록 컨테이너 오케스트레이션 툴(Docker Swarm, Kubernetes 등)을 활용해 보완할 수 있습니다.
Kafka와 관련한 오류 처리는 다양한 상황에 따라 달라질 수 있으며, 시스템의 요구사항에 따라 적합한 방식을 선택해야 합니다. 아래의 관련 질문을 통해 추가적인 정보를 확인할 수 있습니다:
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.