ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Quarkus] SmallRye Kafka Connector
    Work 2025. 3. 5. 21:56

    개요

    • Quarkus Kafka Connector > Incoming Channel의 failure, commit 전략 이해하기

     

    내용

    주의) 아래는 Kafka Consumer의 동작이 아닌 Quakurs Kafka Connector의 동작이다.

     

    커밋 방식

    • default : 수동 커밋
      • enable.auto.commit=false

     

    Q. 메시지 처리 중 예외가 발생했을 때 어떻게 동작할까?

    • 메시지가 정상적으로 처리되었는지는 메시지의 ack/nack으로 구분함 (acknowledgement/not acknowledgement)
      • 예외가 발생했을 때 메시지는 nack됨
    • failure-strategy 설정에 따라 동작함
      • fail
        • 어플리케이션 중단시켜 메시지가 더이상 처리되지 못함 (컨슈머 종료)
        • 예외가 발생한 메시지의 오프셋을 커밋하지 않음
      • ignore
        • 실패가 로깅되고, 처리는 계속 진행함
        • 예외가 발생한 메시지의 오프셋은 커밋됨
      • dead-letter-queue
        • 예외가 발생한 메시지의 오프셋은 커밋됨
        • 해당 메시지는 dead letter topic에 발행됨
      • delayed-retry-topic
        • dead-letter-queue와 동일하게 동작
        • 대신 메시지가 설정한 재시도 횟수에 따라 재시도 토픽에 발행되어 재처리됨

     

    Q. 메시지가 ack 되었을 때 어떻게 커밋할까?

    • 자동 커밋일 때 ignore 전략 사용, 수동 커밋일 때 default로 throttled 전략 사용
    • commit-strategy 설정에 따라 동작함
      • throttled (수동 커밋 방식)
        • 수신된 메시지를 추적하고, 순차적으로 ack된 메시지의 최신 오프셋을 커밋하는 방식
          • 특정 메시지가 커밋될 때, 그 이전의 모든 메시지가 이미 ack 되었다는 것을 의미함 (즉, 이전 메시지가 모두 정상 처리되었다는 것)
        • 특징
          • 메시지를 비동기 처리하는 경우에도 ‘최소 1회 전달(at-least-once delivery)’ 보장함
            • 최소 1회 전달? 메시지가 최소 1번 처리되는 것 (메시지 수신을 의미하는게 아니라 메시지 수신 후 처리까지를 의미함)
        • 방식
          • 수신된 레코드를 추적하고, auto.commit.interval.ms(기본: 5000ms) 간격으로 가장 높은 연속된(offset이 끊기지 않은) 오프셋을 커밋함
          • 만약 특정 메시지가 ack되지 않은 상태로 남아 있으면, 그 메시지 이후의 레코드는 커밋되지 않음
            • 즉, 비동기로 메시지가 처리되어 높은 오프셋에 해당하는 메시지가 ack되었어도 이전 오프셋에 해당하는 메시지가 ack되지 못했다면 오프셋은 커밋되지 않음. 따라서 비동기 처리되어도 at-least-once delivery를 보장하는 것
        • 비정상 상태 감지
          • throttled.unprocessed-record-max-age.ms(기본값: 60000ms ) 내에 메시지가 ack되지 않으면, 해당 커넥터는 비정상 상태(unhealthy)로 표시됨
      • latest (수동 커밋 방식)
        • 메시지가 ack될 때마다 오프셋을 커밋함 (빈번한 오프셋 커밋이 발생하므로 처리량이 많은 경우 사용 불가)
          • 이전에 커밋된 오프셋보다 높은 오프셋일 때
      • ignore (자동 커밋 방식, Kafka Consumer에게 커밋 위임)
        • quarkus kafka connector가 오프셋을 커밋하지 않음

     

    참고)

    https://quarkus.io/guides/kafka#receiving-messages-from-kafka

    https://quarkus.io/guides/kafka#incoming-channel-configuration-polling-from-kafka

    댓글

Designed by Tistory.