마이크로서비스 협력 방식에는 코레오그래피(Choreography)와 오케스트레이션(Orchestration)의 두 가지 접근법이 있다. 각각 분산 제어와 중앙 제어 방식을 대표한다.
코레오그래피
서비스들이 이벤트를 통해 자율적으로 협력
중앙 조정자 없음
OrderService ──"OrderCreated"──▶ PaymentService
PaymentService ──"PaymentDone"──▶ InventoryService
InventoryService ──"StockReserved"──▶ ShipmentService
장점: 결합도 낮음, 각 서비스 독립적
단점: 전체 흐름 파악 어려움, 디버깅 복잡
오케스트레이션
중앙 오케스트레이터가 각 서비스를 직접 호출
전체 흐름을 한 곳에서 관리
Saga Orchestrator:
1. OrderService.createOrder()
2. PaymentService.processPayment()
3. InventoryService.reserveStock()
4. ShipmentService.scheduleDelivery()
장점: 흐름 가시성, 중앙 에러 처리
단점: 오케스트레이터 결합도, 단일 실패점
코드 비교
typescript
// 코레오그래피 (이벤트 기반)
// PaymentService
kafkaConsumer.on('OrderCreated', async (event) => {
await processPayment(event.orderId);
await kafkaProducer.publish('PaymentDone', { orderId: event.orderId });
});
// 오케스트레이션 (사가 패턴)
class OrderSaga {
async execute(orderId: string) {
try {
await paymentService.processPayment(orderId);
await inventoryService.reserve(orderId);
await shipmentService.schedule(orderId);
} catch (error) {
// 보상 트랜잭션
await this.compensate(orderId, error.step);
}
}
async compensate(orderId: string, failedStep: string) {
if (failedStep === 'inventory') {
await paymentService.refund(orderId);
}
}
}
비교표
| 항목 | 코레오그래피 | 오케스트레이션 |
|---|
| 결합도 | 낮음 | 높음 |
| 가시성 | 낮음 | 높음 |
| 복잡도 | 분산됨 | 중앙 집중 |
| 테스트 | 어려움 | 쉬움 |
| 적합 | 단순 이벤트 흐름 | 복잡한 비즈니스 프로세스 |
관련 개념