동기 통신은 응답이 도착할 때까지 호출자를 블로킹하고, 비동기 통신은 메시지를 보내고 기다리지 않고 계속 진행합니다. 각각은 결합도, 지연 시간, 복원력에서 서로 다른 트레이드오프를 만듭니다.
비교
시각화
text
SYNC: Caller ──request──▶ Service
Caller ◀─response── Service (그동안 내내 블로킹됨)
ASYNC: Caller ──message──▶ [ Queue ] ──▶ Service
Caller는 즉시 계속 진행; Service는 나중에 처리
경험 법칙
- 사용자가 지금 답을 필요로 할 때(예: 프로필 로드)는 동기를 사용.
- 백그라운드 작업, 팬아웃, 다운스트림 장애 생존(예: 확인 이메일 발송)에는 비동기를 사용.
함정
비동기는 장애를 숨깁니다. 누락되거나 처리 불가능한(poison) 메시지가 조용히 워크플로를 망가뜨릴 수 있습니다. dead-letter queue와 모니터링이 필요합니다.
왜 중요한가
이 선택은 장애가 어떻게 전파되는지를 직접 제어합니다. 동기 호출은 빠르고 눈에 띄게 실패하고, 비동기 메시지는 분리하되 문제를 소비자에게 미룹니다.
둘을 잘 섞는 것 — 엣지에서는 동기, 워크플로에는 비동기 — 은 복원력 있는 마이크로서비스를 구축하는 핵심 기술입니다.
