Se você está procurando uma maneira de melhorar o desempenho e a confiabilidade de suas APIs, pode querer considerar o uso de streaming gRPC. gRPC é um framework moderno e de código aberto que permite criar serviços eficientes e escaláveis usando buffers de protocolo e HTTP/2. O streaming é um dos recursos principais do gRPC que permite enviar e receber várias mensagens em uma única conexão, sem esperar por cada resposta.
Neste post do blog, vou explicar o que é streaming gRPC, como funciona e por que é benéfico para suas APIs. Também vou mostrar como usar uma ferramenta chamada apidog para testar e depurar seus serviços de streaming gRPC. Ao final deste post, você terá uma melhor compreensão do streaming gRPC e de como usá-lo em seus projetos.
O que é Streaming gRPC?
gRPC streaming é uma maneira de enviar e receber várias mensagens em uma única conexão, usando HTTP/2 como o protocolo de transporte subjacente. HTTP/2 é uma versão mais nova do HTTP que suporta multiplexação, o que significa que várias requisições e respostas podem ser enviadas sobre a mesma conexão TCP, sem bloquear uma à outra. Isso reduz a sobrecarga de abrir e fechar conexões e melhora a latência e a capacidade de resposta de suas APIs.

O streaming gRPC permite que você utilize quatro tipos de padrões de comunicação:
- Unary: Este é o padrão mais simples e comum, onde o cliente envia uma requisição e recebe uma resposta do servidor. Isso é similar a uma requisição e resposta HTTP regular.
- Server streaming: Neste padrão, o cliente envia uma requisição e recebe várias respostas do servidor. O servidor pode transmitir as respostas à medida que se tornam disponíveis, sem esperar que o cliente as solicite. Isso é útil para cenários onde o servidor precisa enviar uma grande quantidade de dados para o cliente, ou onde o servidor precisa enviar atualizações para o cliente em tempo real.
- Client streaming: Neste padrão, o cliente envia várias requisições e recebe uma resposta do servidor. O cliente pode transmitir as requisições à medida que se tornam disponíveis, sem esperar que o servidor as reconheça. Isso é útil para cenários onde o cliente precisa enviar uma grande quantidade de dados para o servidor, ou onde o cliente precisa enviar vários parâmetros para o servidor em uma única requisição.
- Bidirectional streaming: Neste padrão, o cliente e o servidor podem enviar e receber múltiplas mensagens em ambas as direções. As mensagens podem ser enviadas e recebidas de forma independente, sem seguir uma ordem estrita. Isso é útil para cenários onde o cliente e o servidor precisam ter uma conversa contínua e dinâmica, ou onde o cliente e o servidor precisam trocar dados de maneira peer-to-peer.

Como Funciona o Streaming gRPC?
O streaming gRPC funciona usando buffers de protocolo e HTTP/2 para codificar e transportar as mensagens. Os buffers de protocolo são um formato de serialização binário que permite definir a estrutura e os tipos de suas mensagens em um arquivo de esquema. Os buffers de protocolo são compactos, rápidos e fáceis de usar, e suportam compatibilidade entre linguagens e plataformas.
HTTP/2 é um protocolo binário que suporta multiplexação, compressão e criptografia. O HTTP/2 permite que você envie várias mensagens sobre a mesma conexão, usando frames como a unidade básica de comunicação. Cada frame tem um cabeçalho que indica o tipo, comprimento e ID do stream do frame. O ID do stream é um identificador único que associa um frame a uma requisição ou resposta específica. O HTTP/2 também suporta controle de fluxo e tratamento de erros, o que ajuda a garantir a confiabilidade e eficiência de suas APIs.
Para usar o streaming gRPC, você precisa definir seu serviço e mensagens em um arquivo de buffer de protocolo, usando a sintaxe gRPC. Por exemplo, aqui está um serviço simples que suporta chamadas unárias e de streaming do servidor:
syntax = "proto3";
package example;
// Um serviço que retorna a hora atual
service TimeService {
// Chamada unária: retorna a hora atual
rpc GetTime (GetTimeRequest) returns (GetTimeResponse) {}
// Chamada de streaming do servidor: retorna a hora atual a cada segundo
rpc StreamTime (StreamTimeRequest) returns (stream StreamTimeResponse) {}
}
// Uma mensagem que representa uma requisição para obter a hora atual
message GetTimeRequest {
// O fuso horário da hora solicitada
string timezone = 1;
}
// Uma mensagem que representa uma resposta com a hora atual
message GetTimeResponse {
// A hora atual em formato ISO 8601
string time = 1;
}
// Uma mensagem que representa uma requisição para transmitir a hora atual
message StreamTimeRequest {
// O fuso horário da hora solicitada
string timezone = 1;
}
// Uma mensagem que representa uma resposta com a hora atual
message StreamTimeResponse {
// A hora atual em formato ISO 8601
string time = 1;
}
Para implementar seu serviço, você precisa usar uma biblioteca gRPC para a linguagem de programação de sua escolha. O gRPC suporta muitas linguagens, como C#, C++, Go, Java, Node.js, Python, Ruby e mais. Cada linguagem tem sua própria API e convenções para criar e consumir serviços gRPC. Por exemplo, aqui está uma implementação simples do TimeService em 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
# Uma classe que implementa o TimeService
class TimeService(TimeServiceServicer):
# Chamada unária: retorna a hora atual
def GetTime(self, request, context):
# Obtém o fuso horário da requisição
timezone = request.timezone
# Obtém a hora atual no fuso horário solicitado
time = get_current_time(timezone)
# Cria e retorna uma resposta com a hora atual
response = GetTimeResponse(time=time)
return response
# Chamada de streaming do servidor: retorna a hora atual a cada segundo
def StreamTime(self, request, context):
# Obtém o fuso horário da requisição
timezone = request.timezone
# Loop indefinido
while True:
# Obtém a hora atual no fuso horário solicitado
time = get_current_time(timezone)
# Cria e retorna uma resposta com a hora atual
response = StreamTimeResponse(time=time)
yield response
# Aguarda um segundo
time.sleep(1)
# Uma função que retorna a hora atual em um dado fuso horário
def get_current_time(timezone):
# TODO: implementar esta função
pass
# Cria um servidor gRPC
server = grpc.server(futures.ThreadPoolExecutor(max_workers=10))
# Adiciona o TimeService ao servidor
add_TimeServiceServicer_to_server(TimeService(), server)
# Inicia o servidor na porta 50051
server.add_insecure_port('[::]:50051')
server.start()
# Aguarda a terminação
server.wait_for_termination()
Para consumir seu serviço, você precisa usar um cliente gRPC para a linguagem de programação de sua escolha. Os clientes gRPC usam stubs para se comunicar com servidores gRPC. Os stubs são gerados a partir do arquivo de buffer de protocolo e fornecem métodos que correspondem aos métodos do serviço. Por exemplo, aqui está um cliente simples que chama o TimeService em Python:
import grpc
from example_pb2 import GetTimeRequest, StreamTimeRequest
from example_pb2_grpc import TimeServiceStub
# Cria um canal gRPC para o servidor
channel = grpc.insecure_channel('localhost:50051')
# Cria um stub para o TimeService
stub = TimeServiceStub(channel)
# Chamada unária: obtém a hora atual em UTC
request = GetTimeRequest(timezone='UTC')
response = stub.GetTime(request)
print(f'A hora atual em UTC é {response.time}')
# Chamada de streaming do servidor: transmite a hora atual em PST
request = StreamTimeRequest(timezone='PST')
responses = stub.StreamTime(request)
for response in responses:
print(f'A hora atual em PST é {response.time}')
Por que Usar Streaming gRPC?
O streaming gRPC oferece muitos benefícios para suas APIs, como:
- Desempenho: O streaming gRPC reduz a sobrecarga de abrir e fechar conexões, e permite que você envie e receba várias mensagens em uma única conexão. Isso melhora a latência e a capacidade de resposta de suas APIs, tornando-as mais responsivas e eficientes.
- Confiabilidade: O streaming gRPC usa o HTTP/2, que suporta controle de fluxo e tratamento de erros. O controle de fluxo permite que você controle a taxa de transferência de dados e evite congestionamento e overflow de buffer. O tratamento de erros permite que você detecte e se recupere de erros, e termine a conexão de forma elegante. Esses recursos ajudam a garantir a confiabilidade e robustez de suas APIs e previnem a perda e corrupção de dados.
- Flexibilidade: O streaming gRPC permite que você use diferentes padrões de comunicação, dependendo de seu caso de uso e requisitos. Você pode escolher entre streaming unário, de servidor, de cliente e bidirecional, e mudar entre eles facilmente. Isso proporciona mais flexibilidade e controle sobre suas APIs e permite lidar com diferentes cenários e desafios.
- Simplicidade: O streaming gRPC simplifica o desenvolvimento e manutenção de suas APIs, ao usar buffers de protocolo e bibliotecas gRPC. Os buffers de protocolo permitem que você defina seu serviço e mensagens de forma clara e concisa, e gere código para diferentes linguagens e plataformas. As bibliotecas gRPC permitem que você crie e consuma seu serviço usando uma API consistente e intuitiva, e lidam com os detalhes de baixo nível de streaming e HTTP/2 para você. Isso torna seu código mais legível, reutilizável e portátil, e reduz a complexidade e o boilerplate de suas APIs.

Como Testar e Depurar Serviços de Streaming gRPC?
Testar e depurar serviços de streaming gRPC pode ser desafiador, especialmente se você estiver usando diferentes idiomas e plataformas. Felizmente, há uma ferramenta que pode ajudá-lo com isso: Apidog.
Apidog é uma ferramenta baseada na web que permite testar e depurar seus serviços de streaming gRPC, usando uma interface simples e intuitiva. apidog suporta muitas linguagens, como C#, C++, Go, Java, Node.js, Python, Ruby e mais. Apidog também suporta diferentes padrões de comunicação, como unário, streaming do servidor, streaming do cliente e streaming bidirecional.
Com apidog, você pode:
- Conectar ao seu servidor gRPC, usando um canal seguro ou inseguro, e especificar o serviço e o método que deseja chamar.
- Enviar requisições para seu servidor gRPC, usando um formato JSON ou binário, e especificar os metadados e o prazo para cada requisição.
- Receber respostas do seu servidor gRPC, usando um formato JSON ou binário, e visualizar os metadados e o status para cada resposta.
- Monitorar o desempenho e o status de sua conexão gRPC, usando gráficos e tabelas que mostram a latência, capacidade de resposta e erros de suas requisições e respostas.
- Depurar seu serviço gRPC, usando logs e rastros que mostram os detalhes e erros de suas requisições e respostas, e permitem que você filtre e busque eventos específicos.


Apidog é uma ferramenta poderosa e fácil de usar que pode ajudá-lo a testar e depurar seus serviços de streaming gRPC, e garantir que funcionem como esperado.
Conclusão
O streaming gRPC é um recurso que pode tornar suas APIs mais rápidas e confiáveis, permitindo que você envie e receba várias mensagens em uma única conexão, usando HTTP/2 e buffers de protocolo. O streaming gRPC também oferece flexibilidade e simplicidade, permitindo que você use diferentes padrões de comunicação e linguagens, e fornecendo uma API consistente e intuitiva. O streaming gRPC é uma ótima escolha para suas APIs, especialmente se você precisar lidar com grandes quantidades de dados, atualizações em tempo real ou interações complexas.
Se você deseja saber mais sobre streaming gRPC, pode conferir a documentação oficial em https://grpc.io/docs. Se você quiser testar e depurar seus serviços de streaming gRPC, pode usar o Apidog, uma ferramenta baseada na web que permite conectar, enviar, receber, monitorar e depurar seus serviços de streaming gRPC, usando uma interface simples e intuitiva. Você pode experimentar o apidog gratuitamente.