이전 강의에서 REST API 방식은 요청을 보낸 뒤에 모든 작업이 다 처리될 때까지 기다렸다가 응답을 받는 식으로 통신을 한다고 얘기했다. 그래서 만약 이메일 발송을 처리하는 데 시간이 오래 걸린다면 사용자는 늦게 응답을 받을 수 밖에 없다.
하지만 메시지 큐를 활용한 통신 방식은 비동기적으로 작업을 처리하기 때문에 모든 작업이 다 처리되는 것과 상관없이 빠르게 응답을 받을 수 있다고 설명했다. 정말 그런지 확인해보자.
✅ Kafka의 비동기 처리로 인한 성능 이점 느껴보기
Consumer 서버 코드 수정하기
이메일 발송을 처리하는 데 시간이 오래걸리는 걸 가정하기 위해 아래 코드를 추가해주자.
EmailSendConsumer
@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);
// ... 실제 이메일 발송 로직은 생략 ...
try {
Thread.sleep(3000); // 이메일 발송을 하는 데 3초가 걸린다고 가정
} catch (InterruptedException e) {
throw new RuntimeException("이메일 발송 실패");
}
System.out.println("이메일 발송 완료");
}
}
위와 같이 코드를 작성한 뒤에 서버를 재실행시켜주자.
이메일 발송 API 요청 보내보기
이메일 발송에 3초가 걸리더라도, 메시지 큐를 사용하면 API는 Kafka에 메시지를 넣고 25ms 내외로 바로 응답할 수 있다. 덕분에 사용자 입장에선 처리 시간이 느리다는 걸 전혀 체감하지 못한다.
그리고 Consumer 서버의 로그를 보면 API 요청을 보내고 나서 3초 뒤에 ‘이메일 발송 완료’라는 로그가 찍히는 걸 확인할 수 있다.
Kafka의 비동기 처리 덕분에 사용자 입장에서는 빠르게 응답을 받아볼 수 있었다. 이로써 사용자가 서비스를 활용함에 있어서 불편함을 겪는 걸 방지할 수 있다.
✅ 비동기로 처리하면 Consumer가 제대로 작업을 처리했는 지 어떻게 확신할 수 있을까?
기존에 REST API 방식을 활용해 동기적으로 처리할 때는 이메일 발송 처리 작업이 끝날 때까지 기다렸다가 응답을 한다. 그러다보니 비교적 응답 속도가 느릴 수 밖에 없다. 그리고 이메일 발송 처리 작업이 끝난 뒤에 응답을 하기 때문에, 이메일 발송의 성공 여부를 확인하고 그에 맞게 응답을 할 수 있다.
Kafka와 같은 메시지 큐를 활용한 비동기 처리는 사용자에게 빠르게 응답을 줄 수 있다는 큰 장점이 있다. 실제로 이메일 발송처럼 시간이 오래 걸리는 작업도 Kafka에 메시지만 넣고 바로 응답할 수 있기 때문에, 사용자 입장에서는 기다림 없이 빠르게 처리가 된 것처럼 느껴진다. 하지만 이 구조는 한 가지 중요한 한계를 가지고 있다.
바로 사용자에게 작업의 실제 성공 여부를 확인하지 않고 응답을 먼저 보내버린다는 점이다. 예를 들어, 이메일 발송 요청을 Kafka에 메시지로 넣고 25ms 만에 성공 응답을 보냈지만, 이후 Consumer 쪽에서 잘못된 이메일 주소로 인해 이메일 발송 도중 실패가 발생할 수 있다. 이 때는 이미 사용자에게 성공 응답을 보낸 상태이기 때문에 실패를 다시 사용자에게 알려줄 방법이 없다.
이러한 비동기 구조의 단점을 보완하기 위해 시스템에서는 다양한 보완 전략을 사용한다. 대표적으로는 메시지 처리 중 실패가 발생했을 때 자동으로 재시도(retry)하는 방식, 여러 번의 재시도 끝에도 실패한 메시지를 별도로 보관하는 Dead Letter Topic(DLT)을 활용하는 방식을 주로 활용한다.
👨🏻🏫
다음 강의에서는 실패한 메시지를 재시도(retry) 하는 방법과 Dead Letter Topic(DLT)를 활용하는 방법에 대해 배워보자.