그럼 DLT는 왜 사용하는 걸까?
@RetryableTopic을 사용하면 자동으로 DLT 토픽을 생성하고 메시지를 전송해준다. 기본적으로 만드는 DLT 토픽 이름은 {기존 토픽명}-dlt 형태로 지어진다. 일관적인 DLT 토픽 이름을 위해 직접 DLT 토픽명을 별도로 다시 설정해주자. @Service public class EmailSendConsumer { @KafkaListener( topics = "email.send", groupId = "email-send-group" // 컨슈머 그룹 이름 ) @RetryableTopic( // 총 시도 횟수 (최초 시도 1회 + 재시도 4회) attempts = "5", // 재시도 간격 (1000ms -> 2000ms -> 4000ms -> 8000ms 순으로 재시도 시간이 증가한다.) backoff = @Backoff(delay = 1000, multiplier = 2), // DLT 토픽 이름에 붙일 접미사 dltTopicSuffix = ".dlt" ) public void consume(String message) { System.out.println("Kafka로부터 받아온 메시지: " + message); EmailSendMessage emailSendMessage = EmailSendMessage.fromJson(message); // 잘못된 이메일 주소일 경우 실패 가정 if (emailSendMessage.getTo().equals("fail@naver.com")) { System.out.println("잘못된 이메일 주소로 인해 발송 실패"); throw new RuntimeException("잘못된 이메일 주소로 인해 발송 실패"); } // ... 실제 이메일 발송 로직은 생략 ... try { Thread.sleep(10000); // 이메일 발송을 하는 데 10초가 걸린다고 가정 } catch (InterruptedException e) { throw new RuntimeException("이메일 발송 실패"); } System.out.println("이메일 발송 완료"); } }


email.send.dlt 토픽으로 메시지가 잘 전달된 걸 알 수 있다. # 토픽 전체 조회 $ bin/kafka-topics.sh \ --bootstrap-server localhost:9092 \ --list

email.send.dlt)이 잘 생성된 걸 확인할 수 있다. email.send-retry-1000, email.send-retry-2000 와 같은 토픽은 재시도를 하면서 생긴 토픽들이고, email.send-dlt라는 토픽은 DLT의 기본 설정값({기존 토픽명}-dlt)으로 인해 생겼던 토픽이다. # 토픽 내부 메시지 전체 조회 $ bin/kafka-console-consumer.sh \ --bootstrap-server localhost:9092 \ --topic email.send.dlt \ --from-beginning

email.send.dlt 토픽에 저장되어 있는 걸 확인할 수 있다. 