Sự khác biệt chính giữa Thrift Apache, Bộ đệm giao thức Google, MessagePack, ASN.1 và Apache Avro là gì?


124

Tất cả những thứ này cung cấp tuần tự hóa nhị phân, khung RPC và IDL. Tôi quan tâm đến sự khác biệt chính giữa chúng và đặc điểm (hiệu suất, dễ sử dụng, hỗ trợ ngôn ngữ lập trình).

Nếu bạn biết bất kỳ công nghệ tương tự khác, xin vui lòng đề cập đến nó trong một câu trả lời.



@Zenikoder: Liên kết đó không có bất kỳ thông tin nào cho 2 trên 5 định dạng được yêu cầu.
CHỈ CẦN HOẠT ĐỘNG CỦA TÔI NGÀY

điều đó có thể giúp gì không : sl slideshoware.net/IgorAquerunn/pb-vs-thrift-vs-avro ?
ngực

2
dành cho những người không biết RPC - Cuộc gọi Prodecure từ xa, IDL - Ngôn ngữ định nghĩa giao diện
garg10may

Câu trả lời:


97

ASN.1 là một tiêu chuẩn ISO / ISE. Nó có một ngôn ngữ nguồn rất dễ đọc và một loạt các back-end, cả nhị phân và con người có thể đọc được. Là một tiêu chuẩn quốc tế (và là một tiêu chuẩn cũ ở đó!), Ngôn ngữ nguồn hơi bị chìm trong nhà bếp (theo cách tương tự như Đại Tây Dương hơi ẩm ướt) nhưng nó được chỉ định rất tốt và có lượng hỗ trợ khá . (Bạn có thể tìm thấy thư viện ASN.1 cho bất kỳ ngôn ngữ nào bạn đặt tên nếu bạn đào đủ kỹ và nếu không có thư viện ngôn ngữ C tốt mà bạn có thể sử dụng trong FFI.) Đây là ngôn ngữ được tiêu chuẩn hóa, được ghi lại một cách ám ảnh và có một vài hướng dẫn tốt có sẵn là tốt.

Thrift không phải là một tiêu chuẩn. Nó có nguồn gốc từ Facebook và sau đó là nguồn mở và hiện là một dự án cấp cao nhất của Apache. Nó không được ghi chép rõ ràng - đặc biệt là các cấp hướng dẫn - và trong nháy mắt (thừa nhận ngắn gọn) của tôi dường như không thêm bất cứ điều gì khác, những nỗ lực trước đó chưa làm được (và trong một số trường hợp tốt hơn). Để công bằng với nó, nó có một số ngôn ngữ khá ấn tượng mà nó hỗ trợ vượt trội bao gồm một số ngôn ngữ không chính thống cao cấp hơn. IDL cũng mơ hồ giống như C.

Bộ đệm giao thức không phải là một tiêu chuẩn. Nó là một sản phẩm của Google đang được phát hành cho cộng đồng rộng lớn hơn. Nó hơi bị giới hạn về các ngôn ngữ được hỗ trợ ngoài hộp (nó chỉ hỗ trợ C ++, Python và Java) nhưng nó có rất nhiều hỗ trợ của bên thứ ba cho các ngôn ngữ khác (có chất lượng biến đổi cao). Google thực hiện khá nhiều công việc của họ bằng cách sử dụng Bộ đệm giao thức, do đó, đây là một giao thức được thử nghiệm trong trận chiến (mặc dù không bị chiến đấu như ASN.1. Nó có tài liệu tốt hơn nhiều so với Thrift, nhưng, là một Sản phẩm của Google, rất có thể không ổn định (theo nghĩa là luôn thay đổi, không phải theo nghĩa không đáng tin cậy). IDL cũng giống như C.

Tất cả các hệ thống trên sử dụng một lược đồ được xác định trong một số loại IDL để tạo mã cho ngôn ngữ đích sau đó được sử dụng trong mã hóa và giải mã. Avro thì không. Việc gõ của Avro là động và dữ liệu lược đồ của nó được sử dụng trực tiếp trong thời gian chạy để mã hóa và giải mã (có một số chi phí rõ ràng khi xử lý, nhưng cũng có một số lợi ích rõ ràng khi sử dụng ngôn ngữ động vis và không cần các loại gắn thẻ, v.v.) . Lược đồ của nó sử dụng JSON, giúp hỗ trợ Avro bằng ngôn ngữ mới dễ quản lý hơn một chút nếu đã có thư viện JSON. Một lần nữa, như với hầu hết các hệ thống mô tả giao thức phát minh lại bánh xe, Avro cũng không được chuẩn hóa.

Cá nhân, mặc dù mối quan hệ yêu / ghét của tôi với nó, tôi có thể sử dụng ASN.1 cho hầu hết các mục đích truyền tin và RPC, mặc dù nó không thực sự có ngăn xếp RPC (bạn phải tạo một, nhưng IOC tạo ra nó đủ đơn giản).


3
Cảm ơn đã giải thích chi tiết. Nhưng những gì về phiên bản, tôi nghe nói protobuf có thể xử lý điều đó, còn những thư viện khác và làm thế nào nó có thể sử dụng chung? Ngoài ra, có vẻ như Avro hiện có IDL với cú pháp giống C ngoài JSON.
andreypopp

2
ASN.1 hỗ trợ phiên bản thủ công thông qua các ...dấu mở rộng hoặc tự động thông qua EXTENSIBILITY IMPLIEDtrong tiêu đề mô-đun. Bộ đệm giao thức, IIRC, hỗ trợ phiên bản thủ công. Tôi không biết nếu nó hỗ trợ bất cứ điều gì như khả năng mở rộng ngụ ý (và quá lười để tìm kiếm nó). Thrift cũng hỗ trợ một số phiên bản, nhưng một lần nữa, nó tấn công tôi như một quy trình thủ công mà không có khả năng mở rộng ngụ ý.
CHỈ CẦN HOẠT ĐỘNG CỦA TÔI NGÀY

7
Đối với bản ghi, Bộ đệm giao thức luôn mã hóa rõ ràng các trường theo số và không bao giờ có lỗi ở cấp thư viện nếu có thêm các trường và các trường bị thiếu không phải là lỗi nếu chúng được đánh dấu tùy chọn hoặc rõ ràng. Vì vậy, tất cả các tin nhắn bộ đệm giao thức có EXTENSIBILITY IMPLIED.
Kevin Cathcart

bởi IOC - bạn có nghĩa là đảo ngược kiểm soát? cái gì sẽ sử dụng cho ngăn xếp RPC trong PHP, giống như phần mở rộng XML-RPC? hoặc người ta sẽ phải tự viết một cái gì đó?
Stann

4
Avro linh hoạt hơn vì nó cho phép hoặc hoạt động linh hoạt trên lược đồ đã xác định hoặc tạo các lớp soạn sẵn. Theo kinh nghiệm của tôi, nó rất mạnh: sức mạnh của nó nằm trong bộ tính năng phong phú của nó, bao gồm cả trình tạo RPC (đây là một tính năng phổ biến với Thrift).
Paolo Maresca

38

Chúng tôi vừa thực hiện một nghiên cứu nội bộ về serial serial, đây là một số kết quả (để tôi tham khảo trong tương lai!)

Thrift = tuần tự hóa + ngăn xếp RPC

Sự khác biệt lớn nhất là Thrift không chỉ là một giao thức tuần tự hóa, nó là một ngăn xếp RPC hoàn toàn giống như một ngăn xếp SOAP hiện đại. Vì vậy, sau khi tuần tự hóa, các đối tượng có thể (nhưng không bắt buộc) được gửi giữa các máy qua TCP / IP. Trong SOAP, bạn đã bắt đầu với một tài liệu WSDL mô tả đầy đủ các dịch vụ có sẵn (phương thức từ xa) và các đối số / đối tượng dự kiến. Những đối tượng đó đã được gửi qua XML. Trong Thrift, tệp .thrift mô tả đầy đủ các phương thức có sẵn, các đối tượng tham số dự kiến ​​và các đối tượng được tuần tự hóa thông qua một trong các trình tuần tự hóa có sẵn (với Compact Protocol, một giao thức nhị phân hiệu quả, phổ biến nhất trong sản xuất).

ASN.1 = Ông nội

ASN.1 được thiết kế bởi những người viễn thông trong thập niên 80 và rất khó sử dụng do sự hỗ trợ của thư viện hạn chế so với các bộ nối tiếp gần đây xuất hiện từ những người CompSci. Có hai biến thể, mã hóa DER (nhị phân) và mã hóa PEM (ascii). Cả hai đều nhanh, nhưng DER nhanh hơn và hiệu quả hơn về kích thước của cả hai. Trong thực tế, ASN.1 DER có thể dễ dàng theo kịp (và đôi khi đánh bại) các bộ nối tiếp được thiết kế 30 nămsau đó, một minh chứng cho thiết kế kỹ thuật tốt của nó. Nó rất nhỏ gọn, nhỏ hơn so với Giao thức đệm và tiết kiệm, chỉ bị Avro đánh bại. Vấn đề là có các thư viện tuyệt vời để hỗ trợ và ngay bây giờ Bouncy Castle dường như là thư viện tốt nhất cho C # / Java. ASN.1 là vua trong các hệ thống bảo mật và tiền điện tử và sẽ không biến mất, vì vậy đừng lo lắng về 'bằng chứng trong tương lai'. Chỉ cần có một thư viện tốt ...

MessagePack = giữa gói

Nó không tệ nhưng nó không phải là nhanh nhất, cũng không phải nhỏ nhất cũng không được hỗ trợ tốt nhất. Không có lý do sản xuất để chọn nó.

Chung

Ngoài ra, chúng khá giống nhau. Hầu hết là các biến thể của TLV: Type-Length-Valuenguyên tắc cơ bản .

Bộ đệm giao thức (có nguồn gốc từ Google), Avro (dựa trên Apache, được sử dụng trong Hadoop), Thrift (có nguồn gốc từ Facebook, hiện là dự án Apache) và ASN.1 (có nguồn gốc từ viễn thông) đều liên quan đến một số cấp độ tạo mã trong đó bạn lần đầu tiên thể hiện dữ liệu của mình trong trình tuần tự hóa định dạng cụ thể, sau đó trình biên dịch "trình biên dịch" sẽ tạo mã nguồn cho ngôn ngữ của bạn thông qua code-genpha. Nguồn ứng dụng của bạn sau đó sử dụng các code-genlớp này cho IO. Lưu ý rằng một số triển khai nhất định (ví dụ: thư viện Avro của Microsoft hoặc ProtoBuf.NET của Marc Gavel) cho phép bạn trực tiếp trang trí các đối tượng POCO / POJO cấp ứng dụng của mình và sau đó thư viện sử dụng trực tiếp các lớp được trang trí đó thay vì bất kỳ lớp mã gen nào. Chúng tôi đã thấy điều này mang lại hiệu suất tăng cường vì nó loại bỏ giai đoạn sao chép đối tượng (từ các trường POCO / POJO cấp ứng dụng sang các trường mã-gen).

Một số kết quả và một dự án trực tiếp để chơi với

Dự án này ( https://github.com/sidshetye/SerialulatorsCompare ) so sánh các serial serial quan trọng trong thế giới C #. Những người Java đã có một cái gì đó tương tự .

1000 iterations per serializer, average times listed
Sorting result by size
Name                Bytes  Time (ms)
------------------------------------
Avro (cheating)       133     0.0142
Avro                  133     0.0568
Avro MSFT             141     0.0051
Thrift (cheating)     148     0.0069
Thrift                148     0.1470
ProtoBuf              155     0.0077
MessagePack           230     0.0296
ServiceStackJSV       258     0.0159
Json.NET BSON         286     0.0381
ServiceStackJson      290     0.0164
Json.NET              290     0.0333
XmlSerializer         571     0.1025
Binary Formatter      748     0.0344

Options: (T)est, (R)esults, s(O)rt order, (S)erializer output, (D)eserializer output (in JSON form), (E)xit

Serialized via ASN.1 DER encoding to 148 bytes in 0.0674ms (hacked experiment!)

3
ASN.1 cũng có BER (Quy tắc mã hóa cơ bản), PER (Quy tắc mã hóa đóng gói) và XER (Quy tắc mã hóa XML). DER là một biến thể của BER được sử dụng chủ yếu cho mật mã vì nó đảm bảo mã hóa duy nhất cho mỗi mốc thời gian. Cả BER và PER có thể hiệu quả hơn DER. Hầu hết các thư viện xử lý DER. Một số không xử lý tất cả các cấu trúc BER chính xác. Dành cho những ai muốn tìm hiểu thêm: luca.ntop.org/Teaching/Appunti/asn1.html
Joe Steele

Nó cũng có các quy tắc mã hóa ký hiệu đối tượng JER - JavaScript. Bạn cũng có thể xác định quy tắc mã hóa của riêng mình bằng ECN (Ký hiệu điều khiển mã hóa). Danh sách tốt các thông số kỹ thuật với các liên kết tải xuống: oss.com/asn1/resource/stiterias-define-asn1.html
Dmitry

There are two variants, DER (binary) encoding and PEM (ascii) encoding. Hãy nhớ rằng PEM chỉ là dữ liệu nhị phân được mã hóa cơ sở 64 trong các nhận xét BEGIN END. Dữ liệu nhị phân này có thể đã được tạo bằng mã hóa DER, vì vậy thật lạ khi so sánh PEM và DER.
RafalS

14

Thêm vào quan điểm hiệu suất, Uber gần đây đã đánh giá một số thư viện này trên blog kỹ thuật của họ:

https://eng.uber.com/trip-data-squeeze/

Người chiến thắng cho họ? MessagePack + zlib để nén

Mục tiêu của chúng tôi là tìm ra sự kết hợp giữa giao thức mã hóa và thuật toán nén với kết quả nhỏ gọn nhất ở tốc độ cao nhất. Chúng tôi đã thử nghiệm giao thức mã hóa và kết hợp thuật toán nén trên 2.219 chuyến đi ẩn danh từ Uber New York City (đặt trong tệp văn bản dưới dạng JSON).

Bài học ở đây là yêu cầu của bạn thúc đẩy thư viện nào phù hợp với bạn. Đối với Uber, họ không thể sử dụng giao thức dựa trên IDL do tính chất thông điệp của thông điệp mà họ có. Điều này đã loại bỏ một loạt các tùy chọn. Ngoài ra, đối với họ, nó không chỉ có thời gian mã hóa / giải mã thô mà còn hoạt động, mà cả kích thước của dữ liệu khi nghỉ ngơi.

Kết quả kích thước

Kết quả kích thước

Kết quả tốc độ

nhập mô tả hình ảnh ở đây


13

Một điều quan trọng về ASN.1 là, ist được thiết kế để đặc tả không thực hiện. Do đó, rất tốt trong việc ẩn / bỏ qua chi tiết triển khai trong bất kỳ ngôn ngữ lập trình "thực" nào.

Nhiệm vụ của Trình biên dịch ASN.1 là áp dụng Quy tắc mã hóa cho tệp asn1 và tạo từ cả hai mã thực thi. Quy tắc mã hóa có thể được đưa ra trong Ký hiệu mã hóa (ECN) hoặc có thể là một trong những quy tắc được tiêu chuẩn hóa như BER / DER, PER, XER / EXER. Đó là ASN.1 là các loại và cấu trúc, Quy tắc mã hóa xác định mã hóa trên dây và cuối cùng nhưng không kém phần Trình biên dịch chuyển nó sang ngôn ngữ lập trình của bạn.

Trình biên dịch miễn phí hỗ trợ C, C ++, C #, Java và Erlang theo hiểu biết của tôi. Các trình biên dịch thương mại (nhiều đến đắt và bằng sáng chế / giấy phép) rất linh hoạt, thường hoàn toàn cập nhật và đôi khi thậm chí nhiều ngôn ngữ hơn, nhưng hãy xem các trang web của họ (OSS Nokalva, Marben, v.v.).

Thật đáng ngạc nhiên khi dễ dàng chỉ định giao diện giữa các bên thuộc các nền văn hóa lập trình hoàn toàn khác nhau (ví dụ: "người" nhúng và "nông dân máy chủ") bằng cách sử dụng các kỹ thuật này: tệp asn.1, quy tắc Mã hóa, ví dụ BER và sơ đồ Tương tác UML . Không phải lo lắng về cách nó được thực hiện, hãy để mọi người sử dụng "thứ của họ"! Đối với tôi nó đã làm việc rất tốt. Btw.: Tại trang web của OSS Nokalva, bạn có thể tìm thấy ít nhất hai cuốn sách miễn phí để tải về ASN.1 (một của Larmouth còn lại bởi Dubuisson).

IMHO hầu hết các sản phẩm khác chỉ cố gắng trở thành một máy phát điện RPC-stub khác, bơm rất nhiều không khí vào vấn đề nối tiếp. Vâng, nếu một người cần điều đó, một người có thể ổn. Nhưng đối với tôi, chúng trông giống như những phát minh lại của Sun-RPC (từ cuối thập niên 80), nhưng, hey, nó cũng hoạt động tốt.


7

Trái phiếu của Microsoft ( https://github.com/Microsoft/bond ) rất ấn tượng với hiệu suất, chức năng và tài liệu. Tuy nhiên, hiện tại nó không hỗ trợ nhiều nền tảng mục tiêu (ngày 13 tháng 12 năm 2015). Tôi chỉ có thể cho rằng đó là vì nó rất mới. hiện tại nó hỗ trợ python, c # và c ++. Nó đang được sử dụng bởi MS ở khắp mọi nơi. Tôi đã thử nó, với tôi là nhà phát triển ac # sử dụng trái phiếu tốt hơn sử dụng protobuf, tuy nhiên tôi cũng đã sử dụng tiết kiệm, vấn đề duy nhất tôi gặp phải là với tài liệu, tôi phải thử nhiều thứ để hiểu mọi thứ được thực hiện như thế nào.

Rất ít tài nguyên trên Bond như sau ( https://news.ycombinator.com/item?id=8866694 , https://news.ycombinator.com/item?id=8866848 , https://microsoft.github.io/ trái phiếu / why_bond.html )


5

Về hiệu năng, một điểm dữ liệu là điểm chuẩn jvm-serialators - nó khá cụ thể, các thông báo nhỏ, nhưng có thể hữu ích nếu bạn đang ở trên nền tảng Java. Tôi nghĩ rằng hiệu suất nói chung thường sẽ không phải là sự khác biệt quan trọng nhất. Ngoài ra: KHÔNG BAO GIỜ lấy lời của các tác giả làm phúc âm; nhiều tuyên bố được quảng cáo là không có thật (ví dụ trang web của packpack có một số tuyên bố không rõ ràng; nó có thể nhanh, nhưng thông tin rất sơ sài, trường hợp sử dụng không thực tế lắm).

Một sự khác biệt lớn là liệu có phải sử dụng lược đồ hay không (PB, Thrift ít nhất; Avro nó có thể là tùy chọn; ASN.1 tôi cũng nghĩ vậy; MsgPack, không nhất thiết).

Ngoài ra: theo tôi là tốt để có thể sử dụng thiết kế mô-đun nhiều lớp; có nghĩa là, lớp RPC không nên ra lệnh định dạng dữ liệu, tuần tự hóa. Thật không may, hầu hết các ứng cử viên làm chặt chẽ những điều này.

Cuối cùng, khi chọn định dạng dữ liệu, ngày nay hiệu suất không loại trừ việc sử dụng các định dạng văn bản. Có các trình phân tích cú pháp JSON nhanh (và trình phân tích cú pháp xml phát trực tuyến khá nhanh); và khi xem xét khả năng tương tác từ các ngôn ngữ kịch bản và dễ sử dụng, các định dạng và giao thức nhị phân có thể không phải là lựa chọn tốt nhất.


Cảm ơn bạn đã chia sẻ kinh nghiệm, nhưng tôi nghĩ rằng tôi vẫn cần định dạng nhị phân (tôi có một lượng dữ liệu thực sự lớn) và có thể sẽ gắn bó với Avro.
andreypopp

Vâng có thể có ý nghĩa sau đó. Bạn có thể muốn sử dụng nén ở bất kỳ tốc độ nào, bất kể định dạng nào để sử dụng (LZF là tốt vì nó rất nhanh để nén / giải nén, so với gzip / deflate).
StaxMan
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.