gRPC vs. RPC: Comparing Protocol Buffers, JSON, Avro, and Thrift

How do RPC and gRPC differ? Does it matter? Everything and more here.
Written by
Jiří Makovský
November 6, 2024
5
min. read
  • gRPC relies on HTTP/2; it supports multiplexing and bi-directional streaming, which boosts performance and reduces latency.
  • gRPC is more scalable and, hence, better suited for performance-critical applications like microservices than traditional RPC using JSON.
  • gRPC utilizes Protocol Buffers. It is a technology offering more compact and efficient binary serialization format.
  • Classic RPC is simpler and easier to implement, especially for smaller systems and projects.

If it hasn’t come up for you before, RPC (Remote Procedure Call) and its advanced version, gRPC (g is for Google), facilitates communication between applications across different devices, mirroring local function calls. What they differ in is performance and scalability. 

Let's explore the distinctions between the two together. We are going to examine gRPC's use of Protocol Buffers for serialization and compare it with other formats like JSON, Avro, and Thrift, to show how and if gRPC can benefit your project.

RPC and gRPC Overview

RPC is a communication protocol that allows one program to execute a procedure on a different machine as if it were local. This approach abstracts the complexity of network communication, basically reducing the experience to a simple function call between processes running on different systems. As the complexity and application performance requirements grow, shortcomings of traditional RPC become more apparent.

What gRPC does is extend RPC by modernizing it for distributed and cloud-native systems. Developed by Google, gRPC uses HTTP/2, supports bi-directional streaming, and optimizes performance through Protocol Buffers, a highly efficient binary serialization format. Another strong page is the fact that gRPC lets clients and servers communicate across many programming languages and platforms. The result is more efficient calls in extensive operations while also being a bit costlier.

How Traditional RPC Works

RPC operates by defining a service contract (or API) that specifies the procedures that are executable remotely. Here's how it functions:

  • Client request: The client program sends a request to execute a remote procedure.
  • Server processing: The server receives the request, processes it, and works on the procedure.
  • Serialization/Deserialization: The client and server must agree on a common data format to exchange said data. Simply put a language. Traditionally, text-based formats like JSON or XML are used in simple RPC systems.
  • Response: The server sends the result back to the client, deserializes the data, and continues execution as if the call were local.

Limitations of a traditional RPC:

  • Protocol Overhead: Ttext-based formats like JSON and XML add significant overhead due to verbosity.
  • No Native Streaming: RPC operates in a strict request-response model. It lacks flexibility for real-time streaming communication between services.
  • Synchronous Nature: Classic RPC models are often synchronous. They block the client while awaiting the server's response, which can introduce latency and performance bottlenecks. However, this concerns mainly large operations. 

Find affordable RPCs for dozens of blockchain protocols in one place.

[.c-wr-center][.button-black]Access Nodes[.button-black][.c-wr-center]

gRPC: A Modern Solution to RPC’s Shortcomings

gRPC packs several improvements:

  1. Built on HTTP/2: HTTP/2 is a noticeable upgrade over HTTP/1.1, particularly due to multiplexing—the capability to send multiple requests and responses concurrently over the same TCP connection. The result is reduced latency, especially in microservice architectures where a single request may involve several service calls. It also includes header compression, once again optimizing performance for large data payloads.
  2. Bi-Directional Streaming: gRPC has full-duplex communication where the client and server can continuously stream messages to each other. It is elementary for applications that require real-time updating (like financial services).
  3. Protocol Buffers (Protobuf): Protobuf is a highly efficient binary serialization format for data exchange methods. Thanks to the smaller size, it is 3 to 10 times faster than text-based formats like JSON, reducing bandwidth usage and processing time. Additionally, Protobuf enforces a schema that allows backward and forward compatibility.

gRPC vs. RPC in the Context of Blockchain Infra

Generally, using RPC is the most standard way of getting data from a remote system, but you can use gRPC to stream data. Because of the reasons mentioned above, it is faster and lighter than the traditional JSON serialization format.

It can technically help to use gRPC for pulling in data, but it’s not widely adopted yet, so you don’t find it on many chains. Tatum, for example, provides it on demand.

Comparing Serialization Formats: Protobuf, JSON, Avro, Thrift

The format chosen directly affects bandwidth consumption, latency, and ease of integration.

Protocol Buffers

All the messages are encoded in a much smaller binary format. This leads to faster serialization/deserialization compared to JSON or XML. This compactness translates into faster network transmission, especially in high-performance systems.

Protobuf uses a predefined schema to serialize and deserialize data. Both the sender and receiver know the structure of the message, which reduces misinterpretations and enables more efficient data handling.

It reigns when it is about performance-critical systems like gRPC-based microservices, high-frequency trading platforms, and systems where low-latency communication is key.

JSON (JavaScript Object Notation)

JSON is human-readable, which makes it easy to debug. As said a few sentences ago, JSON can struggle because of the verbosity, resulting in larger message sizes and increased latency. Nevertheless, the verbosity of text-based formats results in larger message sizes and increased network latency. While easy to use, JSON's serialization and deserialization process is slower and can generate overhead bottlenecks.

JSON is suited for web APIs, where readability and simplicity are more important than performance.

Avro

Avro is ideal for distributed data systems where schemas can change occasionally. It is designed for big data applications, particularly within the Apache Hadoop ecosystem. It embeds the schema alongside the data so that systems can quickly handle evolving structures. 

Avro, like Protobuf, is a binary serialization format, ensuring that data is compact and efficiently serialized/deserialized.

Avro is widely used in big data processing pipelines, particularly in systems that need to handle large amounts of structured data, such as Kafka and Hadoop.

[.c-box-wrapper][.c-box]You might be interested in: Blockchain Dapp Development: What You Need to Know to Start[.c-box][.c-box-wrapper]

Thrift

Thrift, developed by Facebook, supports multiple serialization formats (including binary and JSON), making it a flexible tool for distributed systems where numerous programming languages are at play.

Thrift includes an RPC framework, meaning that, like gRPC, it provides both data serialization and a means of communication between services.

Thrift is often used in cross-language service architectures where communication efficiency and flexibility are both needed, such as highly scalable web services.

Detailed Performance Comparison: gRPC vs. Traditional RPC

Data Efficiency

gRPC (Protobuf) 

Protobuf’s binary format and HTTP/2’s multiplexing capabilities enable gRPC to outperform traditional RPC implementations, especially in large-scale microservice communication scenarios. For example, Google has seen up to 10x performance improvements in certain internal microservices using gRPC over REST APIs that rely on JSON. While effective, the price and time needed to implement them means that gRPCs are not for everyone.

Traditional RPC (JSON/XML) 

While JSON and XML are simple and easy to implement, their verbosity results in larger payloads, higher bandwidth consumption, and longer processing times. In large distributed systems, this can quickly become a performance bottleneck. Nevertheless, traditional RPCs are more suited to small-scale systems.

[.c-box-wrapper][.c-box]You might be interested in: Erigon Quick Fix Leads to Over 1,000% RPS Improvement![.c-box][.c-box-wrapper]

Network Protocol

gRPC packing HTTP/2

The multiplexing and header compression in HTTP/2 reduces latency, especially in scenarios involving frequent and concurrent API calls. The improved flow control mechanisms of HTTP/2 are also worth noting, allowing more efficient communication.

Traditional RPC with HTTP/1.1

In HTTP/1.1, each request-response cycle is independent, which means new connections or HTTP headers are necessary for every request. This overhead introduces latency in larger systems.

Streaming Capabilities

gRPC (Bi-directional streaming)

gRPC allows clients and servers to send multiple real-time requests and responses over the same connection. This is best suited for applications like IoT, gaming, and real-time financial systems requiring low-latency data streaming.

Traditional RPC (Synchronous)

Traditional RPC typically uses a request-response model that blocks the client while waiting for the server's response.

Real-World Use Cases for gRPC

You might be asking, what is all this tech for. Let us answer that. 

  • Microservices in Cloud Environments: gRPC is more efficient when it comes to high-frequency operations. Almost every technology company can use that; examples include Google, Netflix, and Square.
  • Real-time Applications: Applications requiring real-time bidirectional communication, such as video conferencing, live-streaming platforms, and gaming systems.
  • Fintech and Blockchain: Both industries benefit from gRPC’s low latency. You can find more about blockchain use cases here.

[.c-box-wrapper][.c-box]You might be interested in: Fact or Myth: Gateways Always Outperform Direct RPC Endpoints[.c-box][.c-box-wrapper]