Si estás buscando una forma de mejorar el rendimiento y la fiabilidad de tus APIs, puede que quieras considerar el uso de gRPC streaming. gRPC es un framework moderno de código abierto que te permite crear servicios eficientes y escalables utilizando buffers de protocolo y HTTP/2. El streaming es una de las características clave de gRPC que te permite enviar y recibir múltiples mensajes en una sola conexión, sin esperar cada respuesta.
En esta entrada del blog, explicaré qué es gRPC streaming, cómo funciona y por qué es beneficioso para tus APIs. También te mostraré cómo usar una herramienta llamada apidog para probar y depurar tus servicios de gRPC streaming. Al final de esta entrada, tendrás una mejor comprensión de gRPC streaming y cómo usarlo en tus proyectos.
¿Qué es gRPC Streaming?
gRPC streaming es una forma de enviar y recibir múltiples mensajes en una sola conexión, utilizando HTTP/2 como protocolo de transporte subyacente. HTTP/2 es una versión más reciente de HTTP que soporta la multiplexación, lo que significa que se pueden enviar múltiples peticiones y respuestas a través de la misma conexión TCP, sin bloquearse entre sí. Esto reduce la sobrecarga de abrir y cerrar conexiones, y mejora la latencia y el rendimiento de tus APIs.

gRPC streaming te permite usar cuatro tipos de patrones de comunicación:
- Unario: Este es el patrón más simple y común, donde el cliente envía una petición y recibe una respuesta del servidor. Esto es similar a una petición y respuesta HTTP regular.
- Streaming del servidor: En este patrón, el cliente envía una petición y recibe múltiples respuestas del servidor. El servidor puede transmitir las respuestas a medida que estén disponibles, sin esperar a que el cliente las solicite. Esto es útil para escenarios donde el servidor necesita enviar una gran cantidad de datos al cliente, o donde el servidor necesita enviar actualizaciones al cliente en tiempo real.
- Streaming del cliente: En este patrón, el cliente envía múltiples peticiones y recibe una respuesta del servidor. El cliente puede transmitir las peticiones a medida que estén disponibles, sin esperar a que el servidor las reconozca. Esto es útil para escenarios donde el cliente necesita subir una gran cantidad de datos al servidor, o donde el cliente necesita enviar múltiples parámetros al servidor en una sola petición.
- Streaming bidireccional: En este patrón, el cliente y el servidor pueden enviar y recibir múltiples mensajes en ambas direcciones. Los mensajes se pueden enviar y recibir de forma independiente, sin seguir un orden estricto. Esto es útil para escenarios donde el cliente y el servidor necesitan tener una conversación continua y dinámica, o donde el cliente y el servidor necesitan intercambiar datos de forma peer-to-peer.

¿Cómo Funciona gRPC Streaming?
gRPC streaming funciona utilizando buffers de protocolo y HTTP/2 para codificar y transportar los mensajes. Los buffers de protocolo son un formato de serialización binaria que te permite definir la estructura y los tipos de tus mensajes en un archivo de esquema. Los buffers de protocolo son compactos, rápidos y fáciles de usar, y soportan la compatibilidad entre lenguajes y plataformas.
HTTP/2 es un protocolo binario que soporta la multiplexación, la compresión y el cifrado. HTTP/2 te permite enviar múltiples mensajes a través de la misma conexión, utilizando tramas como la unidad básica de comunicación. Cada trama tiene una cabecera que indica el tipo, la longitud y el ID de flujo de la trama. El ID de flujo es un identificador único que asocia una trama con una petición o respuesta específica. HTTP/2 también soporta el control de flujo y el manejo de errores, lo que ayuda a garantizar la fiabilidad y la eficiencia de tus APIs.
Para usar gRPC streaming, necesitas definir tu servicio y tus mensajes en un archivo de buffer de protocolo, utilizando la sintaxis de gRPC. Por ejemplo, aquí tienes un servicio simple que soporta llamadas unarias y de streaming del servidor:
syntax = "proto3";
package example;
// A service that returns the current time
service TimeService {
// Unary call: returns the current time
rpc GetTime (GetTimeRequest) returns (GetTimeResponse) {}
// Server streaming call: returns the current time every second
rpc StreamTime (StreamTimeRequest) returns (stream StreamTimeResponse) {}
}
// A message that represents a request to get the current time
message GetTimeRequest {
// The timezone of the requested time
string timezone = 1;
}
// A message that represents a response with the current time
message GetTimeResponse {
// The current time in ISO 8601 format
string time = 1;
}
// A message that represents a request to stream the current time
message StreamTimeRequest {
// The timezone of the requested time
string timezone = 1;
}
// A message that represents a response with the current time
message StreamTimeResponse {
// The current time in ISO 8601 format
string time = 1;
}
Para implementar tu servicio, necesitas usar una biblioteca de gRPC para tu lenguaje de programación preferido. gRPC soporta muchos lenguajes, como C#, C++, Go, Java, Node.js, Python, Ruby y más. Cada lenguaje tiene su propia API y convenciones para crear y consumir servicios gRPC. Por ejemplo, aquí tienes una implementación simple del TimeService en Python:
import grpc
import time
from concurrent import futures
from example_pb2 import GetTimeRequest, GetTimeResponse, StreamTimeRequest, StreamTimeResponse
from example_pb2_grpc import TimeServiceServicer, add_TimeServiceServicer_to_server
# A class that implements the TimeService
class TimeService(TimeServiceServicer):
# Unary call: returns the current time
def GetTime(self, request, context):
# Get the timezone from the request
timezone = request.timezone
# Get the current time in the requested timezone
time = get_current_time(timezone)
# Create and return a response with the current time
response = GetTimeResponse(time=time)
return response
# Server streaming call: returns the current time every second
def StreamTime(self, request, context):
# Get the timezone from the request
timezone = request.timezone
# Loop indefinitely
while True:
# Get the current time in the requested timezone
time = get_current_time(timezone)
# Create and yield a response with the current time
response = StreamTimeResponse(time=time)
yield response
# Wait for one second
time.sleep(1)
# A function that returns the current time in a given timezone
def get_current_time(timezone):
# TODO: implement this function
pass
# Create a gRPC server
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
# Add the TimeService to the server
add_TimeServiceServicer_to_server(TimeService(), server)
# Start the server on port 50051
server.add_insecure_port('[::]:50051')
server.start()
# Wait for termination
server.wait_for_termination()
Para consumir tu servicio, necesitas usar un cliente gRPC para tu lenguaje de programación preferido. Los clientes gRPC usan stubs para comunicarse con los servidores gRPC. Los stubs se generan a partir del archivo de buffer de protocolo, y proporcionan métodos que corresponden a los métodos del servicio. Por ejemplo, aquí tienes un cliente simple que llama al TimeService en Python:
import grpc
from example_pb2 import GetTimeRequest, StreamTimeRequest
from example_pb2_grpc import TimeServiceStub
# Create a gRPC channel to the server
channel = grpc.insecure_channel('localhost:50051')
# Create a stub for the TimeService
stub = TimeServiceStub(channel)
# Unary call: get the current time in UTC
request = GetTimeRequest(timezone='UTC')
response = stub.GetTime(request)
print(f'The current time in UTC is {response.time}')
# Server streaming call: stream the current time in PST
request = StreamTimeRequest(timezone='PST')
responses = stub.StreamTime(request)
for response in responses:
print(f'The current time in PST is {response.time}')
¿Por Qué Usar gRPC Streaming?
gRPC streaming ofrece muchos beneficios para tus APIs, como:
- Rendimiento: gRPC streaming reduce la sobrecarga de abrir y cerrar conexiones, y te permite enviar y recibir múltiples mensajes en una sola conexión. Esto mejora la latencia y el rendimiento de tus APIs, y las hace más receptivas y eficientes.
- Fiabilidad: gRPC streaming usa HTTP/2, que soporta el control de flujo y el manejo de errores. El control de flujo te permite controlar la velocidad de transferencia de datos, y evitar la congestión y el desbordamiento del buffer. El manejo de errores te permite detectar y recuperarte de los errores, y terminar la conexión de forma elegante. Estas características ayudan a garantizar la fiabilidad y la robustez de tus APIs, y previenen la pérdida y la corrupción de datos.
- Flexibilidad: gRPC streaming te permite usar diferentes patrones de comunicación, dependiendo de tu caso de uso y tus requisitos. Puedes elegir entre unario, streaming del servidor, streaming del cliente y streaming bidireccional, y cambiar entre ellos fácilmente. Esto te da más flexibilidad y control sobre tus APIs, y te permite manejar diferentes escenarios y desafíos.
- Simplicidad: gRPC streaming simplifica el desarrollo y el mantenimiento de tus APIs, utilizando buffers de protocolo y bibliotecas de gRPC. Los buffers de protocolo te permiten definir tu servicio y tus mensajes de una forma clara y concisa, y generar código para diferentes lenguajes y plataformas. Las bibliotecas de gRPC te permiten crear y consumir tu servicio utilizando una API consistente e intuitiva, y manejar los detalles de bajo nivel del streaming y HTTP/2 por ti. Esto hace que tu código sea más legible, reutilizable y portable, y reduce la complejidad y el boilerplate de tus APIs.

¿Cómo Probar y Depurar Servicios de gRPC Streaming?
Probar y depurar servicios de gRPC streaming puede ser un desafío, especialmente si estás usando diferentes lenguajes y plataformas. Afortunadamente, hay una herramienta que puede ayudarte con eso: Apidog.
Apidog es una herramienta basada en la web que te permite probar y depurar tus servicios de gRPC streaming, utilizando una interfaz simple e intuitiva. apidog soporta muchos lenguajes, como C#, C++, Go, Java, Node.js, Python, Ruby y más. Apidog también soporta diferentes patrones de comunicación, como unario, streaming del servidor, streaming del cliente y streaming bidireccional.
Con apidog, puedes:
- Conectar a tu servidor gRPC, utilizando un canal seguro o inseguro, y especificar el servicio y el método que quieres llamar.
- Enviar peticiones a tu servidor gRPC, utilizando un formato JSON o binario, y especificar los metadatos y el plazo para cada petición.
- Recibir respuestas de tu servidor gRPC, utilizando un formato JSON o binario, y ver los metadatos y el estado de cada respuesta.
- Monitorizar el rendimiento y el estado de tu conexión gRPC, utilizando gráficos y diagramas que muestran la latencia, el rendimiento y los errores de tus peticiones y respuestas.
- Depurar tu servicio gRPC, utilizando registros y trazas que muestran los detalles y los errores de tus peticiones y respuestas, y te permiten filtrar y buscar eventos específicos.


Apidog es una herramienta potente y fácil de usar que puede ayudarte a probar y depurar tus servicios de gRPC streaming, y asegurar que funcionan como se espera.
Conclusión
gRPC streaming es una característica que puede hacer que tus APIs sean más rápidas y fiables, al permitirte enviar y recibir múltiples mensajes en una sola conexión, utilizando HTTP/2 y buffers de protocolo. gRPC streaming también te ofrece flexibilidad y simplicidad, al permitirte usar diferentes patrones de comunicación y lenguajes, y al proporcionarte una API consistente e intuitiva. gRPC streaming es una gran elección para tus APIs, especialmente si necesitas manejar grandes cantidades de datos, actualizaciones en tiempo real o interacciones complejas.
Si quieres aprender más sobre gRPC streaming, puedes consultar la documentación oficial en https://grpc.io/docs. Si quieres probar y depurar tus servicios de gRPC streaming, puedes usar Apidog, una herramienta basada en la web que te permite conectar, enviar, recibir, monitorizar y depurar tus servicios de gRPC streaming, utilizando una interfaz simple e intuitiva. Puedes probar apidog gratis.