Apache Thrift

Apache Thrift
logo
Autor Apache Software Foundation
Aktualna wersja stabilna 0.9.3
System operacyjny GNU/Linux, OS X, Windows
Rodzaj Remote procedure call framework
Licencja Apache License 2.0
Strona internetowa

Thrift – język opisu interfejsu IDL, używany do definiowania i tworzenia obsługi wielu języków. Jest używany jako framework zdalnego wywołania procedury (RPC) i został opracowany przy tworzeniu portalu internetowego Facebook do rozwoju skalowalnych usług dla wielu języków ("scalable cross-language services development"). Łączy on stos oprogramowania z silnikiem generowania kodu do tworzenia usług, które w różnym stopniu współpracują wydajnie i bezproblemowo między C#, C++ (na systemach POSIX-compliant), Cappuccino, Cocoa, Erlang, Haskell, Java, OCaml, Perl, PHP, Python, Ruby i Smalltalk. Mimo iż został on opracowany przy Facebooku, teraz jest projektem open source w inkubatorze Apache Software Foundation. Realizacja projektu została opisana w kwietniu 2007 r. w dokumentacji technicznej wydanej przez Facebook, a teraz jest hostowana na Apache. Mówiąc wprost Apache Thrift to protokół komunikacji binarnej.

Architektura

[edytuj | edytuj kod]

Thrift zawiera pełny zestaw do tworzenia klientów i serwerów. Główną częścią zestawu jest kod wygenerowany z Twojego pliku definicyjnego Thriftu. Usługi Thrift skutkują wygenerowaniem z tego pliku klienta i kodu maszynowego. W odróżnieniu od wbudowanych typów, stworzone struktury danych są wysyłane w postaci wyniku do generowanego kodu. Warstwa protokołu i transportu są częścią biblioteki wykonawczej Thrift. Dlatego też z Thrift można zdefiniować usługi, które mają prawo zmienić protokół i transport bez konieczności ponownego tworzenia kodu. Thrift obejmuje również infrastrukturę serwera, aby powiązać protokoły i transporty. Z dostępnych serwerów mamy do wyboru blokujące, nieblokujące, pojedyncze, jak również wielowątkowe. Podstawowe elementy zestawów obsługujących wejście/wyjście (I/O) są już uzależnione od danego języka. Dla języka Java i Python biblioteki we/wy są wbudowane w bibliotekę Thrift, podczas gdy implementacja języka C++ używa swoich własnych rozwiązań.

Thrift wspiera wiele protokołów:

  • TBinaryProtocol – binarny format typu straight-forward kodujący wartości liczbowe jako binarne. Jest szybszy niż protokół tekstowy, aczkolwiek o wiele trudniejszy do debugowania.
  • TCompactProtocol – bardzo wydajny w gęstym kodowaniu danych.
  • TDebugProtocol – używa tekstu w formacie czytelnym dla człowieka, aby ułatwić debugowanie.
  • TDenseProtocol – podobny do TCompactProtocol, rozkłada meta informacje od tego co jest przekazywane.
  • TJSONProtocol – używa JSON do kodowania danych.
  • TSimpleJSONProtocol – protokół zapisu używający JSON. Przydatny do parsowania przez języki skryptowe.

Jak również wiele transportów:

  • TFileTransport – zapis do pliku
  • TFramedTransport – wymagany przy użyciu nieblokującego serwera. Wysyła dane w ramkach, gdzie każda ramka jest poprzedzona informacją o długości.
  • TMemoryTransport – używa pamięci dla we/wy. Implementacja Java używa prostego ByteArrayOutputStream wewnętrznie.
  • TSocket – używa blokującego gniazda we/wy do transportu.
  • TZlibTransport – przeprowadza porównanie używając zlib. Używany w połączeniu z innym transportem. nie dostępny w implementacji Java.

Thrift również dostarcza serwery takie jak:

  • TNonblockingServer – wielowątkowy serwer używający nieblikującego we/wy (implementacja Java używa kanałów NIO). Przy użyciu tego serwera trzeba również skorzystać z TFramedTransport.
  • TSimpleServer – jednowątkowy serwer używający standardowego, blokującego we/wy. Użyteczny do testów.
  • TThreadPoolServer – wielowątkowy serwer używający standardowego, blokującego we/wy.

Korzyści

[edytuj | edytuj kod]

Korzyści wynikające z użycia Thrifta:

  • Wielojęzykowa serializacja przy niższych kosztach (niż alternatywne rozwiązania, takie jak SOAP) z powodu wykorzystania formatu binarnego.
  • Nieduże i czyste biblioteki, brak frameworka kodu. Brak plików konfiguracyjnych XML
  • Oprawa języka sprawia naturalne wrażenie, na przykład: Java używa ArrayList<String>. C++ używa std::vector<std::string>.
  • Format transportu danych na poziomie aplikacji i serializacji są jasno rozgraniczone. Mogą być modyfikowane niezależnie.
  • Wstępnie zdefiniowane style serializacji m.in.: binarny, HTTP-friendly i kompaktowo binarny.
  • Podwójnie: wielojęzykowy plik serializacyjny.
  • Miękkie wersji protokołu. Thrift nie wymaga scentralizowanego i wyraźnego mechanizmu jak major-version/minor-version. Swobodnie połączone zespoły mogą swobodnie rozwijać wywołania RPC.
  • Brak zależności budowania lub niestandardowych wersji oprogramowania. Brak mieszanki niezgodnych licencji na oprogramowanie.

Tworzenie serwisu Thrift

[edytuj | edytuj kod]

Thrift jest pisany w języku C++, ale może utworzyć kod dla wielu innych języków. Do stworzenia serwisu Thrift, najpierw trzeba zapisać pliki Thrift opisujące go, wygenerować kod w docelowym języku i napisać kod, aby uruchomić serwer i wywołać go od klienta. Oto przykładowy kod pliku opisu:

enum PhoneType 
{
 HOME,
 WORK,
 MOBILE,
 OTHER
}

struct Phone 
{
 1: i32 id,
 2: string number,
 3: PhoneType type
}

Thrift wygeneruje kod z tego opisu. Na przykład w języku Java, kod PhoneType po prostu enum wewnątrz POJO dla klasy Phone.

Zobacz też

[edytuj | edytuj kod]

Linki zewnętrzne

[edytuj | edytuj kod]