gRPC: O que é e como usar?
Há algum tempo passei a ouvir sobre gRPC, e sobre os benefícios que ele traria para a comunicação entre diferentes aplicações e dispositivos.
Uma vez que um dos principais requesitos dos projetos em que trabalho é ter um tempo de reposta médio bastante eficiente (abaixo de 200ms), nós passamos a utilizar o gRPC, com o objetivo de trafegar as informações com mais eficiência do que teriámos usando REST com protocolo http padrão…
E é sobre o início dessa jornada que irei comentar brevemente aqui, abordando o que é gRPC, vantagens e desvantagens.
Afinal, o que é gRPC?
gRPC é um acrônimo para Google Remote Procedure Call (Chamada de Procedimento Remoto), é um protocolo para execução remota de serviços, permitindo que uma aplicação cliente possa chamar diretamente um método de uma aplicação em um servidor remoto, e evidentemente, esse é um protocolo criado pela Google, tendo como base o antigo protocolo RPC.
Além disso, gRPC é Open Source, e por padrão utiliza HTTP/2 para a transmissão de dados entre os computadores remotos. Os dados são transportados utilizando uma Linguagem de Definição de Interface (IDL), e a mais utilizada junto ao gRPC é o Protocol Buffer (Protobuf para os intímos :D).
O protocolo fornece quatro métodos diferentes para as chamadas remotas:
- Unary Call: As chamadas unárias são aquelas em que o cliente envia uma solicitação única ao servidor e o servidor responde com uma única resposta, basicamente igual à uma requisição normal do REST, por exemplo.
- Server Streaming Call: As chamadas de stream de servidor são aquelas em que o cliente envia uma solicitação única ao servidor, porém, diferentemente da chamada unária, o servidor responde com um stream de dados, como se fosse uma lista de respostas. Assim, o cliente lê esse stream até que não haja mais dados.
- Client Streaming Call: As chamadas de stream de cliente são, basicamente, o contrário das Server Stream Call, de tal forma que o cliente envia um stream de dados para o servidor, o qual processará todos esses dados e por fim, enviará uma única resposta ao cliente.
- Bi-directional Streaming Call: As chamadas bi-direcionais são a únião das chamadas de stream de servidor e de cliente, ou seja, nesse caso tanto o cliente quanto o servidor poderão trafegar um stream de dados durante a chamada.
Por fim, é importante dizer que o gRPC é considerado não apenas um novo protocolo, mas sim um framework, visto que já implementa várias funcionalidades em diferentes linguagens sem a necessidade de re-escrever o básico.
Vantagens
A primeira grande vantagem é a facilidade de implementação, havendo exemplos fáceis e práticos em diversas linguagens. Um bom ponto de partida é a própria documentação do gRPC.
Além disso, um dos pontos positivos mais observados no gRPC e, inclusive, um dos grandes motivadores para a utilização desse framwork é o seu alto desempenho, uma vez que suas mensagens com o protobuf podem ser até 30% menores que uma mensagem JSON equivalente, e a sua execução pode ser entre 5 e 10 vezes mais rápida que uma comunicação de REST com JSON.
Os diferentes tipos de chamadas possíveis no gRPC também são uma grande vantagem, pois além de permitir a transmissão de mensagens unárias, assim como o REST, também acaba permitindo o stream de dados, o que pode ser muito útil em alguns cenários.
Desvantagens
A principal desvantagem é o fato de que é bastante difícil realizar testes com gRPC, e por testes, eu me refiro a testes de integração e E2E.
As mensagens transmitidas pelo gRPC não são human-readable, como um JSON, o que complica momentos de debugging, uma vez que se torna necessário converter as mensagens do binário para algum outro formato mais fácil de se entender.
E por hoje é isso pessoal!