Apache Thrift es un marco de trabajo para la implementación de RPC en servicios, con soporte en varios idiomas
RPC (Remote Procedure Call) es como llamar a una función, sólo que está presente de forma remota en un servidor diferente como un servicio. Un servicio expone muchas de estas funciones/procedimientos a su cliente. Y el cliente requiere alguna manera de saber cuáles son las funciones/procedimientos expuestos por este servicio y cuáles son sus parámetros.
Aquí es donde entra Apache Thrift. Tiene su propio «Lenguaje de Definición de Interfaces» (IDL). En este lenguaje se define cuáles son las funciones y cuáles son sus parámetros. Y luego usas el compilador de Thrift para generar el código correspondiente para cualquier lenguaje de tu elección. Lo que esto significa, es que usted puede implementar una función en java, alojarla en un servidor y luego llamarla remotamente desde python.
El trabajo importante que hace un marco como Thrift es este –
- Proveer un lenguaje agnóstico de definición de interfaz
- Un compilador para compilar este IDL para producir código de cliente y servidor (en el mismo o en un lenguaje separado, según sea necesario)
- El código de cliente generado por el compilador expone un stub de interfaces para estas funciones. El código stub convierte los parámetros pasados a la función en un formato binario (serializado) que puede ser transportado por cable a través de la red. Este proceso se llama marshaling. El código del cliente generado nunca tiene la implementación real de la función, de ahí que se llame stub.
- En el servidor, el desarrollador utiliza el código del servidor generado por el compilador, para implementar realmente estas funciones (es decir, escribir la funcionalidad real de la función). El código generado del lado del servidor recibe el mensaje codificado binario del cliente, los convierte de nuevo a los objetos de lenguaje correspondientes y lo pasa a la función implementada por el desarrollador. Esto se denomina unmarshaling. En java, por ejemplo, el código del servidor generado por el compilador sería la interfaz que el desarrollador implementará y también otras clases.
- De forma similar, el resultado de una función se convierte en binario y se envía al cliente.
Para los parámetros de la función, IDL define su propio conjunto de tipos de estructuras de datos como List, Map, Struct o Classes, aparte de los tipos nativos como Int, String, Boolean, etc. Estos se asignan a las correspondientes implementaciones del lenguaje.
Thrift es similar a SOAP y CORBA. Ya que ambos se utilizan para RPC y proporcionan su propio IDL. CORBA y SOAP generalmente también tiene un broker de descubrimiento de servicios como un middleware para exponer funciones/métodos al cliente. Para thrift, normalmente utilizamos Zookeeper para el descubrimiento de servicios.
REST es diferente, porque no tiene IDL, y utiliza métodos HTTP como GET, PUT y patrones de url para llamar a una función remota y pasar parámetros. El uso de métodos HTTP y la semántica de url hace que también sea agnóstico al lenguaje.
La cola de mensajes es totalmente diferente. Porque se utiliza principalmente en el modelo Publish/Subscribe. Mientras que RPC es el modelo Cliente/Servidor.
En Publish/Subscribe, múltiples editores envían/añaden un mensaje serializado en una cola. El formato del mensaje es definido por el publicador y tiene el control total del mismo. Su definición está semánticamente asociada a la cola en la que se publican, pero no hay un control estricto de su estructura. El suscriptor, conociendo entonces el tipo de mensaje que tendrá una cola, se suscribe a esos mensajes. Los publicadores no saben quién es el cliente, y los suscriptores no saben quiénes son los productores del mensaje. Sólo saben qué tipo de mensaje publicar o consumir respectivamente de una cola. El Publicador y el Suscriptor se encargan de conocer el serializador y el deserializador adecuados.
Esto es diferente en el RPC Cliente/Servidor, ya que el Cliente sabe (en sentido estricto) qué pasar y el Servidor lo define. Y también a quién pasar.
Otra librería similar a Thrift es Protobuf y Avro.
Finagle de Twitter es una forma de crear un servicio basado en Thrift, también tiene soporte para Protobuf.