تعرف على Bond و Microsoft Bond - إطار عمل جديد لتسلسل البيانات
نشرت: 2022-03-11Microsoft Bond هو إطار عمل تسلسلي جديد للبيانات المخططة التي أنشأتها Microsoft.
دعنا نلخص أين يتم استخدام تسلسل البيانات أكثر:
- استمرار البيانات في الملفات ، التدفقات ، NoSQL ، و BigData.
- نقل البيانات في الشبكات ، IPC ، إلخ.
بشكل عام ، يجب أن تتعامل هذه التطبيقات مع البيانات المخططة ، حيث يعني المخطط:
- الهيكل: التسلسل الهرمي ، العلاقات ، النظام.
- الدلالي: العمر بعدد السنوات منذ الولادة.
في الواقع ، تحتوي أي بيانات على مخطط حتى لو تم تعريفه أو دعمه ضمنيًا بواسطة لغة البرمجة الخاصة بك خارج الصندوق. عندما يتعلق الأمر بهياكل البيانات المعقدة ، ينتهي بنا الأمر بكتابة كائنات دعم نقل البيانات (DTOs) والرمز المسؤول عن IO ، غالبًا بلغات مختلفة. بمجرد نموه وتطوره ، سرعان ما يصبح الحفاظ على كل هذه القطع كابوسًا. هنا حيث تفوز أطر التسلسل باللعبة.
بادئ ذي بدء ، يحدد أي إطار عمل للتسلسل تجريدًا لتعريف مخطط البيانات غير المرتبط بلغة برمجة معينة أو نظام أساسي. يُعرف هذا التجريد باسم DSL (لغة خاصة بالمجال).
بوجود مثل هذا DSL ، يمكننا تحديد مخطط البيانات لتطبيق معين. التعريف ، بدوره ، يمكن التعبير عنه بأشكال متعددة ، ولكن غالبًا ما تدعم أطر التسلسل نموذجًا واحدًا مناسبًا تمامًا لـ DSL الخاص به. معقد جدا؟ إليك أحد الأمثلة المعروفة: XSD و XML.
XSD يعرف DSL ، XML (موصى به) لتعريف المستندات المطابقة لمخطط XSD. ولكن ، يمكنك أيضًا استخدام "xsd.exe" لإنشاء فئات DTO تطابق XSD ، وبالتالي فإن الفئات التي تم إنشاؤها هي مجرد نموذج آخر. لاحظ أنه يمكنك إنشاء XML من DTOs والعكس صحيح وستكون متطابقة لغويًا ، لأن الدلالة شائعة: يتم تعريفها باستخدام XSD. للتلخيص ، يوفر لك إطار عمل التسلسل DSL ، والذي تستخدمه لتحديد مخططات البيانات بتنسيق معين يدعمه بشكل أفضل إطار العمل المحدد.
يجب أن يتجسد مخطط البيانات المجردة في نهاية المطاف في مجموعة من الكيانات المعبر عنها بلغة برمجة. توفر جميع أطر التسلسل أدوات خاصة تسمى مولدات الكود.
يقومون بإنشاء كل التعليمات البرمجية الداعمة للغات البرمجة المستهدفة ، والتي يحتاجها العملاء للعمل مع البيانات المخططة: DTOs ، الوكيل ، إلخ. هذا مطلوب في نهاية المطاف للغات المكتوبة بشدة ، بينما يمكن أن يكون اختياريًا للغات المكتوبة بطة (ديناميكية) .
أخيرًا وليس آخرًا ، هو استمرار البيانات على السلك. يجب أن يتم تسلسل البيانات الفعلية في النهاية إلى وحدات بايت خام (أو نص) وإلغاء تسلسلها مرة أخرى.
توفر جميع أطر عمل تسلسل البيانات تجريدًا آخر يسمى البروتوكولات. يحدد البروتوكول مجموعة من القواعد التي تحدد كيفية إجراء تسلسل للبيانات المهيكلة أو إلغاء تسلسلها وفقًا لمخططها. يتم تنفيذ كل بروتوكول بشكل طبيعي لجميع لغات البرمجة والأنظمة الأساسية التي يدعمها إطار عمل تسلسل معين. كلما زادت لغات / منصات البرمجة التي يدعمها ، زادت عمليات التنفيذ التي يجب أن توفرها.
تخيل أن إطار العمل مستعد لدعم بروتوكول 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
- Facebook Inc. - Thrift ، الذي تديره الآن شركة Apache
- برنامج مؤسسة Apache - Avro
من الواضح أنها جميعًا غير متوافقة ، ولا بأس بذلك ما لم تجعل واجهة برمجة التطبيقات العامة الخاصة بك تستخدم واحدة منها.
لكل منها إيجابيات وسلبيات ، لذا يمكنك الاختيار من بينها بناءً على احتياجاتك.
لماذا بوند؟
الجواب الرسمي على هذا السؤال هنا: "لماذا بوند".
هذا هو الملخص السريع:
- يدعم Bond نظام النوع الغني بما في ذلك الأدوية الجنيسة.
- يدعم Bond إصدار المخطط والتوافق ثنائي الاتجاه.
- يدعم Bond معالجة مخطط وقت التشغيل.
- يدعم Bond مجموعات مختلفة: "vector
، خريطة ، قائمة ". - يدعم Bond التسلسل البطيء الآمن من النوع: “bonded
" - يدعم Bond البروتوكولات (التنسيقات) القابلة للتوصيل مع التنظيم وتحويل الشفرات
ملاحظة مهمة هي أن بوند يتبع استراتيجية "الدفع مقابل اللعب". كلما زادت الميزات التي تضيفها / تستخدمها ، تدفع أكثر مقابل الحجم والسرعة. هذا يمنح المطورين مرونة كبيرة.
لنكن صادقين ونسرد العيوب أيضًا:
- يستهدف Bond مكدس Microsoft بدعم C ++ و C # ، لكنه لا يدعم Java (حتى الآن).
- لا يدعم السند نوع الاتحاد ("oneof" في protobuf).
ماذا عن الأداء؟
عندما يتعلق الأمر بمقارنة إطار عمل بآخر ، يبحث المطورون غالبًا عن مقارنات الأداء. لكن دعنا نتذكر أن هذه الأطر تتكون من DSL ومولدات الأكواد والبروتوكولات. إذا كنت تفكر في أداء البروتوكولات فقط ، فستفقد الميزات التي يوفرها DSL و codegens. في بعض الأحيان ، يكون الحصول على DSL أفضل طريقة أكثر أهمية من وجود اختلاف بنسبة قليلة في سرعة التسلسل.
بخلاف السرعة ، قد تكون الترميزات الموفرة للمساحة التي تدعمها بعض البروتوكولات مهمة أيضًا. أنا أشجعك على إجراء مقارنة بين الأداء / المساحة مع البيانات الخاصة بنطاقك. هذه هي الطريقة الوحيدة لتقدير جميع الفوائد التي يمكن أن تحصل عليها من إطار عمل معين.

تأتي هذه المقالة مع المشروع التجريبي الذي يوضح استخدام إطار عمل Bond من خلال قراءة جميع السجلات من سجل أحداث تطبيق Windows ، وتسلسلها ككائنات Bond وإلغاء تسلسلها مرة أخرى.
لإنشاء العرض التوضيحي وتشغيله ، لا تحتاج إلى تثبيت أي برنامج بخلاف Visual Studio.
باستخدام Microsoft Bond
الحصول على بوند
تحقق من الدليل الرسمي للحصول على Bond لمنصتك (منصاتك).
بالنسبة لمشروعات .NET ، يعد هذا أمرًا بسيطًا مثل:
install-package Bond.CSharp
الباقة تشمل:
- منشئ الكود (gbc.exe) في مجلد bin
- مكتبات .NET
- مهام MSBuild
سير العمل
يتضمن سير العمل الخطوات التالية:
- تعلم DSL وحدد مخطط البيانات عن طريق كتابة ملف (ملفات) ".bond".
- استخدم منشئ الأكواد (“gbc.exe”) للحصول على DTOs للغة البرمجة الخاصة بك.
- قم بالرجوع إلى الملفات التي تم إنشاؤها بالإضافة إلى مكتبات وقت تشغيل Bond في مشروعك.
ضع في اعتبارك استخدام مهام MSBuild المتوفرة مع إطار العمل لأتمتة خطوة إنشاء التعليمات البرمجية.
نظرة عامة على ميزات DSL
عندما تبدأ في كتابة ملف ".bond" الأول الخاص بك ، ستحتاج إلى معرفة تركيبه وميزاته. يرجى زيارة صفحة التوثيق الرسمية التي تصف IDL بالتفصيل. دعنا نراجع الميزات الأساسية فقط:
- الوحدات النمطية: يمكن تقسيم المخطط إلى ملفات مختلفة ، والتي يتم تضمينها مع بيان "الاستيراد".
- Namespace: لها نفس معنى C ++ / C #.
- الهياكل المعرفة من قبل المستخدم: وحدة تعريف نوع المستخدم.
- التصريح الأمامي مفيد لهياكل البيانات العودية.
- الأنواع الأساسية: "bool، uint8 (خلال 64)، int8 (حتى 64)، float، double، string، wstring".
- أنواع الحاويات: "blob ، list
، المتجه ، تعيين ، خريطة <K ، T> ، nullable ". - تعيين الأسماء المستعارة والمكتوبة المخصصة ، على سبيل المثال إذا كنت تريد أن يكون لديك "DateTime" في C # ، لكن وضع علامة ("int64") على السلك.
- السمات المخصصة: مفيدة لإنشاء التعليمات البرمجية المخصصة.
ضجر؟ هنا مثال:
namespace MyProject struct MyRecord { 0: string Name = "Noname"; 1: vector<double> Constants; }
حيث "0" و "1" هي الأرقام الترتيبية للحقل (يمكن أن تكون أي أعداد صحيحة بأي سرعة) و = "Noname"
هي القيمة الافتراضية (الاختيارية).
رمز الجيل
يوفر إطار عمل Bond أداة إنشاء التعليمات البرمجية المكتوبة بلغة Haskell. إليك كيفية إنشاء كود C # و C ++ من مخطط “.bond” في سطر الأوامر:
gbc c# example.bond gbc c++ example.bond
البروتوكولات المدعومة (التنسيقات)
خارج الصندوق يدعم Bond ثلاثة أنواع من البروتوكولات:
- البروتوكولات الموسومة: "CompactBinary" و "FastBinary"
البروتوكولات ذات العلامات تشذير البيانات الوصفية للمخطط داخل الحمولة. هذا يجعل الحمولة ذاتية الوصف ، مما يسمح للمستهلكين بتفسيرها حتى دون معرفة المخطط المستخدم من قبل المنتج.
- بروتوكولات بدون علامات: "SimpleBinary"
تعمل البروتوكولات غير المميزة على تسلسل البيانات فقط ، وبالتالي تتطلب أن يعرف المستهلكون مخطط الحمولة النافعة عبر آلية خارج النطاق. غالبًا ما تُستخدم البروتوكولات غير المميزة في سيناريوهات التخزين لأنها تسمح بتخزين مخطط مرة واحدة (على سبيل المثال في جدول نظام في قاعدة بيانات) ، وبالتالي التخلص من عبء البيانات الوصفية من العديد من السجلات باستخدام نفس المخطط.
- البروتوكولات القائمة على DOM: "SimpleJson" و "SimpleXml"
يقوم البروتوكول المستند إلى DOM بتحليل الحمولة الكاملة في نموذج كائن البيانات في الذاكرة والذي يتم الاستعلام عنه بعد ذلك أثناء إلغاء التسلسل. عادةً ما يتم استخدام هذا النوع من البروتوكول لتنفيذ الترميزات القائمة على النص مثل 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 باللغات السائدة الأخرى حسب اختيارك.
- تنفيذ استيراد / تصدير مخطط Bond للتبادل مع DSLs الأخرى (على سبيل المثال ".proto <=> .bond").
مهما كان ما تقرر القيام به فيما يتعلق بوند ، أوصيك بالاتصال بآدم سابك أولاً. إنه قائد هذا المشروع وسيقوم بإرشادك إلى أكثر ما يطلبه السوق.