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.