Apache Thrift

Apache Thrift

Thrift = MultiPlatform + MultiLanguage

Information Processing

Apache Thrift ist ein kleines, aber feines RPC-Framework. Die ursprüngliche, auch heute im Wesentlichen immer noch gültige Kernspezifikation des Systems bildet das Thrift Whitepaper von Mark Slee, Aditya Agarwal und Marc Kwiatkowski. Ursprünglich von Facebook entwickelt, wurde Thrift 2008 schließlich mit weiteren Projekten in die Open-Source-Welt entlassen und in den Apache Incubator aufgenommen.

Das wäre so erstmal nicht weiter bemerkenswert, allerdings unterstützt Thrift quasi von Anfang an eine beeeindruckende Menge an Zielplattformen und Programmiersprachen. Zudem wird Thrift von einer Vielzahl erfolgreicher Projekte eingesetzt, unter anderem Evernote und die No-SQL-Datenbank Apache Cassandra.

Von der IDL zum Thrift-Service

Trotz der breiten Unterstützung diverser Sprachen, angefangen bei Cocoa, über C++, C#, Erlang, Go, Haskell, Haxe, natürlich Java, aber auch JavaScript, Ruby und PHP bis hin zu Perl und Smalltalk, ist Thrift ein vergleichsweise leichtgewichtiges Framework. Das rührt zum großen Teil auch daher, daß aus der für die Definition der Schnittstelle zwischen den zu koppelnden Systemen zu schreibenden Thrift-IDL-Datei direkt statischer Code für die Zielsprache generiert wird.

Hohe Performance durch statische Codegenerierung

Damit wird zur Laufzeit fast automatisch eine recht gute Performance erzielt. Und in der Tat ist Thrift bei Tests unterschiedlichster RPC-Frameworks immer wieder in der Spitzengruppe zu finden.

Der Verzicht auf übermäßige Komplexität bringt natürlich auch Nachteile mit sich. So sind die in der IDL verwendbaren Basistypen auf die grundlegenden Elemente limitiert, die sich in den meisten heutzutage gängigen Programmiersprachen ohne Kopfstände abbilden lassen: Booleans, 8/16/32/64-bittige Integer, IEEE-Double und Strings. Daraus und aus den Containertypen list, set, map lassen sich über structs und typedefs und auch exceptions nahezu beliebig komplexe Strukturen zusammenbauen, die sodann in einem service zusammengefaßt werden - dem Thrift-Äquivalent eines Interface.

Soft-versionierte Schnittstellen

Soft-Versionierung ermöglicht evolvierende Interfaces

Gegenüber klassischen Interfaces, die man zB. aus der COM-Welt kennt, haben diese Service-Interfaces keine GUID als eindeutige Kennung, sondern unterstützen die sogenannten Soft-Versionierung, die im Falle von auf der Basis von Indexwerten und als (per default) optional gekennzeichneten Parametern besteht. Sehr schön erklärt ist das Prinzip dahinter im "halboffiziellen" Handbuch Thrift - the missing guidevon Diwaker Gupta.

Ein guter Startpunkt ist auf jeden Fall die Thrift-Website. Einen ausführlichen Artikel über Apache Thrift mit zwei Beispielprojekten, die je einen Delphi-Server mit JavaScript- und C#-Clients verbinden, finden sie in der Ausgabe 1/2012 der Zeitschrift web-developer, einen Performance-Vergleich von vier Frameworks für Delphi (SOAP, XML-RPC, REST und Thrift) im "Entwickler-Magazin" hier online oder alternativ in Ausgabe 6.12.