SpringBoot

주문/결제, 동기/비동기 처리에 대한 고민

코카멍멍 2024. 6. 2. 21:58
반응형

주문/결제, 동기/비동기 처리에 대한 고민

저희는 충전 API와 결제 API가 분리되어 있어 주문 -> 결제 로직이 실행될 때는 토스 외부 API에 영향을 받지 않습니다. 그렇기 때문에 주문이 발생함과 동시에 결제도 같이 처리될 수 있었습니다.


그래서 저희는 3가지 방식을 생각했습니다.

  • 첫번째 주문 API에서 모든 로직을 동기로 처리하는 것 입니다. (동기)
  • 두번째 는 주문 API와 결제 API를 분리하는 것 입니다. (동기)
  • 세번째 는 주문 API에서 결제 API까지 처리하는 것 입니다. (부분 비동기)

 

첫번째는 주문 API에서 모든 로직을 동기로 처리하는 것 입니다. (동기)

시퀸스 다이어그램을 보시면 Order MSA에서 모든 로직이 수행되며 다른 MSA를 호출하여 로직이 수행됩니다.

한번에 모든 MSA에게 요청과 응답을 받아야 하며 모든 로직을 동기적으로 처리하기 때문에 데이터의 정합성이 우수합니다. 하지만 결제 요청이 성공했지만 재고 감소 요청에서 실패했을 때 결제 요청 취소와 같은 롤백 API가 추가적으로 필요합니다.

두번째는 주문 API와 결제 API를 분리하는 것 입니다. (동기)

클라이언트가 주문하기를 선택하고 결제하기를 선택하는 2번의 API를 발생시키는 로직입니다.

주문하기를 눌렀을 때 주문하기에 관한 릴레이션이 생성되며 결제 중에 실패한다고 해서 주문 릴레이션이 사라지지 않습니다. 주문 요청과 결제 요청 사이의 시간이 길어지면 다수의 사용자가 결제 요청을 진행하고 이 때 재고 감소에서 실패가 발생할 수 있어 사용자의 만족도가 안좋아질 수 있습니다.


세번째는 주문 API에서 결제 API까지 처리하는 것 입니다. (부분 비동기)

주문하기를 했을 때 Feign을 통해 결제로직까지 동기적으로 처리하고 결과를 반환 재고차감과 같은 로직은 Event로 처리합니다.

 

선택 방식

저희는 여기서 결제와 같이 반드시 처리해야 하는 로직들은 동기 처리의 필요성을 느꼈고 추후에 추가 입고와 같이 업체에서 처리할 수 있는 것을 비동기 처리함으로써 주문 결제는 동기 처리 그리고 재고 감소와 같은 부수적인 로직을 비동기를 선택했습니다

반응형

'SpringBoot' 카테고리의 다른 글

[SpringBoot] In-Memory 환경 Memory Leak  (0) 2024.06.20
BeanPay Detail 삭제 이유  (0) 2024.06.03
락 선택 이유와 성능 테스트  (0) 2024.04.30
코리아노 BeanPay 고민  (0) 2024.04.17
[SpringBoot] Spring Batch 이용권 만료  (0) 2023.12.17