온라인 쇼핑몰에서 상품을 구매하는 프로세스를 알아볼까요? 우리가 생각하는 일반적인 프로세스는 다음과 같을 겁니다.

1. 카트에 상품을 담는다. 결제 페이지로 이동한다.

2. 결제 시스템과 연동하여 카드 결제가 완료되면 주문 내역을 DB에 저장한다.

3. 만약 결제에 실패하면 결제 실패 사유를 보여준다.

4. 주문 내역 페이지에서 구매 내역과 영수증을 출력할 수 있다.

 

아마존도 이러한 결제 프로세스를 Synchronous하게 진행할까요? 아마존은 결제 프로세스를 이런 순차적인 방식으로 진행하지 않습니다. 많은 프로세스들이 비동기로 돌아갑니다.

우선 우리가 생각할 수 있는 도메인 영역은 상품, 주문, 그리고 결제 도메인입니다. 이렇게 도메인 컨텍스트가 구성되어 있다면 각자의 도메인을 마이크로 서비스 형태로 운영을 합니다. 자, 그럼 결제 프로세스가 어떻게 진행되는지 알아보도록 하죠.

1. 카트에 상품을 담는다. 결제 페이지로 이동한다. (여기까지는 동일합니다.)

2. 결제 정보를 입력하고 Pay를하면 주문 내역을 DB에 저장합니다. 결제 프로세스가 여기서 진행되지 않습니다. 대신 DB에 저장이 성공적이면 OrderPlaced라는 이벤트를 발생시킵니다. 이 이벤트는 Asynchronous하게 결제 마이크로 서비스로 전송됩니다.

3. 결제가 Async이므로 카드 승인 여부를 떠나 주문 내역 페이지로 이동하여 주문 내역을 보여줍니다. 이때까지는 결제가 성공인지 실패인지 알 수 가 없습니다.

4. 결제 마이크로 시스템에서 이벤트를 받아 해당 주문에 대한 결제 프로세스를 진행합니다. 만약 결제가 성공적이면 사용자에게 영수증(Invoice)를 발송합니다. 만약 카드 번호가 틀리거나 에러가 발생하면 사용자에게 결제가 실패했다는 이메일을 보내고, PaymentFailed 이벤트를 생성합니다. 주문 마이크로 서비스에서 해당 주문이 실패한 것으로 상태를 바꿉니다.

프로세스를 이렇게 Async로 돌아가게 함으로써 사이트에 접속한 사용자는 상당히 빠른 Response를 받을 수 있고 쾌적하게 쇼핑을 할 수 있게 되는 것이죠. Synchronous 프로그래밍에 익숙한 개발자라면 상당히 신선한 프로세스 아닌가요?

제가 일하는 회사도 많은 프로세스들이 Async하게 돌아가서 많은 데이터를 한꺼번에 처리함에도 불구하고 상당히 빠른 응답속도를 자랑합니다. 이러한 Async 프로세스를 위해 이전 블로그에서 말씀 드린 것처럼 REST 또는 Message를 사용하게 됩니다.

해피 코딩하세요.

 

 

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기