it-swarm-vi.tech

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

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

256
Bob

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ó loại Set 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 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).

145
hazzen

Một sự khác biệt quan trọng 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
  • Tiết kiệm: 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 ngoài luồng.

78
Mike Gray

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.

68
saidimu apale
  • 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 trừ) là 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 sự, 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 .

56
eishay

Như tôi đã nói như "Thrift vs Bộ đệm giao thức" chủ đề:

Đề cập đến So sánh so với Protobuf và so sánh 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 .

55
Grzegorz Wierzowiecki

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

8
dhruvbird

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).

7
StaxMan

Bộ đệm giao thức dường như có một đại diện nhỏ gọn hơn, nhưng đó chỉ là ấn tượng mà tôi có được từ việc đọc whitepaper của 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 một hiệu suất quan trọng trường hợp sử dụng mà yêu cầu họ.

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ó.

7
Daniel Spiewak

ProtocolBuffers là NHANH CHÓNG.
Có một điểm chuẩn đẹp ở đâ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 ;
Có thể tìm thấy triển khai C # tại kho lưu trữ Github của Marc Gravell .

6
Stefan Steiger

Và theo wiki thời gian chạy Thrift không chạy trên Windows.

6
hplbsh

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
Babra Cunningham

Đối với một, protobuf không phải là một triển khai RPC đầy đủ. Nó đòi hỏi một cái gì đó như gRPC để đi với nó. 

gPRC rất chậm so với Thrift:

http://szelei.me/rpc-benchmark-part1/

2
trilogy

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.

0
JSON

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 để 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ể định 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 của thekvs, so sánh nhiều bộ nối tiếp bao gồm tiết kiệm nhị phân, tiết kiệm và protobuf: https://github.com/thekvs/cpp-serialulators

PS: Có một serializer khác có tên YAS cũ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
Sinapse