Gidhub BE Developer

Kafka 메시지 손실 (Under Certain Conditions)

2019-12-15
goodGid

이 글의 코드 및 정보들은 을 바탕으로 작성하였습니다.

메시지 손실

  • acks = 1 옵션으로

  • 프로듀서가 카프카 토픽의 리더에게 메시지를 전송했는데

  • 메시지가 손실되는

  • 아주 예외적인 상황에 대해 알아보자.


정상적인 상황

  • 우선 정상적인 상황에 대해 알아보자.

1. 프로듀서가 acks = 1으로 토픽의 리더에게 메시지를 보낸다.

2. 리더는 메시지를 받은 후 저장한다.

3. 리더는 프로듀서에게 메시지를 받았다고 acks를 보낸다.

4. 팔로워들은 리더를 주기적으로 체크한다.

5. 리더에 새로운 메시지가 있는 것을 확인하고 

   팔로워들도 저장한다.
  • 일반적인 상황에서는

  • 메시지 손실 문제가 발생하지 않는다.


예외 상황

  • 리더에 장애가 발생하는 순간

  • 메시지 손실이 발생하게 된다.

  • 정상적인 상황처럼

  • 리더가 프로듀서에게 보낸 메시지를 잘 받았다고

  • acks를 보내는 3번까지의 작업은 진행된 상태이다.

  • 그리고 예외적인 상황에 대해서는

  • (= 4번 작업 이후)

  • 점선으로 표시되어 있다.

1. 프로듀서가 acks = 1으로 토픽의 리더에게 메시지를 보낸다.

2. 리더는 메시지를 받은 후 저장한다.

3. 리더는 프로듀서에게 메시지를 받았다고 acks를 보낸다.

4. 팔로워들은 리더를 주기적으로 체크해야하는데

   리더가 없는 상태이다.

5. 리더에 새로운 메시지가 있는지 모르기 때문에

   메시지를 가져올 수 없다.

  • 요약해보자면

  • 프로듀서가 전송한 메시지는

  • 브로커2에만 저장되어 있는 상태이고

  • 팔로워들은 리더가 갑작스레 다운되면서

  • 해당 메시지를 가지고 있지 않다.


  • 카프카에서는

  • 리플리케이션 동작 방식에 따라

  • 리더가 다운되었기 때문에

  • 팔로워 중 하나가 새로운 리더가 되고

  • 프로듀서의 요청을 처리하게 된다.


  • 즉 팔로워들은 브로커2로부터

  • 장애 발생 직전의 메시지는 가져오지 못하였지만

  • 그 상태 그대로 새로운 리더가 되는 것이다.


Summary

  • 프로듀서 / 리더 / 팔로워

  • 모두 정의된 프로세스에 따라 행동하였다.

  • 하지만 프로듀서가 acks = 1로 보낸 메시지는 손실되었다.

  • 이것이 바로 프로듀서 acks = 1로 설정했을 때

  • 메시지가 손실하는 아주 예외적인 경우이다.


Reference


Comments

Index