시스템에서 구성 요소(서비스, 클라이언트)는 API와 다양한 프로토콜 — 동기(REST, gRPC)와 비동기(메시징/큐) — 를 통해 통신합니다. 구성 요소들이 어떻게 통신하는지 이해하는 것은 여러 부분으로 이루어진 시스템을 설계하는 데 근본적입니다.
동기 통신 (요청/응답)
호출자가 응답을 기다림 (블로킹):
REST (HTTP) → 가장 흔함; HTTP(JSON)로 리소스 → 단순, 어디서나, 웹 친화적
gRPC → 고성능 RPC (바이너리, HTTP/2) → 빠르고 타입 있음; 내부 서비스에 적합
GraphQL → 유연한 쿼리 (클라이언트가 필요한 것만 정확히 요청)
→ 적합: 호출자가 지금 답이 필요한 직접 요청/응답
비동기 통신 (메시징)
호출자가 기다리지 않음 (디커플링, 논블로킹):
메시지 큐 (RabbitMQ, SQS) → 메시지 전송; 컨슈머가 나중에 처리
이벤트 스트리밍 (Kafka) → 이벤트 발행; 컨슈머가 반응
PUB/SUB → 구독자에게 이벤트 브로드캐스트
→ 적합: 디커플링, 백그라운드 작업, 스파이크 처리, 이벤트 기반 시스템
✓ 복원력 (큐 버퍼), 확장성, 디커플링 ✗ 더 복잡함, eventual consistency
