feature-image-protobuf-101
feature-image-protobuf-101

ในโลกของการพัฒนา Software เรามักจะเจอการส่งข้อมูลไปมาระหว่างระบบอยู่แล้ว ยิ่ง Micro Services Architecture เป็นอะไรที่คนส่วนใหญ่ใช้กันแล้ว

summary-microservices-testing
summary-microservices-testing

โดยสรุปสั้นๆเป็น 2 หัวข้อง่ายๆละกัน เช่น

  1. การส่งข้อมูลระหว่าง Application ไป Server (public API)
  2. การส่งข้อมูลกันระหว่าง Server – Server (private API)

ซึ่งเจ้าการส่งข้อมูลไปมาแบบทั่วไปเลยที่คนรู้จักกันดีก็คงไม่พ้น JSON และ XML นั้นแหละ เพราะเวลาถามนักพัฒนาหลายท่านก็จะตอบประมาณว่าใช้เจ้า JSON หรือ XML แล้ว serialization เอาสิ จะได้รวดเร็ว บางคนก็จะบอกใช่ JSON ดีกว่า XML หรืออะไรกันไปต่างๆนา

แต่จริงๆแล้วเครื่องมือแต่ละชนิดมันออกแบบมาไม่เหมือนกัน ซึ่งวันนี้ที่จะมาพูดถึงคือเจ้า Protocol Buffer เป็นอีกเครื่องมือนึงที่ช่วยในการพัฒนาการส่งข้อมูลขนาดระหว่างระบบที่ทําให้ได้ขนาดที่เล็กมากๆ และ การส่งข้อมูลใน distributed application เลย (ลองนึกภาพ distributed app. ต้องส่งข้อมูลผ่าน xml หรือ json มันจะกินเวลา processing แต่ละ node ขนาดไหนล่ะ)

Protocol Buffer คืออะไร?

เจ้านี้คือเครื่องมือที่ Google พัฒนาขึ้นมาเพื่อใช้ในการ serializing structured data เพื่อใช้ในการส่งข้อมูลจาก A ไป B ง่ายๆแบบนั้นแหละ 🙂 ไม่ได้มีไรลึกซึ้งกว่านี้

ควรใช้ Protocol Buffer ตอนไหน?

จริงๆแล้ว ไม่ว่าจะเป็น Json, XML หรือ Protocol Buffer ฒันก็มีข้อดีแตกต่างกันไป ไม่มีอะไรบังคับว่าเราต้องใช้แต่ตัวนี้เท่านั้น โดย

  1. Json
    • readable/editable
    • browser support มากๆ
    • ใช้กับพวก Ajax นี้เป็นอย่างดีเลยล่ะ
    • ไม่จําเป็นต้องรู้ schema มาก่อน ก็สามารถ parse ได้ (เช่น ใช้ JSONarray จัดการลงลง Schema ให้หมดเลย แบบตัวอย่างนี้ Stackoverflow)
  2. XML
    • readable/editable
    • standard สําหรับการใช้ SOAP เลย
    • tools support ก็เยอะ (xsd,xslt,dom)
    • ไม่จําเป็นต้องรู้ schema มาก่อน ก็สามารถ parse ได้
  3. Protobug
    • จุดเด่นสุดๆๆของมันเลยคือเรื่องของ เล็กมากๆๆๆ
    • fast processing
    • แต่มันต้องการ schema เพื่อใช้การ decode มันออกมา เพราะเราต้องมี message definition ชัดเจนเลย (มันจะใช้ได้ถ้าเรามี .proto file เท่านั้น ลองดูวิธีใช้ด้านล่างจะเข้าใจ)
    • unable to read, not human friendly (binary format)

ก็จากที่เห็นมันก็มีดีไปกันคนละอย่าง เพราะฉะนั้นถ้าย้อนกลับไปต้อนแรกที่บอกว่า การส่งข้อมูลหลักๆมี 2 แบบนี้

  1. การส่งข้อมูลระหว่าง Application ไป Server (public API)
  2. การส่งข้อมูลกันระหว่าง Server – Server (private API)

ถ้าส่วนตัวจะเลือกใช้ว่า public API ส่วนใหญ่จะเป็นพวก JSON/XML กันไป เพราะมัน Support ทุก browser และ กับพวก Ajax อีกด้วย เวลาส่งข้อมูลกันไปมา แต่พอเป็น private API ก็มาใช้ Protocol Buffer เพื่อเพิ่มความเร็วในการส่งข้อมูล

ส่วนความเร็วในการส่งข้อมูลเพิ่มเท่าไร ลองดูจาก chart ข้างล่างที่มีคนทําไว้แล้ว 🙂 ลองอ่านตัวเต็มได้จาก ref. ข้างล่างน่ะ (แบบ Serialize และ ไม่ Serialize น่ะ)

compare-performance-json-protobuf-1
compare-performance-json-protobuf-1 (http://theburningmonk.com/2014/08/json-serializers-benchmarks-updated-2/)
compare-performance-json-protobuf-2
compare-performance-json-protobuf-2 (https://maxondev.com/serialization-performance-comparison-c-net-formats-frameworks-xmldatacontractserializer-xmlserializer-binaryformatter-json-newtonsoft-servicestack-text/)
compare-performance-json-protobuf-3
compare-performance-json-protobuf-3 (https://maxondev.com/serialization-performance-comparison-c-net-formats-frameworks-xmldatacontractserializer-xmlserializer-binaryformatter-json-newtonsoft-servicestack-text/)

วิธีใช้ Protocol Buffer?

โดยขั้นตอนการใช้งาน Protocol Buffer ง่ายมากคือ

  1. เราให้เรา message format ชองเราออกมาในรูปแบบของ .proto file
  2. แล้วใช้ protocol buffer compiler generate class ออกมาให้เรา แล้วเราก็เอาไปใช้

การ define message format เสร็จแล้วจะมีรูปร่างหน้าตางี้

protocol-buffer-message-defined
protocol-buffer-message-defined (https://developers.google.com/protocol-buffers/docs/overview)

ทีนี้เวลาเรา compile มันออกมา เราก็จะใช้ protoc ซึ่งเป็น compiler ของมันในการ generate message format เป็น class

protoc-java-output
protoc-java-output

ซึ่งใน Protocol Buffers มันรองรับหลายภาษาอยู่เช่น

  • C#
  • C++
  • Java
  • Python
  • Go

เราก็แค่เปลี่ยน arguments จาก –java_out เป็น –python_out หรือ –csharp_out เป็นต้น

ซึ่งหลังจากการ generate ด้วย protoc แล้วเราจะได้ไฟล์ออกมาเป็นไฟล์ _FileName_Proto.Langage เช่น ตามตัวอย่างข้างบนก็จะเป็น AddressBookProto.Java นั้นเอง แล้วเราก็เอาไปเรียกใช้ตามปกติทั่วไป ของ Builder Pattern

AddressBook.Builder addressBook = AddressBook.newBuilder();
example-generated-file-proto
example-generated-file-proto (https://developers.google.com/protocol-buffers/docs/javatutorial)

พวกนี้เราสามารถดู Lanaguage Guilde ได้ หรือ เราจะลองเล่นเองได้จากที่นี้เลย (เป็น Java Client น่ะ)

สรุปปปปปป

ทุกเครื่องมือมีดีคนละอย่างไม่มีไรแตกต่างกัน เพราะฉะนั้นแค่เลือกใช้ให้ถูกเป็นพอ 🙂

ถ้าส่วนตัวจะเลือกใช้ว่า public API ส่วนใหญ่จะเป็นพวก JSON/XML กันไป เพราะมัน Support ทุก browser และ กับพวก Ajax อีกด้วย เวลาส่งข้อมูลกันไปมา แต่พอเป็น private API ก็มาใช้ Protocol Buffer เพื่อเพิ่มความเร็วในการส่งข้อมูล และยิ่งถ้าเป็น distributed system ความเร็วส่งผลค่อนข้างเยอะ ตาม Performance ที่เขียนไว้ข้างบน (อารมณ์ read-write บน ssd กับ hdd อะ ว่าเวลาช้าแล้วส่งผลให้ข้อมูลมันตอบสนองไม่ทัน)

 

Leave a Reply

avatar

This site uses Akismet to reduce spam. Learn how your comment data is processed.