En termes simples, qu’est-ce qu’Apache Thrift et que fait-il ?


Apache Thrift est un framework, pour l'implémentation de RPC dans les services, avec un support inter-langues

RPC (Remote Procedure Call) est comme l'appel d'une fonction, sauf que celle-ci est présente à distance sur un serveur différent en tant que service. Un service expose de nombreuses fonctions/procédures de ce type à son client. Et le client a besoin d'un moyen de savoir quelles sont les fonctions/procédures exposées par ce service et quels sont leurs paramètres.


C'est là qu'intervient Apache Thrift. Il dispose de son propre "langage de définition d'interface" (IDL). Dans ce langage, vous définissez quelles sont les fonctions et quels sont leurs paramètres. Puis vous utilisez le compilateur Thrift pour générer le code correspondant dans le langage de votre choix. Ce que cela signifie, c'est que vous pouvez implémenter une fonction en java, l'héberger sur un serveur et l'appeler à distance à partir de python.

Un travail important qu'un framework comme Thrift fait est le suivant -

  1. Proviser un langage de définition d'interface agnostique
  2. Un compilateur pour compiler cet IDL afin de produire du code client et serveur (dans le même langage ou dans un langage distinct selon les besoins)
  3. Le code client généré par le compilateur expose une interface stub pour ces fonctions. Le code stub convertit les paramètres passés à la fonction en un format binaire (sérialisé) qui peut être transporté sur fil sur le réseau. Ce processus est appelé marshaling. Le code client généré n'a jamais l'implémentation réelle de la fonction, d'où son nom de stub.
  4. Au niveau du serveur, le développeur utilise le code serveur généré par le compilateur, pour mettre réellement en œuvre ces fonctions (c'est-à-dire écrire la fonctionnalité réelle de la fonction). Le code généré côté serveur reçoit le message codé binaire du client, les reconvertit en objets de langage correspondants et les passe à la fonction implémentée par le développeur. C'est ce qu'on appelle le démarshaling. En java par exemple, le code serveur généré par le compilateur serait Interface que le développeur implémentera et aussi diverses autres classes.
  5. De même, le résultat d'une fonction est converti en binaire et envoyé au client.

Pour les paramètres de la fonction, IDL définit son propre ensemble de types de structures de données comme List, Map, Struct ou Classes en dehors des types natifs comme Int, String, Boolean, etc. Ceux-ci sont ensuite mappés aux implémentations de langage correspondantes.

Thrift est similaire à SOAP et CORBA. Puisqu'ils sont tous deux utilisés pour le RPC et fournissent leur propre IDL. CORBA et SOAP a généralement aussi un courtier de découverte de services comme un intergiciel pour exposer les fonctions/méthodes au client. Pour thrift, nous utilisons normalement Zookeeper pour la découverte de services.

REST est différent, car il n'a pas d'IDL, Et utilise des méthodes HTTP comme GET, PUT et des motifs url pour appeler une fonction distante et passer des paramètres. L'utilisation des méthodes HTTP et de la sémantique url le rend également agnostique au niveau du langage.

La file d'attente de messagerie est entièrement différente. Parce qu'elle est surtout utilisée dans le modèle Publish/Subscribe. Alors que RPC est un modèle Client/Serveur.

Dans Publish/Subscribe, plusieurs éditeurs envoient/ajoutent un message sérialisé sur une file d'attente. Le format du message est défini par l'éditeur qui en a le contrôle total. Leur définition est sémantiquement associée à la file sur laquelle ils sont publiés, mais il n'y a pas de contrôle strict de leur structure. L'abonné, connaissant alors le type de message d'une file d'attente, s'abonne à ces messages. Les éditeurs ne savent pas qui sont les clients, et les abonnés ne savent pas qui sont les producteurs du message. Ils savent seulement quel type de message publier ou consommer respectivement à partir d'une file d'attente. L'éditeur et l'abonné est responsable de connaître le bon sérialiseur et désérialiseur.
C'est différent dans le RPC client/serveur, puisque le client sait (au sens strict) ce qu'il doit passer et le serveur le définit. Et aussi qui passer.

Les autres bibliothèques similaires à Thrift sont Protobuf et Avro.
Finagle de Twitter est une façon de créer un service basé sur Thrift, il a également un support pour Protobuf.