SpringBoot에서 kafka를 통해 슬랙에 에러 알림을 보내보자
📌 서론
이번 포스트를 읽기 전 2가지 사항을 모두 완료했는지 확인해 보자
1. Kafka 세팅
2. 슬랙 webhook 세팅
이번 포스트에서는 아래와 같은 작업을 하는 코드를 알아볼 것이다.
1. 예외가 발생하면 SpringBoot에서 kafka로 메시지를 produce 한다. (이전 포스트에서 확인가능)
2. SpringBoot내부에 작성한 kafkaListener코드를 통해 이 예외 메시지를 consume 한다.
3. kafkaListener에서는 slack의 webhook url로 메시지를 보내서 알림이 울리도록 한다.
1. 먼저 SpringBoot에 kafka를 연동하자
2. 다음으로 슬랙의 webhook을 세팅하자
1. SpringBoot에 KafkaListener 코드를 작성하자
카프카 리스너 코드 작성하기
- kafka에 메시지 발행은 중앙 집중 예외처리를 하는 클래스에서 처리한다.
- 메시지를 produce 했으면 consume 하는 코드도 필요한데 같은 프로젝트 내부에 발행된 kafka 메시지를 consume 하는 KafkaListener 메서드를 작성했다. (slack을 바로 consumer로 설정할 수는 없다.)
리스너가 호출하는 SlackNotificationService 코드를 보자
- 이전 포스트에서 slack의 webhook url을 발급받았다.
- 나는 application.yml에 webhook url을 적어줬고 코드에서 @Value를 통해 yml에 접근하여 사용하도록 했다.
이렇게 코드를 작성한 후 스프링부트를 실행했는데 오류가 발생했다.
이건 yml에 kafka 설정을 잘못해서 그런 것인데 아래의 포스트를 통해 확인해 보자
만약 첫 번째 SpringBoot 세팅부터 따라왔다면 꼭 아래 글을 통해 consumer 연결 문제를 해결하고 진행하자
2. postman을 통해 예외를 던져보자
예외를 발생시키는 코드는 아래와 같다.
스프링을 실행한 후 postman을 통해 아래와 같이 예외를 던졌다.
slack에 아래와 같이 예외가 발생했다고 알림이 바로 왔다. (성공)
3. 에러 발생 시 동작 이해하기
1. 에러 발생
- 클라이언트가 "/getRecipeDetail" 엔드포인트에 요청을 보내면, getRecipeDetailView 메서드가 호출되고, 여기서 IllegalArgumentException이 바로 발생한다. 이 단계는 동기적으로 처리된다.
2. 예외 처리
- 발생한 IllegalArgumentException은 스프링의 예외 처리 메커니즘에 의해 GlobalControllerAdvice 클래스로 전달된다. 여기서 handleIllegalArgumentException 메서드가 이 예외를 처리하게 된다. 이 처리도 요청 처리 흐름 내에서 동기적으로 이루어진다.
3. 메시지 발행
- handleIllegalArgumentException 메서드 내에서 buildKafkaErrorResponse 메서드가 호출되고, 여기서 Kafka의 error-messages 토픽으로 에러 메시지가 발행된다. Kafka로 메시지를 보내는 작업 자체는 동기적으로 실행되지만, 메시지가 Kafka에 전달되고 나면 이후의 처리는 비동기적으로 진행된다.
4. 메시지 소비
- Kafka에 발행된 메시지는 KafkaSlackListener 클래스의 listen 메서드에 의해 비동기적으로 소비된다. Kafka 리스너는 별도의 스레드에서 실행되기 때문에, 이 메서드는 Kafka에서 새 메시지가 도착할 때마다 독립적으로 호출된다.
5. Slack 알림 전송
- listen 메서드 내에서 slackNotificationService.sendMessageToSlack 메서드가 호출되어, 실제로 Slack에 메시지를 전송한다. 이 작업은 listen 메서드가 실행되는 스레드 내에서 동기적으로 이루어지지만, 전체 프로세스의 관점에서 보면 Kafka 메시지 소비 과정의 일부로 비동기적으로 처리된다.
요약하자면, 클라이언트 요청으로부터 예외 처리까지는 동기적으로 진행되고, Kafka를 통한 메시지 발행 후의 로깅 및 알림 처리 과정은 비동기적으로 처리된다. Kafka 리스너는 별도의 스레드(또는 스레드 풀)에서 실행되기 때문에, 이 부분에서 비동기 처리의 이점을 활용할 수 있다.
이렇게 kafka와 Spring을 연동하고 slack을 통해 예외가 발생하면 바로바로 알림이 오도록 했다.
지금까지는 예외가 발생하면 직접 확인하면서 오류를 해결했는데 앞으로는 긴급한 상황이 발생했을 때 알림을 통해 바로바로 확인이 가능하므로 이전보다 훨씬 빠르게 문제해결이 가능할 것이다.
조금 운영해 본 다음 후기글로 찾아오도록 하겠다.
사이드 팀원 "평양냉면"님의 블로그도 방문해 주세요! 좋은 글이 많습니다.
'Apache Kafka' 카테고리의 다른 글
[kafka] Docker로 카프카 실행하기 (KRaft 모드) (7) | 2024.08.25 |
---|---|
[kafka] Spring실행 시 consumer 연결문제 해결 (8) | 2024.02.18 |
[Kafka] 슬랙 webhook 설정하기 (kafka에서 호출) (0) | 2024.02.18 |
[Kafka] SpringBoot3.x.x에서 Kafka 연동하기 (2) | 2024.02.18 |
[Kafka] Docker로 Kafka 세팅하기 (Kraft 방식, M1 Mac) (2) | 2024.02.17 |