Free Lines Arrow
본문 바로가기
Message Queue/Kafka

[Kafka] Error Handling Patterns

by skahn1215 2024. 6. 1.
728x90
반응형

카프카 에러 핸들링

  • 카프카 에러 핸들링에 대해 알아본다. 
  • 카프카 어플리케이션은 이중화된 서버 또는 도커환경에서 수행된다.
  • 이중화된 환경에서는 종종 문제가 생기는경우가 있다.
  • 카프카의 에러를 처리하는 방식에 대해 알아보고 구현해 본다.

 
 

1. Dead letter queue

일반적으로 많이 쓰이는 방식이다. 
에러가 발생하면  에러가 발생한 이벤트를 Error topic(Dead Letter Queue)으로 보내고
메인 스트림은 계속해서 정상적으로 동작하게 한다. 

 
 

2. Add a retry topic and retry application

구매 서비스에서 사용자가 데이터를 구매했을때 상품 정보가 다른 어플리케이션에서 생성되어 
처리 된다고 가정해보자.
금액 필수값이 누락되 이벤트면 다시 그값을 가져오기 위해 이벤트를 재처리를 해야 한다.
복구 가능한 조건은 오류로 처리할 것이 아니라 조건이 충족될 때까지 주기적으로 재시도를 해야한다.
 

  • 정상이벤트인경우:  Process Topic 으로 보내어 데이터를 처리한다.
  • 재처리가  불가능한 이벤트 경우: Error Topic 으로 보낸다.
  • 재처리가 가능한 이벤트 경우: Retry Topic 으로 보내 다시 데이터를 Process Topic 으로 보내 처리한다.

 

재시도 패턴에서 알아야 될 점

재시도 패턴은 순서보장이 안될수 있다.
 
Event1 과 Event2 가 순서대로 들어 왔을경우
Event1: 에러 발생 재처리 시도후 Porcess Topic 에 들어감
Event2: 정상 이벤트 바로 Process Topic 에 들어감

Event1 이 재처리로 지연이 되면 Event2 먼저 처리 될 수 있다.

그럼 아래 그림처럼 2 이벤트가 먼저 처리되고 1번 이벤트가 처리가 된다.

 
 
 

3. Maintain order of redirected events

재시도 할때 순서를 유지해서 처리하는 방법
 
반드시 순서가 유지되어 처리되어야 하는 이벤트가 있다고 하자. 
1번 이벤트: 레벨업1 달성,  2번 이벤트: 레벨업2 달성
1번이 처리되고 2번이 처리되어야 정상동작을 할 것이다.
 
중간에 이벤트의 데이터가 누락 되어 재처리가 될때 어떻게 순서를 유지 할 수 있을까?
1번이 재시도 처리가 되는중에 2번이벤트가 먼저 처리 되면 에러가 발생한다. 
 
이것을 방지하는 구조를 알아보자. 
 

아래와 같이 이벤트가 순차적으로 들어올때

 
 

3.1 Event1 이 재처리 되는 경우 처리 방식

1. 실패 처리된 이벤트에 대한 UID 를 생성한뒤 로컬 메모리에 저장한다.
2. Retry 토픽에 보낸다.
3. 생성된 UID 정보를 담아 Redirect 토픽에 보낸다.

 
 

3.2 Event1 에 의존성이 있는 Event2 가 들어오는경우 처리

1. local inmemory DB 조회 하여 연관 데이터가 있는지 확인
- 해당 부분은 서비스 로직에 따라서 어떻게 관리할지 구현하는 사람에 따라 변경될수 있음
2. Event2 의 아이디를 생성해 Local in-memory 에 저장한다.
3. 순차적 처리를 위해 Retry Topic 에 Event2를 보낸다.
4. Event2 를 Redirect Topic 에 보낸다.

 
 
 

3.3 Retry kafka app 에서 처리방식

1. 재시도에 성공한 이벤트를 Process Topic으로 보낸다.
2. 각각 이벤트에 대한 Retry 를 성공적으로 처리 했다면 Redirect Topic 에 각각 성공에 대한 Event1 TS, Event2 TS 를 보낸다
- TS: TOMBSTONE EVENT
3. 메인 Kafka 앱 에서는 TS 에 대한 리스너를 만들어 해당 이벤트가 들어오면 DB 에서 EVENT1 UID, EVENT2 UID를 삭제해준다.
4. 해당 과정중에 관련없는 이벤트가 들어와서 성공한다면 Retry 를 할 필요없이 바로 Process Topic에 보낸다.

 
 
출처
https://www.confluent.io/ko-kr/blog/error-handling-patterns-in-kafka/

728x90
반응형

댓글