Sự khác biệt lớn nhất của Thrift vs Bộ đệm giao thức?


286

Những ưu và nhược điểm lớn nhất của Apache Thrift so với Bộ đệm giao thức của Google là gì?


4
Là một lưu ý phụ, Marc Gravell duy trì một thư viện để làm việc với Googles protobuf được gọi là protobuf.net và tại code.google.com/p/protobuf-net
RCIX

5
Câu hỏi này và một số câu trả lời sau đây khoảng 6 tuổi. Có lẽ rất nhiều đã thay đổi kể từ đó.
AlikElzin-kilaka

Câu trả lời:


159

Cả hai đều cung cấp nhiều tính năng giống nhau; tuy nhiên, có một số khác biệt:

  • Thrift hỗ trợ 'ngoại lệ'
  • Bộ đệm giao thức có tài liệu / ví dụ tốt hơn nhiều
  • Thrift có một Setloại dựng sẵn
  • Bộ đệm giao thức cho phép "tiện ích mở rộng" - bạn có thể mở rộng một proto bên ngoài để thêm các trường bổ sung, trong khi vẫn cho phép mã bên ngoài hoạt động trên các giá trị. Không có cách nào để làm điều này trong Thrift
  • Tôi thấy Bộ đệm giao thức dễ đọc hơn nhiều

Về cơ bản, chúng tương đối giống nhau (với Bộ đệm giao thức hiệu quả hơn một chút so với những gì tôi đã đọc).


16
Bài trình bày này giải thích họ cũng như năm 2013 slideshare.net/IgorAnishchenko/pb-vs-thrift-vs-avro
BAR

13
hỗ trợ tiết kiệm như 10 ngôn ngữ nữa
Elijah Saounkine

1
Đối với một số ngôn ngữ, bạn có thể thêm tiện ích mở rộng. Ví dụ, Thrift tạo các lớp một phần cho C # rất dễ mở rộng. Tuy nhiên, đó không phải là quy tắc chung, đó là sự thật.
JensG

grpc 1.0 (proto3) hỗ trợ mapcũng
KindDragon

85

Một sự khác biệt quan trọng khác là các ngôn ngữ được hỗ trợ theo mặc định.

  • Bộ đệm giao thức: Java, Android Java, C ++, Python, Ruby, C #, Go, Objective-C, Node.js
  • Thrift: Java, C ++, Python, Ruby, C #, Go, Objective-C, JavaScript, Node.js, Erlang, PHP, Perl, Haskell, Smalltalk, OCaml, Delphi, D, Haxe

Cả hai có thể được mở rộng sang các nền tảng khác, nhưng đây là những ràng buộc ngôn ngữ có sẵn bên ngoài.


16
protobuf có hỗ trợ ruby ​​tuyệt vời github.com/macks/ruby-protobufcode.google.com/p/ruby-protobuf . Tôi đang sử dụng protobuf từ C # (3.5) và Ruby, C # tuần tự hóa dữ liệu và khi được yêu cầu, Ruby giải tuần tự hóa và thực hiện nhiệm vụ.
Bryan Bailliache

6
code.google.com/p/protobuf/wiki/ThirdPartyAddOns liệt kê PHP, Ruby, Erlang, Perl, Haskell, C #, OCaml plus Actiona Script, Common Lisp, Go, Lua, Mathlab, Visual Basic, Scala. Thiết nghĩ đây là tất cả các triển khai của bên thứ ba.
Igor Gatis

bạn có thể trực tiếp sử dụng các tệp protobuf C ++ trong mục tiêu c (cho cả iOS và OS X) kiểm tra qn này
Tushar Koul

Tôi thấy code.google.com/p/protobuf-net thường được đề cập như một cổng protobuf cho C #, nhưng nó không hoàn toàn đúng. Một trong những tính năng quan trọng của Protobuf và Thrift là định nghĩa cấu trúc bên ngoài, do đó, định nghĩa tương tự có thể được sử dụng bởi các ngôn ngữ khác nhau. protobuf-net không hỗ trợ tính năng này vì nó nhúng định nghĩa cấu trúc bên trong mã C #.
Andriy Tylychko

@AndyT: Điều đó gây tranh cãi - điều này phụ thuộc vào việc đó có phải là một lợi thế mà định nghĩa cấu trúc là NGOẠI TẤT đối với tất cả các ngôn ngữ bạn muốn hỗ trợ hay không. Với protobuf-net, bạn xác định cấu trúc dữ liệu của mình trong C # và tạo tệp .proto từ đó, sau đó có thể được sử dụng để tạo hỗ trợ bằng các ngôn ngữ khác. Tôi coi đây là một lợi thế, vì tôi rất C # -centric và đang trong quá trình tích hợp Android / Java với một ứng dụng .Net lớn hiện có. Vì vậy, tôi muốn tiếp tục coi các lớp C # của mình là các định nghĩa cấu trúc dứt khoát.
RenniePet

73

RPC là một sự khác biệt quan trọng khác. Thrift tạo mã để triển khai các máy khách và máy chủ RPC trong đó Bộ đệm giao thức dường như được thiết kế chủ yếu dưới dạng định dạng trao đổi dữ liệu.


9
Đo không phải sự thật. Bộ đệm giao thức xác định api dịch vụ RPC và có một số thư viện có sẵn để thực hiện truyền thông điệp.
Stephen

7
Tôi không nói Protobuf không có RPC được xác định, chỉ là nó dường như không được thiết kế cho điều đó, ít nhất là không phải bản phát hành bên ngoài mà mọi người đều có quyền truy cập. Đọc nhận xét này của Google tại đây
apimu apale

9
Quan trọng hơn, Thrift có hỗ trợ RPC tích hợp. Protobuf hiện đang dựa vào các thư viện của bên thứ ba, nghĩa là ít mắt hơn, ít thử nghiệm hơn, mã kém tin cậy hơn.
Alec Thomas

2
Đối với tôi, đó là một điểm tốt về ProtoBuf. Nếu bạn chỉ cần tuần tự hóa, bạn không thêm mã vô dụng. Và nếu trong tương lai, bạn cần gửi nó bằng RPC, không vấn đề gì, nó có thể hoạt động. Tôi sử dụng Netty cho mạng và Protobuf được tích hợp hoàn hảo, vì vậy không có vấn đề gì, không có thử nghiệm và tối đa hóa hiệu suất.
Kikiwa

14
Protobufs, trên thực tế, được thiết kế với RPC trong tâm trí. Google chỉ mở nguồn gốc mà thành phần khá thời gian gần đây - grpc.io
andybons

57
  • Các đối tượng nối tiếp Protobuf nhỏ hơn khoảng 30% so với Thrift.
  • Hầu hết các hành động bạn có thể muốn thực hiện với các đối tượng protobuf (tạo, tuần tự hóa, giải tuần tự hóa) chậm hơn nhiều so với tiết kiệm trừ khi bạn bật option optimize_for = SPEED.
  • Thrift có cấu trúc dữ liệu phong phú hơn (Bản đồ, Bộ)
  • API Protobuf trông sạch hơn, mặc dù các lớp được tạo đều được đóng gói dưới dạng các lớp bên trong không đẹp lắm.
  • Các enum tiết kiệm không phải là các Java Java thực, tức là chúng chỉ là ints. Protobuf có các enum Java thực sự.

Để xem xét kỹ hơn về sự khác biệt, hãy xem mã nguồn khác biệt tại dự án nguồn mở này .


1
Gợi ý nhanh: sẽ gọn gàng nếu có một định dạng không nhị phân khác (xml hoặc json?) Được sử dụng làm đường cơ sở. Chưa có thử nghiệm tốt nào cho thấy xu hướng chung - giả sử rằng PB và Thrift hiệu quả hơn, nhưng nếu và bao nhiêu nếu vậy, chủ yếu là một câu hỏi mở.
StaxMan

4
0,02 giây?! Tôi không có loại thời gian rảnh rỗi đó
Chris S

1
Bây giờ Thrift có nhiều giao thức (bao gồm cả TCompactProtocol), tôi nghĩ rằng viên đạn đầu tiên không áp dụng nữa.
Janus Troelsen

13
Tùy chọn tối ưu hóa tốc độ hiện là mặc định cho bộ đệm giao thức ( code.google.com/apis/protocolbuffers/docs/proto.html )
Willem

5
Chúng ta có nhận được 30% đối tượng nhỏ hơn với cài đặt "tối ưu hóa = tốc độ" không? Hay đó là thỏa hiệp?
Sharma Prashant

56

Như tôi đã nói là chủ đề "Thrift vs Protocol đệm" :

Nhắc đến so sánh Thrift vs Protobuf vs JSON :

Ngoài ra, có rất nhiều công cụ bổ sung thú vị có sẵn cho các giải pháp đó, có thể quyết định. Dưới đây là ví dụ cho Protobuf: Protobuf-wireshark , protobufeditor .


10
Bây giờ đây là một vòng tròn đầy đủ. Bạn đã đăng cùng một câu trả lời cho ba câu hỏi (tương tự) luôn liên kết trở lại hoặc. Tôi cảm thấy như mình đang chơi Zelda và bỏ lỡ một dấu hiệu.
ChrisR

+ ChrisR heh, tôi không thể nhớ nó đã xảy ra như thế nào. Mặc dù có một vài câu hỏi tương tự, nhưng có lẽ tôi nên tạo ba cấu trúc giống như thay vì theo chu kỳ. Một ngày nọ ... Đó là câu hỏi rất cũ và bây giờ tôi đang trả lời từ điện thoại. Nhưng dù sao, cảm ơn vì đã bắt!
Grzegorz Wierzowiecki

6
"Thrift đi kèm với một hướng dẫn tốt" - thật buồn cười. Đây là hướng dẫn không đầy đủ nhất mà tôi từng thấy. Ngay khi bạn muốn làm một cái gì đó bên cạnh TSimpleServer, bạn sẽ bị mắc kẹt ở đó
Marian Klühspies

Thrift cũng có plugin Wireshark: github.com/andrewcox/wireshark-with-thrift-plugin
CCoder

8

Bộ đệm giao thức dường như có một đại diện nhỏ gọn hơn, nhưng đó chỉ là một ấn tượng tôi có được từ việc đọc whitepaper Thrift. Nói cách riêng của họ:

Chúng tôi đã quyết định chống lại một số tối ưu hóa lưu trữ cực đoan (nghĩa là đóng gói các số nguyên nhỏ vào ASCII hoặc sử dụng định dạng tiếp tục 7 bit) vì mục đích đơn giản và rõ ràng trong mã. Những thay đổi này có thể dễ dàng được thực hiện nếu và khi chúng ta gặp phải trường hợp sử dụng hiệu năng quan trọng đòi hỏi chúng.

Ngoài ra, nó có thể chỉ là ấn tượng của tôi, nhưng Bộ đệm giao thức dường như có một số trừu tượng dày hơn xung quanh phiên bản cấu trúc. Thrift có một số hỗ trợ phiên bản, nhưng phải mất một chút nỗ lực để thực hiện nó.


1
Tại sao việc Thrift thừa nhận không gọn nhẹ nhất có thể khiến bạn tin vào Bộ đệm giao thức?
Michael Mior

1
Bộ đệm giao thức sử dụng mã hóa số nguyên có độ dài thay đổi, cả cho các giá trị và cho các định danh trường. Vì vậy, trường hợp rất phổ biến của việc gửi một trường int có giá trị nhỏ sẽ là hai byte, không phải là int16 và int32.
poolie

"Bộ đệm giao thức sử dụng mã hóa số nguyên có độ dài thay đổi" - TCompactProtocol
JensG

8

Tôi đã có thể có được hiệu suất tốt hơn với một giao thức dựa trên văn bản so với protobuff trên python. Tuy nhiên, không có kiểm tra loại hoặc chuyển đổi utf8 ưa thích nào khác, v.v ... mà protobuff cung cấp.

Vì vậy, nếu serialization / deserialization là tất cả những gì bạn cần, thì có lẽ bạn có thể sử dụng một cái gì đó khác.

http://dhruvbird.blogspot.com/2010/05/protatio-buffers-vs-http.html


7

Một điều rõ ràng chưa được đề cập là có thể là cả pro hoặc con (và giống nhau cho cả hai) là chúng là các giao thức nhị phân. Điều này cho phép biểu diễn nhỏ gọn hơn và có thể hiệu suất cao hơn (ưu), nhưng với khả năng đọc giảm (hay đúng hơn là khả năng sửa lỗi), một con lừa.

Ngoài ra, cả hai đều có công cụ hỗ trợ ít hơn một chút so với các định dạng tiêu chuẩn như xml (và thậm chí có thể là json).

(EDIT) Đây là một so sánh thú vị giải quyết cả sự khác biệt về kích thước và hiệu suất và bao gồm cả số cho một số định dạng khác (xml, json).


3
Việc xuất bộ đệm giao thức thành biểu diễn văn bản dễ đọc hơn nhiều so với XML: my_proto.DebugString (). Để biết ví dụ, hãy xem code.google.com/apis/protocolbuffers/docs/overview.html
SuperElectric

Tất nhiên, ditto cho tất cả các định dạng nhị phân - nhưng điều đó không làm cho chúng có thể đọc được như hiện tại (gỡ lỗi trên dây). Tệ hơn, đối với protobuf, bạn thực sự cần lược đồ def để biết tên trường.
StaxMan

Thrift hỗ trợ các giao thức khác nhau, thậm chí do người dùng xác định. Bạn có thể sử dụng nhị phân, compact, json hoặc thứ gì đó bạn đã phát minh ra vào tuần trước.
JensG

6

Và theo wiki , Thrift runtime không chạy trên Windows.


5
Tôi chạy Thrift trên Windows thành công. Sử dụng cửa sổ ngã ba tại github.com/aubonbeurre/thrift
Sergey Podobry

20
Chi nhánh chính thức hiện có hỗ trợ Windows.
Janus Troelsen

5
@dalle - Alex P đã thêm hỗ trợ luồng Boost trong Thrift. Bây giờ nó là luồng mặc định cho Windows. * NIX mặc định cho pthreads. Và để xác nhận Janus T, Thrift hiện hỗ trợ đầy đủ Windows.
pmont

21
Đây là thông tin lỗi thời. Thrift chạy hoàn hảo trên Windows trong một thời gian ngắn.
JensG

6

ProtocolBuffers là NHANH CHÓNG.
Có một điểm chuẩn tuyệt vời ở đây:
http://code.google.com.vn/p/thrift-protobuf-compare/wiki/Benchmarking

Bạn cũng có thể muốn xem xét Avro, vì Avro thậm chí còn nhanh hơn.
Microsoft có một gói ở đây:
http://www.nuget.org/packages/Microsoft.Hadoop.Avro

Nhân tiện, nhanh nhất tôi từng thấy là Cap'nProto ;
Việc triển khai AC # có thể được tìm thấy tại kho Github của Marc Gravell .


4

Tôi nghĩ rằng hầu hết các điểm này đã bỏ lỡ một thực tế cơ bản rằng Thrift là một khung RPC, có khả năng tuần tự hóa dữ liệu bằng nhiều phương thức khác nhau (nhị phân, XML, v.v.).

Bộ đệm giao thức được thiết kế hoàn toàn để tuần tự hóa, nó không phải là một khung như Thrift.


3
Bạn có ý nghĩa gì với khung RPC và nó khác với gRPC của protobuf như thế nào?
marcelocra

gRPC không được đóng gói cùng với protobuf. Nó được phát triển như 10 năm sau. Thrift đi kèm với khung RPC đầy đủ. Nó đã được thực hiện cùng nhau.
bộ ba


0

Có một số điểm tuyệt vời ở đây và tôi sẽ thêm một điểm nữa trong trường hợp đường đi của ai đó đi qua đây.

Thrift cung cấp cho bạn một tùy chọn để lựa chọn giữa serializer tiết kiệm và nhị phân tiết kiệm (de), thrift-binary sẽ có hiệu suất tuyệt vời nhưng kích thước gói lớn hơn, trong khi tiết kiệm sẽ cho bạn khả năng nén tốt nhưng cần nhiều khả năng xử lý hơn. Điều này rất tiện lợi vì bạn luôn có thể chuyển đổi giữa hai chế độ này dễ dàng như thay đổi một dòng mã (quái, thậm chí làm cho nó có thể cấu hình được). Vì vậy, nếu bạn không chắc chắn ứng dụng của bạn sẽ được tối ưu hóa bao nhiêu cho kích thước gói hoặc trong khả năng xử lý, tiết kiệm có thể là một lựa chọn thú vị.

PS: Xem dự án điểm chuẩn tuyệt vời này bằng cách thekvsso sánh nhiều bộ nối tiếp bao gồm nhị phân tiết kiệm, tiết kiệm nhỏ gọn và protobuf: https://github.com/thekvs/cpp-serialulators

PS: Có một serializer khác được đặt tên YAScũng cung cấp tùy chọn này nhưng nó không có lược đồ xem liên kết ở trên.


0

Cũng cần lưu ý rằng không phải tất cả các ngôn ngữ được hỗ trợ đều phù hợp với tiết kiệm hoặc protobuf. Tại thời điểm này, vấn đề thực hiện các mô-đun bên cạnh việc tuần tự hóa cơ bản. Hãy cẩn thận để kiểm tra điểm chuẩn cho bất kỳ ngôn ngữ nào bạn dự định sử dụng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.