Jakie są największe zalety i wady Apache Thrift w porównaniu z buforami protokołów Google ?
Jakie są największe zalety i wady Apache Thrift w porównaniu z buforami protokołów Google ?
Odpowiedzi:
Oba oferują wiele takich samych funkcji; istnieją jednak pewne różnice:
Set
typZasadniczo są one dość równoważne (z buforami protokołów nieco bardziej wydajnymi od tego, co przeczytałem).
map
także
Kolejną ważną różnicą są języki obsługiwane domyślnie.
Oba mogą zostać rozszerzone na inne platformy, ale są to wiązania językowe dostępne od razu po wyjęciu z pudełka.
RPC to kolejna kluczowa różnica. Thrift generuje kod do implementacji klientów i serwerów RPC, gdzie Bufory protokołów wydają się być zaprojektowane głównie jako sam format wymiany danych.
option optimize_for = SPEED
.Aby bliżej przyjrzeć się różnicom, sprawdź różnice w kodzie źródłowym w tym projekcie open source .
Jak powiedziałem w temacie „Thrift vs. Protocol Buffers” :
Odnosząc się do porównania Thrift vs Protobuf vs JSON :
Ponadto istnieje wiele interesujących dodatkowych narzędzi dostępnych dla tych rozwiązań, które mogą zadecydować. Oto przykłady Protobuf: Protobuf-wireshark , protobufeditor .
Bufory protokołów wydają się mieć bardziej zwartą reprezentację, ale to tylko wrażenie, które czerpię z lektury białej księgi Thrift. Innymi słowy:
Zdecydowaliśmy się na pewne ekstremalne optymalizacje pamięci (np. Pakowanie małych liczb całkowitych do ASCII lub stosowanie 7-bitowego formatu kontynuacji) ze względu na prostotę i przejrzystość kodu. Zmian tych można łatwo dokonać, jeśli napotkamy krytyczny dla wydajności przypadek użycia, który ich wymaga.
Może to po prostu moje wrażenie, ale bufory protokołów wydają się mieć grubsze abstrakcje wokół wersji struktury. Thrift ma pewne wsparcie dla wersji, ale do tego potrzeba trochę wysiłku.
Byłem w stanie uzyskać lepszą wydajność dzięki protokołowi tekstowemu w porównaniu do protobuffu w Pythonie. Jednak bez sprawdzania typu lub innej fantazyjnej konwersji utf8 itp., Którą oferuje protobuff.
Jeśli więc potrzebujesz serializacji / deserializacji, prawdopodobnie możesz użyć czegoś innego.
http://dhruvbird.blogspot.com/2010/05/protocol-buffers-vs-http.html
Jedną oczywistą rzeczą, o której jeszcze nie wspomniano, że może być zarówno za, jak i przeciw (i to samo dla obu) jest to, że są to protokoły binarne. Pozwala to na bardziej zwartą reprezentację i być może większą wydajność (zalety), ale przy zmniejszonej czytelności (a raczej możliwości debuggowania), oszustwo.
Oba mają nieco mniej obsługi narzędzi niż standardowe formaty, takie jak xml (a może nawet json).
(EDYCJA) Oto interesujące porównanie, które zajmuje się zarówno różnicami wielkości, jak i wydajności oraz zawiera liczby dla niektórych innych formatów (xml, json).
Według wiki środowisko wykonawcze Thrift nie działa w systemie Windows.
ProtocolBuffers jest SZYBSZY.
Tutaj znajduje się niezły benchmark:
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking
Możesz także zajrzeć do Avro, ponieważ Avro jest jeszcze szybszy.
Microsoft ma tutaj pakiet:
http://www.nuget.org/packages/Microsoft.Hadoop.Avro
Nawiasem mówiąc, najszybszy, jaki kiedykolwiek widziałem, to Cap'nProto ;
Implementację AC # można znaleźć w repozytorium Github Marc Gravell .
Myślę, że większość z tych punktów pominęła podstawowy fakt, że Thrift jest frameworkiem RPC, który ma możliwość szeregowania danych przy użyciu różnych metod (binarny, XML itp.).
Bufory protokołów są przeznaczone wyłącznie do serializacji, nie są to ramy takie jak Thrift.
Po pierwsze, protobuf nie jest pełną implementacją RPC. Do tego wymaga czegoś takiego jak gRPC.
gPRC jest bardzo wolny w porównaniu do Thrift:
Jest tu kilka doskonałych punktów i dodam jeszcze jeden na wypadek, gdyby ktoś się tu przeciął.
Thrift daje ci możliwość wyboru pomiędzy serializatorem oszczędnościowym a kompaktowym (de) serializatorem oszczędności, oszczędnościowy plik binarny będzie miał doskonałą wydajność, ale większy rozmiar pakietu, podczas gdy kompaktowy zapewnia dobrą kompresję, ale wymaga większej mocy obliczeniowej. Jest to przydatne, ponieważ zawsze możesz przełączać się między tymi dwoma trybami tak łatwo, jak zmieniając wiersz kodu (do diabła, nawet skonfiguruj go). Jeśli więc nie masz pewności, jak bardzo Twoja aplikacja powinna być zoptymalizowana pod kątem wielkości pakietu lub mocy przetwarzania, oszczędzanie może być ciekawym wyborem.
PS: Zobacz ten znakomity projekt porównawczy, w thekvs
którym porównuje wiele serializatorów, w tym thrift-binary, thrift-compact i protobuf: https://github.com/thekvs/cpp-serializers
PS: Istnieje inny serializator o nazwie, YAS
który daje tę opcję, ale nie ma schematu, patrz powyższy link.