Helpex - Trao đổi & giúp đỡ Đăng nhập
259

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ì?

259 hữu ích 2 bình luận 108k xem chia sẻ
14 trả lời 14
147

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

147 hữu ích 5 bình luận chia sẻ
79

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 ngoài luồng.

79 hữu ích 5 bình luận chia sẻ
69

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.

69 hữu ích 5 bình luận chia sẻ
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 .

57 hữu ích 5 bình luận chia sẻ
55

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 .

55 hữu ích 4 bình luận chia sẻ
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

8 hữu ích 0 bình luận chia sẻ
7

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

7 hữu ích 2 bình luận chia sẻ
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).

7 hữu ích 2 bình luận chia sẻ
6

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

6 hữu ích 4 bình luận chia sẻ
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 lưu trữ Github của Marc Gravell .

6 hữu ích 0 bình luận chia sẻ
3

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 hữu ích 2 bình luận chia sẻ
2

Đố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 hữu ích 0 bình luận chia sẻ
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 tiết kiệm nhị phân, 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 hữu ích 0 bình luận chia sẻ
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.

0 hữu ích 0 bình luận chia sẻ
loading
Không tìm thấy câu trả lời bạn tìm kiếm? Duyệt qua các câu hỏi được gắn thẻ serialization protocol-buffers thrift , hoặc hỏi câu hỏi của bạn.

Có thể bạn quan tâm

loading