ย้ายจาก JSON ไปยัง Protobuf มันคุ้มหรือไม่


23

เรามีเว็บเซอร์วิส REST ที่สามารถให้บริการ XML หรือ JSON (WCF) ฉันกำลังคิดจะใช้ Protobufs ทำไม?

ข้อดี

  1. โหลดบนเซิร์ฟเวอร์น้อยลง
  2. ขนาดข้อความที่เล็กลง - ทราฟฟิกน้อย
  3. มันง่ายกว่าที่จะสลับตอนนี้ในภายหลัง

ข้อเสีย

  1. จะต้องมีการดำเนินการ
  2. การแก้ไขปัญหา / การดมกลิ่นเพื่อแก้ไขข้อบกพร่องจะทำได้ยากขึ้น
  3. ฉันสามารถเปิดใช้งาน GZip บนเซิร์ฟเวอร์และ JSON จะใช้ปริมาณการใช้งานมาก

คุณมีข้อเสนอแนะและ / หรือประสบการณ์เกี่ยวกับเรื่องนี้อย่างไร?


1
ฉันดูที่หน้าวิกิพีเดียจริง ๆ แล้วก็มีจำนวนตัวอักษรต่อคู่ค่าคีย์ดังนั้นทำไมขนาดมันถึงมีข้อความเล็ก ๆ
Ramzi Kahil

เนื่องจากการทำให้เป็นอนุกรม ข้อมูลไบนารีมาเป็นแบบไบนารี่ (ตัวอย่างเช่นอาร์เรย์ไบต์) นอกจากนี้จะไม่มีชื่อทรัพย์สินในข้อความ พวกเขาไปตามลำดับคุณสมบัติ Developers.google.com/protocol-buffers/docs/encoding#structure
katit

10
ในทางเทคนิคคุณตอบคำถามของคุณเองบีบอัด JSON และทำมันให้เสร็จ สิ่งสำคัญที่สุดคือคุณไม่ต้องพูดถึงกรณีศึกษาธุรกิจจริง ๆ ที่ใช้เงินและเวลาในการทำกิจกรรมนี้

คำตอบ:


39

มูลค่าทางธุรกิจของการนำไปใช้เกินค่าใช้จ่ายหรือไม่?

หากคุณใช้งานคุณจะต้องเปลี่ยนไม่เพียง แต่เซิร์ฟเวอร์ของคุณ แต่ลูกค้าทั้งหมด (แม้ว่าคุณจะสามารถรองรับทั้งสองรูปแบบและเปลี่ยนลูกค้าได้ตามต้องการ) ที่จะต้องใช้เวลาและการทดสอบซึ่งเป็นต้นทุนโดยตรง และอย่าประมาทเวลาที่จะเข้าใจบัฟเฟอร์โปรโตคอลจริงๆ (โดยเฉพาะอย่างยิ่งเหตุผลที่ต้องทำให้ฟิลด์จำเป็นหรือเป็นตัวเลือก) และเวลาที่ใช้ในการรวมคอมไพเลอร์ protobuf เข้ากับกระบวนการสร้างของคุณ

ดังนั้นค่าเกินกว่าที่? คุณต้องเผชิญกับทางเลือก "ต้นทุนแบนด์วิดธ์ของเราคือ X% ของรายได้ของเราและเราไม่สามารถรองรับได้"? หรือแม้แต่ "เราต้องใช้จ่าย $ 20,000 เพื่อเพิ่มเซิร์ฟเวอร์เพื่อสนับสนุน JSON"

หากคุณไม่ต้องการธุรกิจที่เร่งรีบ "มืออาชีพ" ของคุณก็ไม่ได้เป็นมืออาชีพจริงๆ


23

ฉันรักษา apis และใครบางคนก่อนเพิ่ม protobuf (เพราะมันเป็น "เร็วกว่า") สิ่งเดียวที่เร็วกว่าคือ RTT เนื่องจากมีขนาดเล็กลงและสามารถแก้ไขได้ด้วย gzipped JSON

ส่วนที่น่ารังเกียจสำหรับฉันก็คืองานที่เกี่ยวข้องกับการรักษา protobuf (เทียบกับ JSON) ฉันใช้จาวาดังนั้นเราจึงใช้การจับคู่วัตถุแจ็คสันสำหรับ JSON การเพิ่มคำตอบหมายถึงการเพิ่มเขตข้อมูลลงใน POJO แต่สำหรับ protobuf ฉันต้องแก้ไขไฟล์ .proto จากนั้นอัปเดตตรรกะการทำให้เป็นอนุกรมและการดีซีเรียลไลเซชันซึ่งย้ายข้อมูลเข้า / ออกของบัฟเฟอร์โปรโตคอลและเป็น POJO มันเกิดขึ้นมากกว่าหนึ่งครั้งที่มีการเปิดตัวที่มีคนเพิ่มเขตข้อมูลและลืมใส่รหัสซีเรียลไลเซชันหรือดีซีเรียลไลเซชันสำหรับบัฟเฟอร์โปรโตคอล

ตอนนี้ไคลเอนต์ได้ดำเนินการกับบัฟเฟอร์โปรโตคอลมันเกือบเป็นไปไม่ได้ที่จะหนีจาก

คุณสามารถเดาได้จากคำแนะนำของฉันไม่ทำ


5
หากคุณกำลังเขียน (de) รหัสการทำให้เป็นอนุกรมเพื่อย้ายข้อมูลเข้า / ออกจาก POJO แสดงว่าคุณทำผิด เพียงแค่ใช้คลาสที่สร้างโปรโตไฟฟ์โดยตรง
Marcelo Cantos

ฉันคิดว่าในกรณีนี้ฉันย้ายเข้า / ออกจาก POJOs เพราะ codebase รองรับทั้งคำขอ JSON, XML และ Protobuf และการตอบสนองและเนื่องจากว่าฉันไม่สามารถเพิ่มคำอธิบายประกอบ Jackson และ / หรือ JAXB เพื่อสร้างคลาส protobuf และฉันต้องการ เพื่อใช้วัตถุโมเดลเดียวกันตลอดทั้งรหัสฉันไม่รู้ว่าฉันมีตัวเลือกเพียงแค่ใช้คลาสที่สร้างขึ้น ฉันสามารถดูว่าสิ่งนี้จะเป็นไปได้ที่จะทำอย่างไรถ้าฉันเขียนบอกว่าบริการ GRPC ที่พูดคุยกับโปรโตฟูฟเท่านั้น
เควิน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.