동기 통신은 응답이 도착할 때까지 호출자를 블로킹하고, 비동기 통신은 메시지를 보내고 기다리지 않고 계속 진행합니다. 각각은 결합도, 지연 시간, 복원력에서 서로 다른 트레이드오프를 만듭니다.
| 측면 | 동기(REST/gRPC) | 비동기(메시징) |
|---|
| 호출자가 기다리나? | 예 | 아니오 |
| 시간적 결합 | 강함 | 느슨함 |
| 장애에 대한 복원력 | 낮음 | 높음(브로커가 버퍼링) |
| 일관성 | 즉시 | eventual |
| 복잡성 | 낮음 | 높음 |
| 디버깅 용이성 | 쉬움(선형) | 어려움(흐름) |
SYNC: Caller ──request──▶ Service
Caller ◀─response── Service (그동안 내내 블로킹됨)
ASYNC: Caller ──message──▶ [ Queue ] ──▶ Service
Caller는 즉시 계속 진행; Service는 나중에 처리
비동기는 장애를 숨깁니다. 누락되거나 처리 불가능한(poison) 메시지가 조용히 워크플로를 망가뜨릴 수 있습니다. dead-letter queue와 모니터링이 필요합니다.
이 선택은 장애가 어떻게 전파되는지를 직접 제어합니다. 동기 호출은 빠르고 눈에 띄게 실패하고, 비동기 메시지는 분리하되 문제를 소비자에게 미룹니다.
둘을 잘 섞는 것 — 엣지에서는 동기, 워크플로에는 비동기 — 은 복원력 있는 마이크로서비스를 구축하는 핵심 기술입니다.