Our public API stayed REST, but every internal service-to-service call moved to gRPC over the course of a quarter. Here’s why it was worth the migration cost.
The JSON tax was real
Profiling showed a surprising chunk of CPU time going to marshaling and unmarshaling JSON on our highest-traffic internal paths. Protobuf’s binary encoding and generated structs took that cost down to nearly nothing.
Contracts, not conventions
The bigger win wasn’t performance — it was that .proto files became the enforced contract between teams instead of a wiki page nobody updated. Breaking changes now fail at compile time instead of at 2am.
What we kept in REST
Anything client-facing or webhook-based stayed REST/JSON on purpose — gRPC’s tooling story for browsers and third-party integrators isn’t worth the trade-off outside the service mesh.