พบกับ Bond, Microsoft Bond - กรอบงานการจัดลำดับข้อมูลใหม่
เผยแพร่แล้ว: 2022-03-11Microsoft Bond เป็นเฟรมเวิร์กการทำให้เป็นอนุกรมใหม่สำหรับข้อมูลที่จัดทำโดย Microsoft
มาสรุปกันโดยสรุปว่าการจัดลำดับข้อมูลถูกใช้บ่อยที่สุดที่ไหน:
- การคงอยู่ของข้อมูลในไฟล์ สตรีม NoSQL และ BigData
- การส่งข้อมูลในเครือข่าย IPC เป็นต้น
โดยทั่วไป แอปพลิเคชันเหล่านี้ต้องจัดการกับข้อมูลที่เป็นแผนผัง โดยที่ schema หมายถึง:
- โครงสร้าง: ลำดับชั้น ความสัมพันธ์ ลำดับ
- ความหมาย: อายุในจำนวนปีตั้งแต่เกิด
ที่จริงแล้ว ข้อมูลใดๆ ก็ตามที่มีสคีมา แม้ว่าจะมีการกำหนดหรือสนับสนุนโดยนัยโดยนัยโดยภาษาโปรแกรมของคุณแบบสำเร็จรูป เมื่อพูดถึงโครงสร้างข้อมูลที่ซับซ้อน เราลงเอยด้วยการเขียนสนับสนุนวัตถุการถ่ายโอนข้อมูล (DTO) และโค้ดที่รับผิดชอบ IO ซึ่งมักใช้ในภาษาต่างๆ ทันทีที่มันเติบโตและพัฒนา มันจะกลายเป็นฝันร้ายอย่างรวดเร็วในการรักษาชิ้นส่วนเหล่านี้ทั้งหมด นี่คือจุดที่เฟรมเวิร์กการทำให้เป็นอันดับชนะเกม
ประการแรก เฟรมเวิร์กการทำให้เป็นอนุกรมใดๆ กำหนดสิ่งที่เป็นนามธรรมสำหรับคำจำกัดความสคีมาข้อมูลที่ไม่ผูกมัดกับภาษาหรือแพลตฟอร์มการเขียนโปรแกรมเฉพาะ สิ่งที่เป็นนามธรรมนี้เรียกว่า DSL (ภาษาเฉพาะโดเมน)
การมี DSL ดังกล่าว ทำให้เราสามารถกำหนดสคีมาข้อมูลสำหรับแอปพลิเคชันเฉพาะได้ ในทางกลับกัน คำจำกัดความสามารถแสดงออกได้หลายรูปแบบ แต่บ่อยครั้งที่เฟรมเวิร์กการซีเรียลไลซ์เซชั่นสนับสนุนรูปแบบเดียวซึ่งเหมาะสมอย่างยิ่งสำหรับ DSL ซับซ้อนเกินไป? นี่คือตัวอย่างหนึ่งที่รู้จักกันดี: XSD และ XML
XSD กำหนด DSL, XML คือ (แนะนำ) เพื่อกำหนดเอกสารที่ตรงกับสคีมา XSD แต่คุณยังสามารถใช้ “xsd.exe” เพื่อสร้างคลาส DTO ที่ตรงกับ XSD ได้ ดังนั้นคลาสที่สร้างขึ้นจึงเป็นอีกรูปแบบหนึ่ง โปรดทราบว่าคุณสามารถสร้าง XML จาก DTO และในทางกลับกันได้ และจะมีความหมายเหมือนกัน เนื่องจากความหมายเป็นเรื่องปกติ: มีการกำหนดด้วย XSD เพื่อสรุป เฟรมเวิร์กการทำให้เป็นอนุกรมจะให้ DSL แก่คุณ ซึ่งคุณใช้กำหนดสคีมาข้อมูลในรูปแบบใดรูปแบบหนึ่งที่ได้รับการสนับสนุนดีที่สุดจากเฟรมเวิร์กที่กำหนด
โครงร่างข้อมูลนามธรรมจะต้องถูกทำให้เป็นรูปธรรมในที่สุดในชุดของเอนทิตีที่แสดงในภาษาการเขียนโปรแกรม เฟรมเวิร์กการทำให้เป็นอนุกรมทั้งหมดมีเครื่องมือพิเศษที่เรียกว่าตัวสร้างโค้ด
พวกเขาสร้างรหัสสนับสนุนทั้งหมดสำหรับภาษาโปรแกรมเป้าหมาย ซึ่งจำเป็นสำหรับลูกค้าที่จะทำงานกับข้อมูลที่เป็นแผนผัง: DTO, พร็อกซี่ ฯลฯ ซึ่งท้ายที่สุดแล้วจำเป็นสำหรับภาษาที่มีการพิมพ์สูง ในขณะที่สามารถเลือกได้สำหรับภาษาที่พิมพ์เป็ด (ไดนามิก) .
สิ่งสุดท้ายแต่ไม่ท้ายสุดคือการคงอยู่ของข้อมูลบนสาย ข้อมูลจริงจะถูกทำให้เป็นอนุกรมในที่สุดเป็นไบต์ดิบ (หรือข้อความ) และดีซีเรียลไลซ์กลับ
เฟรมเวิร์กการจัดลำดับข้อมูลทั้งหมดให้สิ่งที่เป็นนามธรรมที่เรียกว่าโปรโตคอล โปรโตคอลกำหนดชุดของกฎที่กำหนดว่าข้อมูลที่มีโครงสร้างควรได้รับการจัดลำดับหรือดีซีเรียลไลซ์ข้อมูลอย่างไรตามสคีมา โดยปกติแต่ละโปรโตคอลจะถูกนำไปใช้กับภาษาการเขียนโปรแกรมและแพลตฟอร์มทั้งหมดที่ได้รับการสนับสนุนโดยเฟรมเวิร์กการทำให้เป็นอนุกรมที่กำหนด ยิ่งรองรับภาษา/แพลตฟอร์มการเขียนโปรแกรมมากเท่าไหร่ ก็ยิ่งต้องมีการนำไปใช้งานมากขึ้นเท่านั้น
ลองนึกภาพว่าเฟรมเวิร์กยินดีรองรับโปรโตคอล JSON จากนั้นจะต้องมีโปรแกรมอ่าน/เขียน JSON สำหรับพูด C#, C++, Windows, Linux เป็นต้น
นำทุกอย่างมารวมกัน: เฟรมเวิร์กการจัดลำดับข้อมูลที่ทันสมัยให้สิ่งต่อไปนี้แก่คุณ:
- บทคัดย่อ: DSL และโปรโตคอล
- เครื่องมือสร้างรหัส
- การนำโปรโตคอลไปใช้
Microsoft Bond เป็นเฟรมเวิร์กการจัดลำดับข้อมูลที่ทันสมัย มันมี DSL ที่ทรงพลังและโปรโตคอลที่ยืดหยุ่น ตัวสร้างโค้ดสำหรับ C++ และ C# การใช้งานโปรโตคอลที่มีประสิทธิภาพสำหรับ Windows, Linux และ Mac OS X
เป็นเวลาหลายปีที่ Bond ยังคงเป็นเทคโนโลยีที่ใช้ภายในเท่านั้น แต่ด้วยความคิดริเริ่มของ Microsoft Open Source ทำให้ Bond พร้อมใช้งานบน GitHub: Microsoft Bond
คู่แข่งการจัดลำดับข้อมูล
การแข่งขันระหว่างยักษ์ใหญ่ด้านซอฟต์แวร์ทำให้เกิดเฟรมเวิร์กซีเรียลไลซ์เซชั่นจำนวนหนึ่งปรากฏขึ้น:
- Google Inc. - Google Protocol Buffers
- Facebook Inc. - Thrift ซึ่งตอนนี้ดูแลโดย Apache
- ซอฟต์แวร์พื้นฐาน Apache - รว์
เห็นได้ชัดว่าทั้งหมดเข้ากันไม่ได้ ซึ่งไม่เป็นไรเว้นแต่คุณจะสร้าง API สาธารณะของคุณโดยใช้หนึ่งในสิ่งเหล่านี้
แต่ละรายการมีข้อดีและข้อเสีย คุณจึงเลือกได้ตามความต้องการ
ทำไมต้องบอนด์?
คำตอบอย่างเป็นทางการสำหรับคำถามนี้อยู่ที่นี่: “ทำไมต้องผูกมัด”
นี่คือบทสรุปโดยย่อ:
- บอนด์รองรับระบบที่หลากหลายรวมถึงยาชื่อสามัญ
- พันธบัตรรองรับการกำหนดเวอร์ชันสคีมาและความเข้ากันได้แบบสองทาง
- บอนด์รองรับการจัดการสคีมารันไทม์
- Bond รองรับคอลเลกชันต่างๆ: “vector
, แผนที่ , รายการ ” - บอนด์รองรับการจัดลำดับแบบขี้เกียจที่ปลอดภัยสำหรับประเภท: “ผูกมัด
” - บอนด์รองรับโปรโตคอลแบบเสียบได้ (รูปแบบ) พร้อมมาร์แชลและการแปลงรหัส
ข้อสังเกตสำคัญคือ Bond ปฏิบัติตามกลยุทธ์ "จ่ายเพื่อเล่น" ยิ่งคุณเพิ่ม/ใช้คุณสมบัติมากเท่าใด คุณก็ยิ่งจ่ายสำหรับขนาดและความเร็วมากขึ้นเท่านั้น สิ่งนี้ทำให้นักพัฒนามีความยืดหยุ่นสูง
มาพูดกันตรงๆ และระบุข้อเสียด้วย:
- Bond ตั้งเป้าไปที่ Microsoft stack โดยรองรับ C++ และ C# แต่ยังไม่รองรับ Java (ยัง)
- พันธบัตรไม่รองรับประเภทสหภาพ (“oneof” ใน protobuf)
สิ่งที่เกี่ยวกับประสิทธิภาพ?
เมื่อพูดถึงการเปรียบเทียบเฟรมเวิร์กหนึ่งกับเฟรมเวิร์กอื่น นักพัฒนามักจะมองหาการเปรียบเทียบประสิทธิภาพ แต่อย่าลืมว่าเฟรมเวิร์กเหล่านี้ประกอบด้วย DSL ตัวสร้างโค้ด และโปรโตคอล หากคุณพิจารณาประสิทธิภาพของโปรโตคอลเท่านั้น คุณจะพลาดคุณสมบัติที่ DSL และโคเดเจนมีให้ บางครั้งการมี DSL ที่ดีกว่ามีความสำคัญมากกว่าการมีความเร็วการทำให้เป็นอนุกรมแตกต่างกันสองสามเปอร์เซ็นต์

นอกจากความเร็วแล้ว การเข้ารหัสที่ประหยัดพื้นที่ซึ่งรองรับโดยโปรโตคอลบางตัวก็มีความสำคัญเช่นกัน เราขอแนะนำให้คุณเปรียบเทียบประสิทธิภาพ/พื้นที่กับข้อมูลเฉพาะโดเมนของคุณ นี่เป็นวิธีเดียวที่จะประเมินผลประโยชน์ทั้งหมดที่คุณจะได้รับจากกรอบงานเฉพาะ
บทความนี้มาพร้อมกับโปรเจ็กต์สาธิตที่สาธิตการใช้เฟรมเวิร์กของ Bond โดยการอ่านบันทึกทั้งหมดจาก Windows Application Event Log ทำให้เป็นอนุกรมเป็นออบเจ็กต์ Bond และยกเลิกการซีเรียลไลซ์กลับ
ในการสร้างและเรียกใช้การสาธิต คุณไม่จำเป็นต้องติดตั้งซอฟต์แวร์อื่นใดนอกจาก Visual Studio
การใช้ Microsoft Bond
รับพันธบัตร
ตรวจสอบคู่มืออย่างเป็นทางการเกี่ยวกับการรับพันธบัตรสำหรับแพลตฟอร์มของคุณ
สำหรับโปรเจ็กต์ .NET ทำได้ง่ายๆ ดังนี้:
install-package Bond.CSharp
แพ็คเกจประกอบด้วย:
- ตัวสร้างโค้ด (gbc.exe) ในโฟลเดอร์ bin
- .NET ห้องสมุด
- งาน MSBuild
เวิร์กโฟลว์
เวิร์กโฟลว์ประกอบด้วยขั้นตอนต่อไปนี้:
- เรียนรู้ DSL และกำหนดสคีมาข้อมูลโดยการเขียนไฟล์ “.bond”
- ใช้ตัวสร้างโค้ด (“gbc.exe”) เพื่อรับ DTO สำหรับภาษาการเขียนโปรแกรมของคุณ
- อ้างอิงไฟล์ที่สร้างขึ้นรวมถึงไลบรารีรันไทม์ของ Bond ในโครงการของคุณ
พิจารณาใช้งาน MSBuild ที่มาพร้อมกับเฟรมเวิร์กเพื่อทำให้ขั้นตอนการสร้างโค้ดเป็นไปโดยอัตโนมัติ
ภาพรวมคุณสมบัติ DSL
เมื่อคุณเริ่มเขียนไฟล์ “.bond” ไฟล์แรก คุณจะต้องรู้รูปแบบและคุณสมบัติของไฟล์ โปรดไปที่หน้าเอกสารอย่างเป็นทางการที่อธิบาย IDL โดยละเอียด มาทบทวนคุณสมบัติพื้นฐานกัน:
- โมดูล: สคีมาสามารถแบ่งออกเป็นไฟล์ต่างๆ ซึ่งรวมอยู่ในคำสั่ง "import"
- เนมสเปซ: มีความหมายเหมือนกับ C++/C# มี
- โครงสร้างที่ผู้ใช้กำหนด: หน่วยของคำจำกัดความประเภทผู้ใช้
- การประกาศไปข้างหน้ามีประโยชน์สำหรับโครงสร้างข้อมูลแบบเรียกซ้ำ
- ประเภทพื้นฐาน: “bool, uint8 (ผ่าน 64), int8 (ผ่าน 64), float, double, string, wstring
- ประเภทคอนเทนเนอร์: “หยด รายการ
, เวกเตอร์ , ชุด , map<K, T>, nullable ” - นามแฝงที่พิมพ์แบบกำหนดเองและการแมป เช่น หากคุณต้องการให้มี “DateTime” ใน C# แต่ขีด (“int64”) บนสาย
- คุณลักษณะที่กำหนดเอง: มีประโยชน์สำหรับการสร้างโค้ดที่กำหนดเอง
เบื่อ? นี่คือตัวอย่าง:
namespace MyProject struct MyRecord { 0: string Name = "Noname"; 1: vector<double> Constants; }
โดยที่ “0” และ “1” คือเลขลำดับของช่อง (สามารถเป็นจำนวนเต็มใดๆ ก็ได้) และ = "Noname"
เป็นค่าเริ่มต้น (ทางเลือก)
การสร้างรหัส
กรอบงานบอนด์มีเครื่องมือสร้างโค้ดที่เขียนด้วย Haskell นี่คือวิธีการสร้างโค้ด C# และ C++ จากสคีมา “.bond” ในบรรทัดคำสั่ง:
gbc c# example.bond gbc c++ example.bond
โปรโตคอลที่รองรับ (รูปแบบ)
นอกกรอบ Bond รองรับโปรโตคอลสามประเภท:
- โปรโตคอลที่ติดแท็ก: “CompactBinary” และ “FastBinary”
โปรโตคอลที่แท็กสอดแทรกข้อมูลเมตาของสคีมาภายในเพย์โหลด สิ่งนี้ทำให้เพย์โหลดอธิบายตัวเองได้ ทำให้ผู้บริโภคสามารถตีความข้อมูลได้แม้ไม่รู้สคีมาที่ผู้ผลิตใช้
- โปรโตคอลที่ไม่ได้แท็ก: “SimpleBinary”
โปรโตคอลที่ไม่ได้ติดแท็กจะทำให้ข้อมูลเป็นอนุกรมเท่านั้น ดังนั้นผู้บริโภคจึงจำเป็นต้องทราบสคีมาของเพย์โหลดผ่านกลไกนอกแบนด์บางอย่าง โปรโตคอลที่ไม่ได้ติดแท็กมักใช้ในสถานการณ์การจัดเก็บข้อมูล เนื่องจากอนุญาตให้จัดเก็บสคีมาเพียงครั้งเดียว (เช่น ในตารางระบบในฐานข้อมูล) ซึ่งจะช่วยขจัดโอเวอร์เฮดของข้อมูลเมตาจากเร็กคอร์ดจำนวนมากโดยใช้สคีมาเดียวกัน
- โปรโตคอลที่ใช้ DOM: “SimpleJson” และ “SimpleXml”
โปรโตคอลที่ใช้ DOM แยกวิเคราะห์เพย์โหลดทั้งหมดลงใน Data Object Model ในหน่วยความจำ ซึ่งจะถูกสอบถามในระหว่างการดีซีเรียลไลซ์เซชั่น โดยทั่วไปแล้ว โปรโตคอลประเภทนี้จะใช้ในการติดตั้งการเข้ารหัสแบบข้อความ เช่น JSON หรือ XML
สำหรับแต่ละโปรโตคอล ไลบรารีรันไทม์ Bond จะให้คลาส Reader และ Writer ที่สอดคล้องกันซึ่งทำงานบนซีเรียลไลซ์เซชั่นจริง
การใช้โปรโตคอลค่อนข้างตรงไปตรงมา และยากกว่า “JsonConvert.SerializeObject()” ที่มีชื่อเสียงเล็กน้อย:
var record = new MyRecord { Name = "FooBar", Constants = { 3.14, 6.28 } }; var output = new OutputBuffer(); var writer = new CompactBinaryWriter<OutputBuffer>(output); Serialize.To(writer, record); var input = new InputBuffer(output.Data); var reader = new CompactBinaryReader<InputBuffer>(input); record = Deserialize<Example>.From(reader);
อะไรต่อไป?
ถ้าคุณรัก Bond และถ้าคุณมีเวลาว่างมากพอสำหรับการเขียนโค้ด ลองพิจารณานำสิ่งเหล่านี้ไปใช้ในการพัฒนา ฉันจะไม่แจกแจงประโยชน์ทั้งหมดที่คุณอาจได้รับจากการบริจาค แต่ฉันรู้ว่านักพัฒนาหลายคนกำลังมองหาแนวคิดที่จะมีส่วนร่วมใน:
- นำพอร์ตไปใช้กับ Java แทนที่ Java ด้วยภาษาหลักอื่นๆ ตามที่คุณต้องการ
- ใช้การนำเข้า/ส่งออกสคีมาพันธบัตรเพื่อแลกเปลี่ยนกับ DSL อื่นๆ (เช่น “.proto <=> .bond”)
ไม่ว่าคุณจะตัดสินใจทำอะไรเกี่ยวกับ Bond เราขอแนะนำให้คุณติดต่อ Adam Sapek ก่อน เขาเป็นหัวหน้าโครงการนี้และเขาจะแนะนำคุณเกี่ยวกับสิ่งที่ตลาดต้องการมากที่สุด