본문 바로가기
관리자

Programming-[Backend]/Kafka

카프카 멱등성(Idempotence) 설정, Retry 및 DLT 설정 시 유의사항

728x90
반응형

1. 멱등성 설정

enable.idempotence = true
max.in.flight.requets.per.connection <= 5 (5 이하면 순서보장)
retries > 0 이여야함 -> '2147483647'로 설정
acks = 'all' 이여야함

 

만약 enable.idempotence = false이고,
max.in.flight.requests.per.connection > 1이면 메시지 배치 중 일부가 에러가 났을 때
재시도하면서 순서가 바뀔 수 있음

2. Retry, DLT 설정

DefaultErrorHandler() 부분에 컨슈머 에러 발생 시 Retry, DeadLetter 정책 설정

@Bean
  public DefaultErrorHandler errorHandler() {
    DefaultErrorHandler handler =
        new DefaultErrorHandler(
            new DeadLetterPublishingRecoverer(kafkaTemplate),
            new FixedBackOff(FIXED_BACKOFF_INTERVAL, FIXED_BACKOFF_MAX_ATTEMPTS)) {
          @Override
          public void handleRemaining(
              @Nonnull Exception thrownException,
              List<ConsumerRecord<?, ?>> records,
              @Nonnull Consumer<?, ?> consumer,
              @Nonnull MessageListenerContainer container) {

            records.forEach(
                r -> {
                  log.error(
                      "Error processing message. Topic: {}, Partition: {}, Offset: {}, Key: {}, Value: {}",
                      r.topic(),
                      r.partition(),
                      r.offset(),
                      r.key(),
                      r.value(),
                      thrownException);
                });

            super.handleRemaining(thrownException, records, consumer, container);
          }
        };
    handler.addNotRetryableExceptions(제외할 Exception들...);
    return handler;
  }

 

에러 발생 시 {토픽 이름}.DLT 토픽이 자동으로 생성되면서 데드레터가 쌓이는 구조

 

:warning: auto.topic.create.enable=false로 되어있으면 자동으로 생성되지 않으므로 주의. 이 설정을 하지 않으려면 Producer에서 AdminClient로 초기 토픽 생성 시 '{토픽이름}.DLT' 토픽들도 생성해야함

728x90
반응형