ความแตกต่างที่ใหญ่ที่สุดของ Thrift vs Protocol Buffers คืออะไร?


286

อะไรคือข้อดีและข้อเสียที่ใหญ่ที่สุดของApache Thriftเทียบกับโปรโตคอลบัฟเฟอร์ของ Google ?


4
Marc Gravell มีห้องสมุดที่ทำงานกับ Googles protobuf ที่ชื่อว่า protobuf.net และอยู่ที่code.google.com/p/protobuf-net
RCIX

5
คำถามนี้และคำตอบต่อไปนี้มีอายุประมาณ 6 ปี อาจมีการเปลี่ยนแปลงมากมาย
AlikElzin-kilaka

คำตอบ:


159

พวกเขาทั้งสองมีคุณสมบัติเดียวกันหลายอย่าง อย่างไรก็ตามมีความแตกต่าง:

  • Thrift รองรับ 'ข้อยกเว้น'
  • โปรโตคอลบัฟเฟอร์มีเอกสาร / ตัวอย่างที่ดีกว่ามาก
  • เจริญเติบโตอย่างรวดเร็วมีSetชนิดในตัว
  • โปรโตคอลบัฟเฟอร์อนุญาตให้ "ส่วนขยาย" - คุณสามารถขยายโปรโตภายนอกเพื่อเพิ่มฟิลด์พิเศษในขณะที่ยังคงอนุญาตให้โค้ดภายนอกทำงานบนค่าต่างๆ ไม่มีวิธีการทำเช่นนี้ใน Thrift
  • ฉันพบว่าโปรโตคอลบัฟเฟอร์อ่านง่ายกว่ามาก

โดยพื้นฐานแล้วมันค่อนข้างเท่ากัน (กับ Protocol Buffers มีประสิทธิภาพมากกว่าเล็กน้อยจากสิ่งที่ฉันอ่าน)


16
งานนำเสนอนี้อธิบายถึงพวกเขาได้ดีในปี 2013 slideshare.net/IgorAnishchenko/pb-vs-thrift-vs-avro
BAR

13
ความมัธยัสถ์รองรับภาษามากกว่า 10 ภาษา
Elijah Saounkine

1
สำหรับบางภาษาคุณสามารถเพิ่มส่วนขยาย ตัวอย่างเช่น Thrift สร้างคลาสบางส่วนสำหรับ C # ซึ่งง่ายต่อการขยาย อย่างไรก็ตามนั่นไม่ใช่กฎทั่วไปนั่นเป็นเรื่องจริง
JensG

การสนับสนุน grpc 1.0 (proto3) mapยัง
KindDragon

85

ความแตกต่างที่สำคัญอีกประการหนึ่งคือภาษาที่รองรับโดยค่าเริ่มต้น

  • โปรโตคอลบัฟเฟอร์: Java, Android Java, C ++, Python, Ruby, C #, Go, Objective-C, Node.js
  • เจริญเติบโตอย่างรวดเร็ว: Java, C ++, Python, Ruby, C #, Go, Objective-C, JavaScript, Node.js, Erlang, PHP, Perl, Haskell, Smalltalk, OCaml, Delphi, D, Haxe

ทั้งสองสามารถขยายไปยังแพลตฟอร์มอื่น ๆ ได้ แต่สิ่งเหล่านี้คือการเชื่อมโยงภาษาที่พร้อมใช้งานทันที


16
protobuf มีการสนับสนุนที่ดีเยี่ยมทับทิมgithub.com/macks/ruby-protobufและcode.google.com/p/ruby-protobuf ฉันใช้ protobuf จาก C # (3.5) และ Ruby, C # เป็นอันดับข้อมูลและเมื่อจำเป็น Ruby deserializing และทำงานกับงาน
ไบรอัน Bailliache

6
code.google.com/p/protobuf/wiki/ThirdPartyAddOnsแสดงรายการ PHP, Ruby, Erlang, Perl, Haskell, C #, OCaml plus Actiona Script, Common Lisp, Go, Lua, Mathlab, Visual Basic, Scala ความคิดเหล่านี้เป็นการนำไปใช้โดยบุคคลที่สามทั้งหมด
Igor Gatis

คุณสามารถใช้ไฟล์ protobuf C ++ โดยตรงในวัตถุประสงค์ c (สำหรับทั้ง iOS และ OS X) ตรวจสอบ qn นี้
Tushar Koul

ฉันเห็นcode.google.com/p/protobuf-netมักถูกกล่าวถึงว่าเป็นพอร์ต protobuf สำหรับ C # แต่มันไม่เป็นความจริงอย่างสมบูรณ์ หนึ่งในคุณสมบัติที่สำคัญของ Protobuf และ Thrift คือคำจำกัดความของโครงสร้างภายนอกดังนั้นคำจำกัดความเดียวกันนี้สามารถใช้ได้กับภาษาที่แตกต่างกัน protobuf-net ไม่รองรับคุณสมบัตินี้เพราะมันฝังนิยามโครงสร้างไว้ในรหัส C #
Andriy Tylychko

@AndyT: มันเป็นที่ถกเถียงกัน - มันขึ้นอยู่กับว่ามันเป็นข้อได้เปรียบที่คำจำกัดความของโครงสร้างเป็นภาษาภายนอกทุกภาษาที่คุณต้องการให้การสนับสนุนหรือไม่ ด้วย protobuf-net คุณกำหนดโครงสร้างข้อมูลของคุณใน C # และสร้างไฟล์. proto จากนั้นซึ่งสามารถใช้เพื่อสร้างการสนับสนุนในภาษาอื่น ๆ ฉันคิดว่านี่เป็นข้อได้เปรียบเนื่องจากฉันใช้ภาษา C-centric มากและอยู่ระหว่างการรวม Android / Java เข้ากับแอปพลิเคชั่น. Net ที่มีขนาดใหญ่ ดังนั้นฉันต้องการพิจารณาคลาส C # ของฉันต่อไปเพื่อเป็นนิยามโครงสร้างที่ชัดเจน
RenniePet

73

RPC เป็นความแตกต่างที่สำคัญอีกประการหนึ่ง Thrift สร้างรหัสเพื่อใช้ไคลเอนต์ RPC และเซิร์ฟเวอร์ซึ่ง Protocol Buffers ดูเหมือนว่าส่วนใหญ่ออกแบบมาเป็นรูปแบบการแลกเปลี่ยนข้อมูลเพียงอย่างเดียว


9
ที่ไม่เป็นความจริง. โปรโตคอลบัฟเฟอร์กำหนด RPC service api และมีบางไลบรารีที่พร้อมใช้งานสำหรับการส่งข้อความ
Stephen

7
ฉันไม่ได้บอกว่า Protobuf ไม่ได้กำหนด RPC เพียง แต่ดูเหมือนว่ามันจะไม่ได้รับการออกแบบมาสำหรับสิ่งนั้นอย่างน้อยก็ไม่ใช่ว่าทุกคนจะสามารถเข้าถึงได้ อ่านความคิดเห็นของวิศวกร Google ที่นี่
saidimu apale

9
ที่สำคัญกว่า Thrift มีการสนับสนุน RPC ในตัวปัจจุบัน Protobuf อาศัยห้องสมุดบุคคลที่สามซึ่งหมายถึงการมองที่น้อยลงการทดสอบน้อยลงและรหัสที่เชื่อถือได้น้อยลง
อเล็กซ์โทมัส

2
สำหรับฉันมันเป็นจุดที่ดีเกี่ยวกับ ProtoBuf หากคุณต้องการทำให้เป็นอันดับเท่านั้นคุณไม่ได้เพิ่มรหัสที่ไร้ประโยชน์ และถ้าในอนาคตคุณต้องส่งโดย RPC ไม่มีปัญหามันสามารถทำงานได้ ฉันใช้ Netty สำหรับเครือข่ายและ Protobuf ได้รับการผสมผสานอย่างสมบูรณ์แบบดังนั้นจึงไม่มีปัญหาไม่มีการทดสอบและเพิ่มประสิทธิภาพการทำงาน
Kikiwa

14
ในความเป็นจริง Protobufs ออกแบบโดยคำนึงถึง RPC Google เพิ่งเปิดแหล่งที่มาขององค์ประกอบนั้นอย่างเป็นธรรมเมื่อเร็ว ๆ นี้ - grpc.io
andybons

57
  • Protobuf วัตถุที่ต่อเนื่องนั้นมีขนาดเล็กกว่าของ Thrift ประมาณ 30%
  • การกระทำส่วนใหญ่ที่คุณอาจต้องการทำกับวัตถุ protobuf (สร้าง, ซีเรียลไลซ์, ดีซีเรียลไลซ์) นั้นช้ากว่าความเจริญถ้าคุณเปิดoption optimize_for = SPEEDเครื่อง
  • Thrift มีโครงสร้างข้อมูลที่สมบูรณ์ยิ่งขึ้น (แผนที่, Set)
  • Protobuf API นั้นดูสะอาดกว่า แต่คลาสที่สร้างขึ้นทั้งหมดจะถูกบรรจุเป็นคลาสภายในซึ่งไม่ค่อยดีนัก
  • Thrift enums ไม่ใช่ Java Enums ที่แท้จริงนั่นคือพวกเขาเป็นเพียง ints Protobuf มี enums Java จริง

เพื่อดูความแตกต่างอย่างใกล้ชิดตรวจสอบซอร์สโค้ดต่างกันในโครงการโอเพ่นซอร์สนี้


1
คำแนะนำด่วน: มันจะเรียบร้อยถ้ามีรูปแบบอื่นที่ไม่ใช่ไบนารี (xml หรือ json?) ที่ใช้เป็นพื้นฐาน ยังไม่มีการทดสอบที่ดีที่แสดงแนวโน้มทั่วไป - สมมติว่า PB และ Thrift มีประสิทธิภาพมากขึ้น แต่ถ้าเป็นเช่นนั้นคำถามส่วนใหญ่จะเป็นคำถามเปิด
StaxMan

4
0.02 วินาที?! ฉันไม่ได้มีชนิดของเวลาว่าง
คริส S

1
ตอนนี้ Thrift มีหลายโปรโตคอล (รวมถึง TCompactProtocol) ฉันคิดว่ากระสุนแรกไม่ได้ใช้อีกต่อไป
Janus Troelsen

13
ตัวเลือกการเพิ่มประสิทธิภาพความเร็วเป็นค่าเริ่มต้นสำหรับบัฟเฟอร์โปรโตคอล ( code.google.com/apis/protocolbuffers/docs/proto.html )
Willem

5
เราได้รับวัตถุขนาดเล็กกว่า 30% ด้วยการตั้งค่า "optimization_for = speed" หรือไม่? หรือว่าถูกบุกรุก
Prashant Sharma

56

ขณะที่ผมได้กล่าวว่าเป็น"ทริฟท์ VS บัฟเฟอร์โปรโตคอล"หัวข้อ:

หมายถึงThrift เทียบกับ Protobuf vs JSON การเปรียบเทียบ :

นอกจากนี้ยังมีเครื่องมือเพิ่มเติมที่น่าสนใจมากมายสำหรับโซลูชันเหล่านั้นซึ่งอาจเป็นตัวตัดสิน นี่คือตัวอย่างสำหรับ Protobuf: Protobuf-Wireshark , protobufeditor


10
ตอนนี้เป็นวงกลมเต็ม คุณโพสต์คำตอบเดียวกันกับคำถามสามข้อ (ที่คล้ายกัน) เสมอการลิงก์กลับไปที่หรือ ฉันรู้สึกว่าฉันเล่น Zelda และพลาดสัญญาณ
ChrisR

+ ChrisR heh ฉันจำไม่ได้ว่ามันเกิดขึ้นได้อย่างไร แม้ว่าจะมีคำถามที่คล้ายกันสองสามข้อบางทีฉันควรสร้างโครงสร้างสามอย่างแทนวงจร วันหนึ่ง ... มันเป็นคำถามที่เก่ามากและตอนนี้ฉันกำลังตอบกลับจากโทรศัพท์ อย่างไรก็ตามขอบคุณสำหรับการจับ!
Grzegorz Wierzowiecki

6
"Thrift มาพร้อมกับบทช่วยสอนที่ดี" - ตลกดีขนาดไหน มันเป็นบทเรียนที่ไม่สมบูรณ์ที่สุดที่ฉันเคยเห็น ทันทีที่คุณต้องการทำอะไรบางอย่างที่อยู่ข้างๆ TSimpleServer คุณจะติดอยู่ที่นั่น
Marian Klühspies

ทริฟท์ก็มีปลั๊กอิน Wireshark: github.com/andrewcox/wireshark-with-thrift-plugin
CCoder

8

Protocol Buffers ดูเหมือนจะมีขนาดกะทัดรัดกว่า แต่เป็นเพียงความประทับใจที่ฉันได้รับจากการอ่านกระดาษสีขาวของ Thrift ในคำพูดของตัวเอง:

เราตัดสินใจเปรียบเทียบการเพิ่มประสิทธิภาพการจัดเก็บข้อมูลที่รุนแรง (เช่นการบรรจุจำนวนเต็มขนาดเล็กลงใน ASCII หรือใช้รูปแบบความต่อเนื่อง 7 บิต) เพื่อความเรียบง่ายและชัดเจนในรหัส การปรับเปลี่ยนเหล่านี้สามารถทำได้อย่างง่ายดายหากและเมื่อเราพบกรณีการใช้งานที่มีความสำคัญต่อประสิทธิภาพที่ต้องการ

นอกจากนี้อาจเป็นเพียงความประทับใจของฉัน แต่ Protocol Buffers ดูเหมือนจะมี abstractions ที่หนากว่าในการกำหนดเวอร์ชันของ struct Thrift มีการสนับสนุนเวอร์ชันบางอย่าง แต่ใช้ความพยายามเล็กน้อยเพื่อให้เกิดขึ้น


1
ทำไมข้อเท็จจริงที่ว่า Thrift ไม่ยอมรับว่ามีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้ทำให้คุณเชื่อว่า Protocol Buffers เป็นอย่างไร
Michael Mior

1
บัฟเฟอร์โปรโตคอลจะใช้การเข้ารหัสจำนวนเต็มความยาวของตัวแปรทั้งสำหรับค่าและสำหรับตัวระบุฟิลด์ ดังนั้นกรณีทั่วไปของการส่งฟิลด์ int ที่มีค่าน้อยจะเป็นสองไบต์ไม่ใช่ int16 และ int32
poolie

"บัฟเฟอร์โปรโตคอลใช้การเข้ารหัสจำนวนเต็มความยาวตัวแปร" - TCompactProtocol จะทำเช่นนั้น
JensG

8

ฉันสามารถรับประสิทธิภาพที่ดีขึ้นด้วยโปรโตคอลแบบข้อความเมื่อเทียบกับ protobuff บน python อย่างไรก็ตามไม่มีการตรวจสอบประเภทหรือการแปลง utf8 แฟนซีอื่น ๆ ... ที่ protobuff นำเสนอ

ดังนั้นถ้าซีเรียลไลซ์เซชั่น / ดีซีเรียลไลเซชันเป็นสิ่งที่คุณต้องการคุณก็อาจจะใช้อย่างอื่น

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


7

สิ่งหนึ่งที่เห็นได้ชัดที่ยังไม่ได้กล่าวถึงนั้นอาจเป็นได้ทั้งโปรหรือคอน (และเหมือนกันสำหรับทั้งคู่) คือมันเป็นโปรโตคอลไบนารี่ สิ่งนี้ยอมให้มีการแทนขนาดกะทัดรัดมากขึ้นและอาจมีประสิทธิภาพมากขึ้น (ข้อดี) แต่ด้วยความสามารถในการอ่านที่ลดลง (หรือมากกว่านั้นคือ debuggability)

นอกจากนี้ทั้งสองยังมีการสนับสนุนเครื่องมือน้อยกว่ารูปแบบมาตรฐานเช่น xml (และอาจเป็น json)

(EDIT) นี่คือการเปรียบเทียบที่น่าสนใจที่มีความแตกต่างทั้งด้านขนาดและประสิทธิภาพและมีตัวเลขสำหรับรูปแบบอื่น ๆ (xml, json) เช่นกัน


3
มันไม่สำคัญเลยที่จะเอาท์พุทบัฟเฟอร์ของโปรโตคอลไปที่การแสดงข้อความที่มนุษย์อ่านได้มากกว่า XML: my_proto.DebugString () ตัวอย่างเช่นดูcode.google.com/apis/protocolbuffers/docs/overview.html
SuperElectric

แน่นอนเช่นเดียวกันสำหรับทุกรูปแบบไบนารี - แต่นั่นไม่ได้ทำให้พวกเขาสามารถอ่านได้ตามที่เป็นอยู่ (แก้ปัญหาบนสาย) ที่แย่กว่านั้นสำหรับ protobuf คุณจำเป็นต้องมี schema def เพื่อทราบชื่อฟิลด์
StaxMan

Thrift รองรับโปรโตคอลที่แตกต่างกันแม้ผู้ใช้กำหนดเอง คุณสามารถใช้เลขฐานสองขนาดกะทัดรัด json หรือสิ่งที่คุณคิดค้นเมื่อสัปดาห์ที่แล้ว
JensG

6

และตามวิกินั้นรันไทม์ของ Thrift ไม่ได้ทำงานบน Windows


5
ฉันเรียกใช้ Thrift บน Windows ได้สำเร็จ ใช้ windows fork ที่github.com/aubonbeurre/thrift
Sergey Podobry

20
ขณะนี้สาขา mainline เป็นทางการก็รองรับ Windows ได้เช่นกัน
Janus Troelsen

5
@dalle - Alex P เพิ่มการสนับสนุนเธรด Boost ใน Thrift ตอนนี้เป็นเธรดเริ่มต้นสำหรับ Windows * NIX มีค่าเริ่มต้นเป็น pthreads และเพื่อยืนยัน Janus T, Thrift ตอนนี้รองรับ Windows อย่างเต็มที่
pmont

21
นี่คือข้อมูลที่ล้าสมัย Thrift ทำงานได้อย่างสมบูรณ์บน Windows เป็นเวลานาน
JensG

6

ProtocolBuffers เร็วกว่า
มีเกณฑ์มาตรฐานที่ดีอยู่ที่นี่:
http://code.google.com/p/thrift-protobuf-compare/wiki/Benchmarking

คุณอาจต้องการดูเป็น Avro เนื่องจาก Avro นั้นเร็วกว่า
Microsoft มีแพ็คเกจที่นี่:
http://www.nuget.org/packages/Microsoft.Hadoop.Avro

โดยเร็วที่สุดที่ฉันเคยเห็นคือCap'nProto ;
AC # การดำเนินงานที่สามารถพบได้ที่Github-พื้นที่เก็บข้อมูลของ Marc Gravell


4

ฉันคิดว่าประเด็นเหล่านี้ส่วนใหญ่พลาดความจริงพื้นฐานไปแล้วว่า Thrift เป็นเฟรมเวิร์ก RPC ซึ่งมีความสามารถในการจัดลำดับข้อมูลโดยใช้วิธีการที่หลากหลาย (ไบนารี, XML, ฯลฯ )

Protocol Buffers ได้รับการออกแบบมาเพื่อการซีเรียลไลซ์เซชั่นโดยแท้ แต่ไม่ใช่กรอบอย่างเช่น Thrift


3
คุณหมายถึงอะไรตามกรอบ RPC และแตกต่างจาก gRPC ของprotobufอย่างไร
marcelocra

gRPC ไม่ได้รับการบรรจุพร้อมกับโปรโตฟูฟ มันถูกพัฒนาเหมือน 10 ปีหลังจากนั้น Thrift มาพร้อมกับกรอบ RPC เต็มรูปแบบ มันถูกสร้างขึ้นมาด้วยกัน
ตอนจบ


0

มีบางจุดที่ยอดเยี่ยมที่นี่และฉันจะเพิ่มอีกหนึ่งในกรณีที่เส้นทางของคนข้าม

Thrift มีตัวเลือกให้คุณเลือกระหว่าง serializer แบบประหยัด - ฐานสองและรุ่นประหยัดขนาดกะทัดรัด thrift-binary จะมีประสิทธิภาพที่ยอดเยี่ยม แต่ขนาดแพ็กเก็ตที่ใหญ่กว่าในขณะที่ขนาดกะทัดรัดกะทัดรัดจะให้การบีบอัดที่ดี แต่ต้องการพลังการประมวลผลที่มากขึ้น สิ่งนี้มีประโยชน์เพราะคุณสามารถสลับไปมาระหว่างสองโหมดนี้ได้อย่างง่ายดายเหมือนกับการเปลี่ยนบรรทัดของโค้ด (heck หรือแม้กระทั่งทำให้สามารถกำหนดค่าได้) ดังนั้นหากคุณไม่แน่ใจว่าควรปรับใช้แอปพลิเคชั่นของคุณให้เหมาะสมกับขนาดแพ็คเก็ตหรือกำลังการประมวลผลมากเพียงใดการประหยัดพลังงานอาจเป็นทางเลือกที่น่าสนใจ

PS: ดูโครงการมาตรฐานที่ยอดเยี่ยมthekvsซึ่งเปรียบเทียบ serializers มากมายรวมถึง thrift-binary, thrift-compact, และ protobuf: https://github.com/thekvs/cpp-serializers

PS: มี serializer อื่นชื่อYASซึ่งให้ตัวเลือกนี้ด้วย แต่มันเป็น schema- น้อยดูลิงค์ด้านบน


0

สิ่งสำคัญคือต้องทราบว่าไม่ใช่ทุกภาษาที่รองรับจะต้องมีการเจริญเติบโตอย่างรวดเร็วหรือมีโปรโตฟูฟ ณ จุดนี้มันเป็นเรื่องของการใช้งานโมดูลที่นอกเหนือไปจากการทำให้เป็นอันดับพื้นฐาน ระมัดระวังตรวจสอบมาตรฐานสำหรับภาษาที่คุณวางแผนจะใช้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.