Published on

커피밋 비동기 레츠 고

Authors
  • avatar
    Name
    박상민
    Twitter

해당 게시물은 커피밋에서 비동기 처리를 진행한 내용입니다.

비동기 처리를 고민한 이유

커피밋은 “회사기반 랜덤 채팅 네트워킹 서비스”입니다. 따라서 회사 메일 인증을 해야합니다.

이 회사 메일을 외부 시스템(Gmail)을 이용하여 동기적으로 서비스 중 입니다.

현재 응답까지 4.85s의 시간이 소요됩니다. 사용자들이 메일 전송을 눌렀을 때 약 5초 동안 대기해야 한다면 이건 곧 좋지 않은 사용자 경험으로 이어질 것 입니다.

일반적으로 인증을 진행할 때 그렇게 기다린 적이 없었을텐데 5초나 기다린다면 버그로 인식할 수도 있을거라 예상됩니다.

응답시간.png

제가 경험한 이메일 인증은 전송을 누르면 기다리는 시간이 없이 바로 메일이 전송되었다는 창이 떴습니다. 다만 메일을 바로 확인했을 때, 오지않는 경우는 꽤 있었습니다.

다른 일반적인 서비스들은 해당 기능을 어떻게 구현했을까요? 메일이 바로 오지않은 걸 보면 아마 대부분 비동기로 처리했을거라고 예상됩니다. 아니라면 프론트 측에서 낙관적 업데이트?

꼭 동기여야 하나요?

제가 생각하는 동기와 비동기가 필요한 경우 실행 순서(작업을 실행할 때 꼭 필요한 선행작업이 있는지)와 즉시 해야 되는지에 따라 나눌 수 있다고 생각합니다.

메일이 꼭 즉시 보내져야만 할까요? 아닌 것 같습니다. 회원 가입을 하던 사용자 다시 메일을 확인하는데 시간 소요가 있을 것이고 어느정도 늦어져도 괜찮다 생각합니다.

비동기로 얻을 수 있는 장점

외부 시스템으로 인해 저희 어플리케이션의 성능이 결정되지 않게 할 수 있습니다.

현재 사용자가 응답을 받기까지 약 4.85s가 걸리는데 저희 서버의 로직만 처리하는데는 약 418ms가 걸립니다. 무려 4.43s가 외부 시스템에 의해서 소요되는 시간입니다.

한 예를 들어 서버 TPS를 계산해보겠습니다. 서버의 쓰레드 풀이 10개이고 평균 응답시간이 0.2초, 외부 시버스 연동에 필요한 시간은 0.1초라고 한다면 50 TPS 입니다. 만약 여기서 외부 서비스 연동에 소요되는 시간이 0.4초로 증가하게 된다면 총 평균 응답시간은 0.5초로 늘어나게 되고 20 TPS로 줄어들게 됩니다.

비동기 처리 방법

  • 쓰레드 생성
  • 메세지 큐, 메세지 브로커 사용하여 외부 모듈에서 처리
  • DB 저장 후 스케쥴러나 외부 모듈에서 처리

비동기를 처리하는 대표적인 방법들 입니다.

일단 저희는 쓰레드를 생성하는 방법으로 처리하기로 정했습니다. 이유는 메세지 큐, 브로커를 이용하는 방법은 현재 저희에게 너무 높은 커닝커브가 예상됩니다. 또, DB 저장 후 스케쥴러나 외부 모듈에서 처리하는 방법은 처리속도가 조금 느릴 것으로 예상했고 가장 간단한 방법인 쓰레드를 생성하는 방법으로 결정했습니다.

쓰레드 생성하여 비동기 처리 시 고려해야 할 점

  • 비동기를 위한 쓰레드 풀 설정
  • 비동기 작업 예외 발생 시 에러 핸들링
  • 트랜잭션 사이에 있는 외부 시스템 연동

변경 될 수 있지만 현재 커피밋에서 제가 생각하는 비동기 처리가 필요한 부분은 Email 전송, Push 알림 전송, 채팅방 백업 정도 생각됩니다. 앞으로 위 작업들을 비동기 처리하기 위해 고려한 점들에 대해 포스팅 할 예정입니다.

| ref: 초식 - 비동기 외부 연동으로 서버 성능 올리기