skarltjr / Memory_Write_Record

나의 모든 학습 기록
0 stars 0 forks source link

비동기 연동으로 서버 성능 올리는 방법 조금 알아보기 #120

Open skarltjr opened 2 years ago

skarltjr commented 2 years ago

외부 서비스를 사용할 때 네트워크가 느려진다거나 외부 서비스의 처리시간이 길어지면 이는 곧 우리 서비스의 응답시간이 길어질 수 있다.


### 예시를 통해 알아보자
- <img width="1067" alt="스크린샷 2022-07-27 오전 10 28 19" src="https://user-images.githubusercontent.com/62214428/181140563-7ac250f5-7c87-49c0-86ca-6d1dbf3d8040.png">

TPS : 초당 응답처리량

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가지

1. 별도 스레드를 할당하여 비동기로 처리하는 방식

실제로 이메일 전송을 해당 방법으로 처리한적이 있는데
고민해야할 부분을 분명히 알고가자

- 트랜잭션처리
- 서버 재시작시 작업 유실
- 스레드풀의 크기
- 외부 연동 실패시 재처리

따라서 해당 방식은 재처리 필요성이 낮은 외부 연동에 적합
- 해당 측면에서 메일 발송에서의 별도 스레드 할당 비동기 방식은 적합

2. db를 사용한 비동기 처리 방식

일단 연동 데이터를 db에 저장
별도 스레드/프로세스가 db 조회 후 해당 데이터 처리

- db트랜잭션 처리 쉬움
- 외부 연동 실패시 재처리 쉬움

⭐️누락이 없어야 할 연동에 적합
- 로그인 포인트 적립

그러나 내 생각으론 단점도 분명히 있을거라고 생각
- db에 접근하는 회수가 많아지고 이게 곧 부하로 연결될 수 있다고 생각

3. 메시징 시스템 이용

연동 데이터를 메시징 시스템에 저장
별도 스레드/프로세스가 연동처리
  - 메시지 시스템에서 데이터를 가져와서 처리

대량 데이터 처리에 이점
외부 연동 실패시 재처리 용이
데이터 유실 가능성 고려
skarltjr commented 2 years ago

그러니까

재처리 / 트랜잭션에 대한 제약이 적은. 즉 영향력이 크지 않은 작업에 대해선 별도 스레드로 비동기 처리하는 방법이 적합

그러나 연동/성능/유실에 대한 조건이 까다롭다면 db + 메시징 조합을 고려하라