마이크로 서비스 패턴
분해 패턴
모놀리식 비즈니스 구조를 어떤 판단 기준에 따라 서비스를 분리할 것인지에 대한 패턴을 설명합니다.
비즈니스 능력에 따른 분해 (Business Ability)
복잡한 비즈니스 능력을 기준으로 서비스를 분해
- ex) 송급 서비스, 주문 서비스 ...
송금 서비스를 예로 들면 유효한 유저인지 확인해야할 것이고, 충분한 계좌 잔액이 있는지 확인해야할 것이고 등등의 동작을 합니다. 이런 동작을 기준으로 서비스를 분리한 것을 비즈니스 능력에 따른 분해라고 합니다.
하위 도메인 패턴별 분해 (Sub-Domain) from DDD
복잡한 비즈니스일지라도, 포함된 내부의 하위 도메인을 단위로 분리
- ex) 계좌 도메인, 내부 머니 도메인, 뱅킹 ...
통신 패턴
- Sync Pattern
어떤 서비스가 다른 서비스로 특정 Request 이후, 그 Response를 받을 때까지 멈춰있는 경우를 말합니다.
예를 들자면 HTTP(Restful)
, gRPC
방식이 있습니다.
- Async Pattern
어떤 서비스가 다른 서비스로 특정 Request 이후, 그 Response 를 당장은 받지 않아도 되는 경우를 말합니다.
예를 들자면 Kafka
등을 이용한 Message Queueing
, Callback
, Polling
등등이 이에 해당할 수 있습니다.
트랜잭션 패턴
- 2PC (2Phase Commit)
"트랜잭션의 완료"를 2(N) 단계에 거쳐서 결정하는 패턴을 말합니다.
Cordinator가 계좌 확인 서비스에서 트랜잭션이 실패했는지 성공했는지에 대한 보장을 할 수 없습니다. 이런 경우 송금 서비스에서 장애가 발생하게 됩니다.
- Compensating Transactions (보상 트랜잭션)
특정 요청과 그 요청에 대해 정상적이고 완전히 종료된 "행동"(트랜잭션)을 그 이전 상태로 되돌리기 위한 "행동"(트랜잭션)을 말합니다.
송금 서비스에서 먼저 commit을 합니다. 계좌 확인 서비스에서 결론적으로 실패가 났다면, 계좌 확인 서비스가 송금 서비스에 보상 트랜잭션을 전송하여 롤백을 하게 됩니다.
하지만 계좌 확인 서비스가 보낸 보상 트랜잭션을 송금 서비스가 받지 못할 확률도 존재하기 때문에 이를 구현하기가 굉장히 어렵다고 할 수 있다.
- Saga Pattern (사가 패턴)
트랜잭션의 선, 후 관계를 사전에 정의하고 필요와 경우에 따라 Cordinator 가 보상 트랜잭션을 이용, 관리하여 분산 시스템 환경에서 트랜잭션을 구현하기 위한 패턴을 말합니다.
송금 서비스가 동작을 시작할 때 SAGA를 하나 발행합니다. 만약 계좌 확인 서비스에서 문제가 발생했다면 이를 Cordinator에 알려주게 됩니다. 그러면 SAGA는 이미 보상 트랜잭션에 대한 정보를 들고 있으므로 송금 서비스에 보상 트랜잭션을 알려주게 됩니다.
만약 계좌 확인 서비스가 일정 시간동안 제대로 동작하지 않으면 SAGA는 송금 서비스에 보상 트랜잭션을 보내게 됩니다.