5개의 스레드풀 / 평균 응답시간 0.2초
-> 1초에 25개의 요청처리
-> 25 TPS
만약 외부 연동이 0.9초로 증가하면
각 스레드의 평균 응답시간이 1초로 증가하는것이고
이는 곧 스레드풀 5개일 때 5개의 각 스레드가 1초에 1개씩
즉 초당 5개의 요청만 처리가 가능해짐
5 TPS
### 판단해보기
- 꼭 외부서비스를 즉시 연동해야하는가?
주문 혹은 주문 취소시 푸쉬 발송
이 때 푸쉬 발송이 외부 API호출이라고해보자
반드시 주문 취소와 함께 푸쉬 전송이 필요한가?
주문 취소 후 수 초이내에 별도로 동작해도 괜찮지않을까?
- <img width="995" alt="스크린샷 2022-07-27 오전 10 39 36" src="https://user-images.githubusercontent.com/62214428/181141860-d85e9c39-5cdc-47fb-8222-d586e9072861.png">
### 비동기 처리 방식 3가지
별도의 스레드 할당
연동 데이터를 db에 저장 후 별도 스레드/프로세스로 처리
⭐️연동 데이터를 메시징 시스템에 저장 후 별도 스레드/프로세스에서 처리
1. 별도 스레드를 할당하여 비동기로 처리하는 방식
실제로 이메일 전송을 해당 방법으로 처리한적이 있는데
고민해야할 부분을 분명히 알고가자
- 트랜잭션처리
- 서버 재시작시 작업 유실
- 스레드풀의 크기
- 외부 연동 실패시 재처리
따라서 해당 방식은 재처리 필요성이 낮은 외부 연동에 적합
- 해당 측면에서 메일 발송에서의 별도 스레드 할당 비동기 방식은 적합
2. db를 사용한 비동기 처리 방식
일단 연동 데이터를 db에 저장
별도 스레드/프로세스가 db 조회 후 해당 데이터 처리
- db트랜잭션 처리 쉬움
- 외부 연동 실패시 재처리 쉬움
⭐️누락이 없어야 할 연동에 적합
- 로그인 포인트 적립
그러나 내 생각으론 단점도 분명히 있을거라고 생각
- db에 접근하는 회수가 많아지고 이게 곧 부하로 연결될 수 있다고 생각
3. 메시징 시스템 이용
연동 데이터를 메시징 시스템에 저장
별도 스레드/프로세스가 연동처리
- 메시지 시스템에서 데이터를 가져와서 처리
대량 데이터 처리에 이점
외부 연동 실패시 재처리 용이
데이터 유실 가능성 고려
외부 서비스를 사용할 때 네트워크가 느려진다거나 외부 서비스의 처리시간이 길어지면 이는 곧 우리 서비스의 응답시간이 길어질 수 있다.
TPS : 초당 응답처리량
5개의 스레드풀 / 평균 응답시간 0.2초 -> 1초에 25개의 요청처리 -> 25 TPS
만약 외부 연동이 0.9초로 증가하면 각 스레드의 평균 응답시간이 1초로 증가하는것이고 이는 곧 스레드풀 5개일 때 5개의 각 스레드가 1초에 1개씩
즉 초당 5개의 요청만 처리가 가능해짐 5 TPS
주문 혹은 주문 취소시 푸쉬 발송 이 때 푸쉬 발송이 외부 API호출이라고해보자
반드시 주문 취소와 함께 푸쉬 전송이 필요한가? 주문 취소 후 수 초이내에 별도로 동작해도 괜찮지않을까?
1. 별도 스레드를 할당하여 비동기로 처리하는 방식
2. db를 사용한 비동기 처리 방식
3. 메시징 시스템 이용