Synchronous — REST
Simple, universal, human-readable. Best for: user-facing request/response flows where the client needs an immediate answer. Weakness: tight coupling — if the downstream service is slow or down, the caller is affected.
Synchronous — gRPC
Protocol Buffers serialisation is ~5–10× faster than JSON. HTTP/2 multiplexing. Strongly typed contracts. Best for: high-throughput internal service-to-service communication where performance matters. Weakness: less debuggable, requires proto files.
Asynchronous — Message queues
Producer publishes a message; consumer processes it independently. Decouples services in time. Best for: tasks that do not need an immediate response (email sending, report generation, order fulfilment events).
Asynchronous — Event streaming (Kafka)
Multiple consumers can subscribe to the same event. Events are retained and replayable. Best for: domain events that multiple services need, audit trails, and event sourcing.
Decision framework
- Need immediate response → sync (REST or gRPC).
- Fire and forget, or multiple consumers → async queue or stream.
- High throughput internal call → gRPC over REST.