@Service public class EmailSendConsumer { @KafkaListener( topics = "email.send", groupId = "email-send-group" ) 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("이메일 발송 완료"); } }
{ "from": "sender@naver.com", "to": "fail@naver.com", "subject": "제목", "body": "내용" }


Backoff FixedBackOff{interval=0, currentAttempts=10, maxAttempts=9} …
interval : 재시도를 하는 시간 간격 (ms)interval=0일 경우 실패하자마자 즉시 재시도 한다는 뜻이다. maxAttempts : 최대 재시도 횟수maxAttempts=9인걸로 봐서 재시도를 9번까지 했다는 뜻이다. currentAttempts : 지금까지 시도한 횟수 (최초 시도 횟수 + 재시도 횟수)currentAttmpes=10인 이유는 최초 시도를 1번 하고 재시도를 9번 했기 때문이다. @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) ) 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("이메일 발송 완료"); } }
