Hace un tiempo, cuando empecé a estudiar la teoría de microservicios y un compañero me contó sobre esto, sus ventajas y que protocolos usar (Si, Esteban, te hablo a vos) me nombró gRPC, curioso y con sed de aprendizaje me puse como meta, intentar entender esto.
A medida que iba leyendo la documentación (por cierto, de las peores que vi, por lo menos en la parte de Node.JS) entendía cada vez menos. Esto me llevó a investigar en varios lados, aún con más dudas, pero de poco aclarando el panorama (como diría Ricky Arjona).
Si ustedes llegaron hasta acá y no entendieron sobre esta tecnología (como yo) ó les interesa aprender… voy a intentar ayudarles, obvio bobis.
¿Qué es gRPC?
En su sitio web lo definen como: Un framework de llamada de procedimiento remoto (?) de alto rendimiento que puede correr en cualquier ambiente (??)… entre otras cosas, que ahora voy a explicar.
Muchas palabras difíciles en un párrafo.
En palabras más fáciles, nosotros actualmente para muchísimos proyectos usamos métodos de comunicación, entre front y back, algo que llamamos APIs, gRPC vendría a ser una opción mas completa y rápida a esta ya que implementa algunas cositas como:
Protocolo HTTP/2 (una de las ventajas es la eficiencia al hacer streaming de datos)
Protobuf (son archivos .proto para serializar datos, en lugar de JSON o XML y además nos permite definir estructuras)
Balanceo de carga (Tiene un mecanismo propio de balanceo de carga)
Con estas características presentes (y otras mas) ya nos da cierta ventaja con respecto a APIs/REST.
Según algunos benchmarks que vi, gRPC es 7 u 8 veces mas rápido por estas características.
¿Cómo funciona gRPC?
En principio, gRPC tiene dos partes:
Servidor (Recibe y responde las peticiones de sus clientes)
Cliente (Envía y recibe respuestas del servidor)
Algo interesante es que un cliente puede ser servidor también ó lo podríamos tratar como tal (cuando veamos un ejemplo de una arquitectura de microservicios con gRPC lo podremos apreciar mejor).
Un término que van a leer a continuación es stub (no intenten traducirlo porque no los va a llevar a nada, ya lo intenté), esto es una porción de código o funcionamiento encargada de hacer la transmisión de datos, donde se encuentran los protos (Protobuf).
Ahora sí, ¿Cómo es que funciona? Paso a paso.
El cliente (controlador) envía una petición.
Pasa por el stub de cliente, revisa la petición, serializa los parámetros y llama al stub servidor.
El stub servidor recibe la petición, la evalúa, la deserializa y la envía a su controlador.
El controlador (servidor) hace la lógica correspondiente y le responde al stub servidor.
El stub servidor responde al stub cliente.
El stub cliente le pasa la respuesta al cliente.
Al momento de hacer la evaluación de lo que se envía y a donde (método) utiliza el famoso Protobuf (mencionado más arriba), este es protocolo de buffer (con la extensión .proto) donde definimos que parámetros se van a recibir y de qué métodos esta compuesto nuestro servicio gRPC.
¿Cuándo debería usar gRPC?
En efecto, no siempre. Para explicar esto, dividamos los tipos de comunicación en dos categorías: Públicas y Privadas.
Las públicas son aquellas a las que cualquiera puede acceder: Webs, Celulares, SmartTVs, etc. Mas bien, todo dispositivo que trabaje con protocolo HTTP/1
Las privadas, en cambio, son aquellas que solo servicios internos pueden acceder, bajo nuestras propias leyes, podríamos establecer, en caso de que queramos usar gRPC, que estos lo usen.
Con esta separación podemos entender algo: Una web, al trabajar con protocolo HTTP/1 (publicas) no puede comunicarse con gRPC (HTTP/2) (privadas).
Entonces, ¿Cómo podemos comunicarnos?
Una opción es crear un gateway que utilice APIs/REST (HTTP/1)(Cliente) y que este se encargue de comunicarse con nuestros servicios en gRPC (Servidor)
Quedándonos algo así:
Conclusiones
No hay duda de que gRPC es una gran tecnología, tiene sus ventajas (rapidez), como sus desventajas (implementación y comunicación), pero es algo para tener en cuenta a futuro.
Recursos
Recomiendo, si vas a usar gRPC en Node.JS y Typescript, acá va un muy buen tutorial
Además, tenemos frameworks como Nest.JS que tienen la posibilidad de agregarlo de manera muy fácil
Estamos hablando de Esteban Z? No quiero exponerlo a E. Zelaya.