브로셔 제출
발표 스크립트 작성
트러블 슈팅
Kafka 에러 핸들러와 서킷 브레이커 충돌
문제상황
서킷 브레이커를 도입하는 과정에서 카프카의 에러 핸들러가 예외를 먼저 처리하여, 서킷 브레이커까지 예외가 도달하지 않아 정상적으로 작동하지 못하는 문제가 발생했습니다.
원인분석
카프카 리스너는 기본적으로 DefaultErrorHandler
를 통해 예외를 처리합니다. 이 과정에서 메시지를 다시 리스너로 재전송하거나 재시도, 백오프 등의 로직을 수행합니다. 그러나 이러한 처리가 메서드 호출 완료 시점 이전에 이루어지기 때문에, AOP 방식의 서킷 브레이커는 예외를 감지하지 못 합니다.
해결방법
AOP 방식이 아닌 서킷브레이커 객체를 직접 운용하는 방법을 선택했습니다. 일단 안정적으로 절차를 진행하기 위해 서킷의 상태가 전환될때 카프카 리스너 컨테이너를 일시적으로 정지시켰습니다. 그리고나서 서킷브레이커 레지스트리에서 객체를 가져와 executeRunnable
메소드의 실행 블록 안에서 슬랙 메시지 발송 메서드를 호출했습니다. 이때 try-catch로 감싸 통신 에러가 발생시 상태 전환과 함께 이메일 대체 알림 발송이 가능하도록 Fallback처리도 직접 구현했습니다. 이러한 모든 과정이 정상적으로 완료되면 Kafka 브로커에게 메시지가 완료 되었음을 알리기 위해Acknowledgment.acknowledge()
를 호출하여 수동으로 오프셋을 커밋 했습니다.
OpenFeign이 지원하지 않는 인코딩 규칙
문제상황
Slack에서 제공하는 API를 사용해 슬랙 이메일로 슬랙 ID를 조회하려했지만, 요청시 invalid_auth 라는 에러를 응답했습니다. 희안하게도 IntelliJ에서 .http
테스트에서는 성공했지만 OpenFeign을 사용한 HTTP 요청에서는 실패했습니다.
원인분석
Slack에서 제공 API는 application/x-www-form-urlencoded
으로 데이터를 요구했지만, FeignClient는 기본적으로 제공하지 않는 콘텐츠 타입이였습니다.
해결방법
Spring Form Encoder를 Bean으로 등록해 FeignClient에 설정해주었고, DTO를 지원하지 않기때문에 Map<String, String>
타입으로 데이터를 응답받도록 하여 해결했습니다.
주요기능 작성
- 다양한 방식의 알림 발송 지원
- 템플릿 기반 알림 메시지 생성
- 알림 히스토리 및 데이터 검색 기능
- 알림 발송 프로세스의 통합 설계