Slack 챗봇을 연동해 서버 장애 모니터링하기 (비동기 성능 비교 포함!)

이동엽·2023년 6월 17일
3

spring

목록 보기
6/21

프론트엔드 서버와 백엔드 서버와의 연동 과정에서 프론트 서버에서 요청을 보냈지만,
백엔드 서버의 비즈니스 로직 실행 중에 예외가 발생하는 경우가 있다.


이때, 프론트엔드 담당은 어떤 예외가 발생했는지 , 프론트엔드-백엔드 중 어디 잘못인지등을 파악할 필요가 있다.

→ 프로젝트에 Slack 챗봇을 연동하여, 백엔드 서버에서 예외 발생시 모니터링 할 수 있도록 하면 어떨까?



슬랙 챗봇 연동 소스코드는 링크를 통해 볼 수 있다.

💡 생각해보면 슬랙 메시지 송신 기능은 이메일 송신 기능과 같이 작업 시간이 오래 걸리는 작업이다.
이 기능에도 비동기로 동작할 수 있도록 Executor를 지정하는 건 어떨까?


이전에 이메일 송신 기능을 비동기로 동작하도록 하기 위해 CompletableFuture를 도입한 경험을 바탕으로, 성능 비교를 위해 작성한 코드들은 아래와 같다.

  1. 첫번째 테스트 케이스 :
    단순히 슬랙 메시지 송신 기능을 호출한다.

  2. 두번째 테스트 케이스 :
    execute() 메서드를 이용해 주어진 작업을 비동기적으로 실행한다.

  3. 세번째 테스트 케이스 :
    Completable.get() 메서드를 이용해 비동기 작업을 조합하여 실행

  4. 네번째 테스트 케이스
    Completable.get() 메서드를 이용해 비동기 작업을 조합하여 실행



이제 성능 비교를 해보자!

우선, 프로젝트 아보카도에서는 슬랙 메시지를 예외 발생 시에만 사용한다.
따라서 한번에 많은 접근이 올거라고는 생각이 들지 않아서 테스트 상황은 아래와 같이 결정했다.

  • Number of Threads (users) : 10
  • Ramp-up period (seconds) : 1
  • Loop Count : 1


성능 비교 결과

  1. 단순 호출 성능 :
    1. Average : 470ms, Error : 0.00%, Throughput : 8.5/sec
  2. execute() 메서드를 이용해 비동기 호출 :
    1. Average : 2ms, Error : 0.00%, Throughput : 29.4/sec
  3. Completable.get() 메서드를 이용해 비동기 호출 :
    1. Average : 373ms, Error : 0.00%, Throughput : 12.5/sec
  4. Completable.join() 메서드를 이용해 비동기 호출 :
    1. Average : 311ms, Error : 0.00%, Throughput : 12.4/sec

💡 결과를 보면 execute() 메서드를 이용해 호출하는 방식이 성능이 압도적으로 좋다.


Why?

execute() 메서드는 작업을 제출하고 즉시 반환이 된다.
→ 따라서 작업이 완료되었는지 여부를 확인하거나 결과를 얻을 수는 없다.

반면에 CompletableFuture.get()과 CompletableFuture.join()은 작업이 완료될 때까지 기다린다. 이 덕분에 작업의 결과를 다른 CompletableFuture에게 전달하는 등의 작업을 연결할 수 있는 것이다.


여기서 생긴 고민!

Slack 메시지로 예외 발생 현황을 알리는 기능에 완료 여부를 판단하거나 작업 결과를 얻어야 할까?
반대로 반드시 완료 여부를 판단하거나 작업 결과를 얻어야 하는 작업은 무엇이 있을까?*

조금 더 생각해봐야겠지만, 우선은 성능을 무시할 순 없기 때문에 execute 메서드를 사용하기로 한다.

profile
백엔드 개발자로 등 따숩고 배 부르게 되는 그 날까지

0개의 댓글