Apache Thrift è un framework, per implementare RPC nei servizi, con supporto cross-language
RPC (Remote Procedure Call) è come chiamare una funzione, solo che è presente in remoto su un altro server come servizio. Un servizio espone molte di queste funzioni/procedure al suo client. E il cliente richiede un modo per sapere quali sono le funzioni/procedure esposte da questo servizio e quali sono i loro parametri.
E' qui che entra in gioco Apache Thrift. Ha il proprio "linguaggio di definizione delle interfacce" (IDL). In questo linguaggio si definisce quali sono le funzioni e quali sono i loro parametri. E poi usi il compilatore Thrift per generare il codice corrispondente per qualsiasi linguaggio di tua scelta. Ciò significa che si può implementare una funzione in java, ospitarla su un server e poi chiamarla in remoto da python.
Importante lavoro che un framework come Thrift fa è questo -
- Fornire un linguaggio di definizione delle interfacce agnostico
- Un compilatore per compilare questo IDL e produrre codice client e server (nella stessa lingua o in lingue separate, come richiesto)
- Il codice client generato dal compilatore espone un'interfaccia stub per queste funzioni. Il codice stub converte i parametri passati alla funzione in un formato binario (serializzato) che può essere trasportato in rete. Questo processo è chiamato marshaling. Il codice client generato non ha mai l'implementazione effettiva della funzione, quindi si chiama stub.
- Al server, lo sviluppatore usa il codice server generato dal compilatore, per implementare effettivamente queste funzioni (cioè scrivere la funzionalità effettiva della funzione). Il codice generato lato server riceve il messaggio codificato binario dal client, lo riconverte negli oggetti corrispondenti del linguaggio e lo passa alla funzione implementata dallo sviluppatore. Questo è chiamato unmarshaling. In java per esempio il codice server generato dal compilatore sarebbe l'interfaccia che lo sviluppatore implementerà e anche varie altre classi.
- Similmente il risultato di una funzione viene convertito in binario e inviato al client.
Per i parametri della funzione, IDL definisce il proprio set di tipi di strutture dati come List, Map, Struct o Classes oltre ai tipi nativi come Int, String, Boolean, ecc. Questi sono poi mappati alle corrispondenti implementazioni del linguaggio.
Thrift è simile a SOAP e CORBA. Poiché entrambi sono usati per RPC e forniscono il proprio IDL. CORBA e SOAP generalmente hanno anche un broker di scoperta del servizio come middleware per esporre funzioni/metodi al client. Per thrift, normalmente usiamo Zookeeper per il service discovery.
REST è diverso, perché non ha IDL, e usa metodi HTTP come GET, PUT e modelli di url per chiamare una funzione remota e passare parametri. L'uso dei metodi HTTP e della semantica degli url lo rende anche agnostico dal punto di vista linguistico.
La coda di messaggistica è completamente diversa. Perché è usato principalmente nel modello Publish/Subscribe. Mentre RPC è il modello Client/Server.
In Publish/Subscribe, più editori inviano/aggiungono un messaggio serializzato su una coda. Il formato del messaggio è definito dall'editore e ne ha il controllo completo. La loro definizione è semanticamente associata alla coda su cui sono pubblicati, ma non c'è un controllo rigoroso della loro struttura. L'abbonato, quindi sapendo il tipo di messaggio che una coda avrà, si iscrive per quei messaggi. Gli editori non sanno chi sono i clienti e i sottoscrittori non sanno chi sono i produttori del messaggio. Sanno solo che tipo di messaggio pubblicare o consumare rispettivamente da una coda. Il Publisher e Subscriber è responsabile di conoscere il giusto serializzatore e deserializzatore.
Questo è diverso nel Client/Server RPC, poiché il Client sa (in senso stretto) cosa passare e il Server lo definisce. E anche chi passare.
Altra libreria simile a Thrift è Protobuf e Avro.
Finagle di Twitter è un modo per creare un servizio basato su Thrift, ha anche il supporto per Protobuf.