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 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 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 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ż Abstract Syntax Notation One (ASN.1) Internet Communications Engine (ICE)
Linki zewnętrzne Oficjalna strona
Kategoria:Apache Software Foundation Kategoria:Oprogramowanie na licencji Apache License Kategoria:Serwery WWW