ملاحظة
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تسجيل الدخول أو تغيير الدلائل.
يتطلب الوصول إلى هذه الصفحة تخويلاً. يمكنك محاولة تغيير الدلائل.
تشرح نظرة عامة على الاتحادونظرة عامة على وظائف النسخ المتماثل الأساس المنطقي لمهام النسخ المتماثل والعناصر الأساسية لها، ومن المستحسن أن تتعرف عليها قبل متابعة هذه المقالة.
في هذه المقالة، نوضح بالتفصيل إرشادات التنفيذ للعديد من الأنماط المميزة في قسم النظرة العامة.
النسخ المتماثل
ينسخ نمط النسخ المتماثل الأحداث من مركز أحداث إلى آخر، أو من Event Hub إلى وجهة أخرى مثل قائمة انتظار ناقل خدمة Microsoft Azure. تتم إعادة توجيه الأحداث دون إجراء أي تعديلات على حمولة الحدث.
يتم تغطية تنفيذ هذا النمط من خلال النسخ المتماثل للحدث بين مراكز الأحداثوالنسخ المتماثل للحدث بين مراكز الأحداث وعينات ناقل خدمة Microsoft Azure والبرنامج التعليمي استخدام Apache Kafka MirrorMaker مع مراكز الأحداث لحالة معينة من النسخ المتماثل للبيانات من وسيط Apache Kafka إلى مراكز الأحداث.
عمليات النقل المستمر وحفظ الطلبات
لا يهدف النسخ المتماثل، إما من خلال Azure Functions أو Azure Stream Analytics، إلى ضمان إنشاء نسخ دقيقة 1:1 من Event Hub المصدر في Event Hub الهدف، ولكنه يركز على الحفاظ على الترتيب النسبي للأحداث حيث يتطلب التطبيق ذلك. يتصل التطبيق بذلك عن طريق تجميع الأحداث ذات الصلة بنفس مفتاح القسم، وترتب مراكز الأحداث الرسائل بنفس مفتاح القسم بشكل تسلسلي في نفس القسم.
مهم
معلومات "الإزاحة" فريدة لكل Event Hub وستختلف الإزاحات لنفس الأحداث عبر مثيلات Event Hub. لتحديد موقع في دفق حدث منسوخ، استخدم الإزاحات المستندة إلى الوقت وارجع إلى بيانات التعريف المعينة للخدمة المنشورة.
تبدأ الإزاحات المستندة إلى الوقت جهاز الاستقبال الخاص بك في نقطة زمنية محددة:
- EventPosition.FromStart() - اقرأ جميع البيانات التي تم الاحتفاظ بها مرة أخرى.
- EventPosition.FromEnd() - قراءة جميع البيانات الجديدة من وقت الاتصال.
- EventPosition.FromEnqueuedTime(dateTime) - كل البيانات بدءا من تاريخ ووقت معينين.
في EventProcessor، يمكنك تعيين الموضع من خلال InitialOffsetProvider على EventProcessorOptions. مع واجهات برمجة تطبيقات المتلقي الأخرى، يتم تمرير الموضع من خلال الدالة الإنشائية.
تضمن مساعدات دالة النسخ المتماثل التي تم إنشاؤها مسبقا المقدمة كعينات يتم استخدامها في الإرشادات المستندة إلى Azure Functions إرسال تدفقات الأحداث بنفس مفتاح القسم الذي تم استرداده من قسم مصدر إلى Event Hub الهدف كدفعة في الدفق الأصلي وبنفس مفتاح القسم.
إذا كان عدد أقسام مركز الأحداث المصدر والهدف متطابقا، تعيين جميع التدفقات في الهدف إلى نفس الأقسام كما فعلت في المصدر. إذا كان عدد الأقسام مختلفا، وهو أمر مهم في بعض الأنماط الإضافية الموضحة في ما يلي، فسيختلف التعيين، ولكن يتم دائما الاحتفاظ بالتدفقات معا وبالترتيب.
قد يختلف الترتيب النسبي للأحداث التي تنتمي إلى تدفقات مختلفة أو أحداث مستقلة بدون مفتاح قسم في قسم هدف دائما عن القسم المصدر.
بيانات التعريف المعينة من قبل الخدمة
يتم استبدال بيانات التعريف المعينة من قبل الخدمة لحدث تم الحصول عليه من مركز الأحداث المصدر، ووقت قائمة الانتظار الأصلية، ورقم التسلسل، والإزاحة بقيم جديدة تم تعيينها للخدمة في Event Hub الهدف، ولكن مع وظائف المساعد ومهام النسخ المتماثل المقدمة في عيناتنا، يتم الاحتفاظ بالقيم الأصلية في خصائص المستخدم: repl-enqueue-time
(ISO8601 سلسلة)، repl-sequence
، . repl-offset
هذه الخصائص من سلسلة النوع وتحتوي على القيمة سلسلة من الخصائص الأصلية المعنية. إذا تمت إعادة توجيه الحدث عدة مرات، يتم إلحاق بيانات التعريف المعينة من قبل الخدمة للمصدر المباشر بالخصائص الموجودة بالفعل، مع قيم مفصولة بفواصل منقوطة.
تجاوز الفشل
إذا كنت تستخدم النسخ المتماثل لأغراض التعافي من الكوارث، أو للحماية من أحداث التوفر الإقليمية في خدمة مراكز الأحداث، أو ضد انقطاع الشبكة، فإن أي سيناريو فشل من هذا القبيل سيتطلب إجراء تجاوز فشل من مركز أحداث إلى آخر، وإخبار المنتجين و/أو المستهلكين باستخدام نقطة النهاية الثانوية.
بالنسبة لجميع سيناريوهات تجاوز الفشل، من المفترض أن العناصر المطلوبة لمساحات الأسماء متطابقة من الناحية الهيكلية، ما يعني أن مراكز الأحداث ومجموعات المستهلكين مسماة بشكل متطابق وأن قواعد توقيع الوصول المشترك و/أو قواعد التحكم في الوصول المستندة إلى الدور يتم إعدادها بنفس الطريقة. يمكنك إنشاء (وتحديث) مساحة اسم ثانوية باتباع إرشادات نقل مساحات الأسماء وحذف خطوة التنظيف.
لإجبار المنتجين والمستهلكين على التبديل، تحتاج إلى جعل المعلومات حول مساحة الاسم التي يجب استخدامها متاحة للبحث في موقع يسهل الوصول إليه وتحديثه. إذا واجه المنتجون أو المستهلكون أخطاء متكررة أو مستمرة، فيجب عليهم استشارة هذا الموقع وتعديل تكوينهم. هناك العديد من الطرق لمشاركة هذا التكوين، لكننا نشير إلى اثنين في ما يلي: DNS ومشاركات الملفات.
تكوين تجاوز الفشل المستند إلى DNS
نهج مرشح واحد هو الاحتفاظ بالمعلومات في سجلات DNS SRV في DNS الذي تتحكم فيه والإشارة إلى نقاط نهاية Event Hub المعنية.
مهم
ضع في اعتبارك أن مراكز الأحداث لا تسمح بتسمية نقاط النهاية الخاصة بها بالاسم المستعار مباشرة مع سجلات CNAME، ما يعني أنك ستستخدم DNS كآلية بحث مرنة لعناوين نقاط النهاية وليس لحل معلومات عنوان IP مباشرة.
افترض أنك تملك المجال example.com
، وبالنسبة للتطبيق الخاص بك، منطقة test.example.com
. بالنسبة إلى مركزي أحداث بديلين، ستقوم الآن بإنشاء منطقتين متداخلتين إضافيتين، وسجل SRV في كل منهما.
سجلات SRV هي، باتباع الاصطلاح الشائع، مسبوقة _azure_eventhubs._amqp
بسجلين لنقطة النهاية مع الاستمرار: واحد ل AMQP-over-TLS على المنفذ 5671 والآخر ل AMQP-over-WebSockets على المنفذ 443، كلاهما يشير إلى نقطة نهاية مراكز الأحداث لمساحة الاسم المقابلة للمنطقة.
المنطقة | سجل SRV |
---|---|
eh1.test.example.com |
_azure_servicebus._amqp.eh1.test.example.com 1 1 5671 eh1-test-example-com.servicebus.windows.net 2 2 443 eh1-test-example-com.servicebus.windows.net |
eh2.test.example.com |
_azure_servicebus._amqp.eh2.test.example.com 1 1 5671 eh2-test-example-com.servicebus.windows.net 2 2 443 eh2-test-example-com.servicebus.windows.net |
في منطقة التطبيق الخاص بك، ستقوم بعد ذلك بإنشاء إدخال CNAME يشير إلى المنطقة التابعة المقابلة لمركز الأحداث الأساسي الخاص بك:
سجل CNAME | اسم مستعار |
---|---|
eventhub.test.example.com |
eh1.test.example.com |
باستخدام عميل DNS الذي يسمح بالاستعلام عن سجلات CNAME وSRV بشكل صريح (يسمح العملاء المضمنون في Java و.NET فقط بدقة بسيطة للأسماء إلى عناوين IP)، يمكنك بعد ذلك حل نقطة النهاية المطلوبة. مع DnsClient.NET، على سبيل المثال، وظيفة البحث هي:
static string GetEventHubName(string aliasName)
{
const string SrvRecordPrefix = "_azure_eventhub._amqp.";
LookupClient lookup = new LookupClient();
return (from CNameRecord alias in (lookup.Query(aliasName, QueryType.CNAME).Answers)
from SrvRecord srv in lookup.Query(SrvRecordPrefix + alias.CanonicalName, QueryType.SRV).Answers
where srv.Port == 5671
select srv.Target).FirstOrDefault()?.Value.TrimEnd('.');
}
ترجع الدالة اسم المضيف الهدف المسجل للمنفذ 5671 للمنطقة المستعارة حاليا مع CNAME كما هو موضح أعلاه.
يتطلب تنفيذ تجاوز الفشل تحرير سجل CNAME وإشرائه إلى المنطقة البديلة.
تتمثل ميزة استخدام DNS، وتحديدا Azure DNS، في أن معلومات Azure DNS يتم نسخها نسخا متماثلا عالميا وبالتالي مرنة ضد الانقطاعات في منطقة واحدة.
يشبه هذا الإجراء كيفية عمل Event Hubs Geo-DR ، ولكن بالكامل تحت سيطرتك الخاصة ويعمل أيضا مع السيناريوهات النشطة/النشطة.
تكوين تجاوز الفشل المستند إلى مشاركة الملفات
أبسط بديل لاستخدام DNS لمشاركة معلومات نقطة النهاية هو وضع اسم نقطة النهاية الأساسية في ملف نص عادي وخدمة الملف من بنية أساسية قوية ضد الانقطاعات ولا تزال تسمح بتحديثات.
إذا قمت بالفعل بتشغيل بنية أساسية لموقع ويب عالية التوفر مع التوفر العمومي والنسخ المتماثل للمحتوى، فقم بإضافة مثل هذا الملف هناك وإعادة نشر الملف إذا كانت هناك حاجة إلى تبديل.
تنبيه
يجب نشر اسم نقطة النهاية بهذه الطريقة فقط، وليس سلسلة اتصال كاملة بما في ذلك الأسرار.
اعتبارات إضافية للفشل على المستهلكين
بالنسبة لمستهلكي Event Hub، تعتمد الاعتبارات الإضافية لاستراتيجية تجاوز الفشل على احتياجات معالج الحدث.
إذا كانت هناك كارثة تتطلب إعادة إنشاء نظام، بما في ذلك قواعد البيانات، من بيانات النسخ الاحتياطي، ويتم تغذية قواعد البيانات مباشرة أو عن طريق المعالجة الوسيطة من الأحداث التي عقدت في Event Hub، فستستعيد النسخة الاحتياطية ثم تريد بدء إعادة تشغيل الأحداث في النظام من اللحظة التي تم فيها إنشاء النسخة الاحتياطية لقاعدة البيانات وليس من لحظة تدمير النظام الأصلي.
إذا كان الفشل يؤثر فقط على شريحة من النظام أو في الواقع على مركز أحداث واحد فقط، والذي أصبح غير قابل للوصول، فمن المحتمل أن ترغب في متابعة معالجة الأحداث من نفس الموضع تقريبا حيث تمت مقاطعة المعالجة.
لتحقيق أي من السيناريو واستخدام معالج الأحداث ل Azure SDK الخاص بك، ستقوم بإنشاء مخزن نقاط تفتيش جديد وتوفير موضع قسم أولي، استنادا إلى الطابع الزمني الذي تريد استئناف المعالجة منه.
إذا كان لا يزال لديك حق الوصول إلى مخزن نقاط التحقق في مركز الأحداث الذي تقوم بالتبديل منه، فستساعدك بيانات التعريف المنشورة التي تمت مناقشتها أعلاه على تخطي الأحداث التي تمت معالجتها بالفعل واستئنافها بدقة من المكان الذي توقفت فيه آخر وقت.
دمج
يحتوي نمط الدمج على مهمة نسخ متماثل واحدة أو أكثر تشير إلى هدف واحد، ربما بشكل متزامن مع المنتجين العاديين الذين يرسلون أيضا الأحداث إلى نفس الهدف.
الاختلافات في هذه الأنماط هي:
- تعمل دالتان أو أكثر من دالات النسخ المتماثل على الحصول على الأحداث بشكل متزامن من مصادر منفصلة وإرسالها إلى نفس الهدف.
- وظيفة نسخ متماثل أخرى تحصل على أحداث من مصدر بينما يتم استخدام الهدف أيضا مباشرة من قبل المنتجين.
- النمط السابق، ولكن معكوس بين اثنين أو أكثر من مراكز الأحداث، مما يؤدي إلى أن تحتوي مراكز الأحداث هذه على نفس التدفقات، بغض النظر عن مكان إنتاج الأحداث.
أول نوعين من تباينات النمط تافهة ولا تختلف عن مهام النسخ المتماثل العادي.
يتطلب السيناريو الأخير استبعاد الأحداث المنسوخة نسخا متماثلا بالفعل من النسخ المتماثل مرة أخرى. يتم توضيح التقنية وشرحها في نموذج EventHubToEventHubMerge .
المحرر
يعتمد نمط المحرر على نمط النسخ المتماثل ، ولكن يتم تعديل الرسائل قبل إعادة توجيهها.
ومن الأمثلة على هذه التعديلات ما يلي:
- تحويل الترميز - إذا وصل محتوى الحدث (يشار إليه أيضا باسم "النص الأساسي" أو "الحمولة") من المصدر المشفر باستخدام تنسيق Apache Avro أو تنسيق تسلسل خاص، ولكن توقع النظام الذي يمتلك الهدف هو أن يكون المحتوى مشفرا JSON ، فإن مهمة النسخ المتماثل لتحويل الترميز ستقوم أولا بإلغاء تسلسل الحمولة من Apache Avro إلى رسم بياني للكائن في الذاكرة ثم تسلسل هذا الرسم البياني في JSON تنسيق الحدث الذي تتم إعادة توجيهه. يتضمن تحويل الترميز أيضا مهام ضغط المحتوى وإلغاء الضغط.
- التحويل - قد تتطلب الأحداث التي تحتوي على بيانات منظمة إعادة تشكيل تلك البيانات لتسهيل الاستهلاك من قبل مستهلكي انتقال البيانات من الخادم. قد يتضمن ذلك عملا مثل تبسيط الهياكل المتداخلة أو تقليم عناصر البيانات الدخيلة أو إعادة تشكيل الحمولة لتناسب مخططا معينا تماما.
- الإرسال في دفعات - قد يتم تلقي الأحداث على دفعات (أحداث متعددة في نقل واحد) من مصدر، ولكن يجب إعادة توجيهها بشكل فردي إلى هدف، أو العكس. لذلك قد تقوم المهمة بإعادة توجيه أحداث متعددة استنادا إلى نقل حدث إدخال واحد أو تجميع مجموعة من الأحداث التي يتم نقلها بعد ذلك معا.
- التحقق من الصحة - غالبا ما تحتاج بيانات الحدث من مصادر خارجية إلى التحقق مما إذا كانت متوافقة مع مجموعة من القواعد قبل إعادة توجيهها. يمكن التعبير عن القواعد باستخدام المخططات أو التعليمات البرمجية. قد يتم إسقاط الأحداث التي تم العثور على عدم توافقها، مع ملاحظة المشكلة في السجلات، أو قد تتم إعادة توجيهها إلى وجهة هدف خاصة للتعامل معها بشكل أكبر.
- الإثراء - قد تتطلب بيانات الأحداث الواردة من بعض المصادر الإثراء مع مزيد من السياق حتى تكون قابلة للاستخدام في الأنظمة المستهدفة. قد يتضمن ذلك البحث عن البيانات المرجعية وتضمين تلك البيانات مع الحدث، أو إضافة معلومات حول المصدر المعروف لمهمة النسخ المتماثل، ولكن غير المضمن في الأحداث.
- التصفية - قد يلزم حجب بعض الأحداث التي تصل من مصدر عن الهدف استنادا إلى بعض القواعد. يختبر عامل التصفية الحدث مقابل قاعدة ويسقط الحدث إذا لم يتطابق الحدث مع القاعدة. تعد تصفية الأحداث المكررة عن طريق مراقبة معايير معينة وإسقاط الأحداث اللاحقة بنفس القيم شكلا من أشكال التصفية.
- التشفير - قد تضطر مهمة النسخ المتماثل إلى فك تشفير المحتوى الذي يصل من المصدر و/أو تشفير المحتوى الذي تمت إعادة توجيهه إلى الهدف، و/أو قد يتعين عليها التحقق من سلامة المحتوى وبيانات التعريف المتعلقة بالتوقيع الذي تم نقله في الحدث، أو إرفاق مثل هذا التوقيع.
- التصديق - قد تقوم مهمة النسخ المتماثل بإرفاق بيانات التعريف، التي يحتمل أن تكون محمية بتوقيع رقمي، بحدث يشهد على أن الحدث قد تم تلقيه من خلال قناة معينة أو في وقت محدد.
- التسلسل - قد تطبق مهمة النسخ المتماثل تواقيع على تدفقات الأحداث بحيث تكون تكامل الدفق محمية ويمكن الكشف عن الأحداث المفقودة.
يتم تنفيذ أنماط التحويل والدفعات والإثراء بشكل عام بشكل أفضل مع وظائف Azure Stream Analytics .
يمكن تنفيذ جميع هذه الأنماط باستخدام Azure Functions، باستخدام مشغل مراكز الأحداث للحصول على الأحداث وربط إخراج Event Hub لتسليمها.
التوجيه
يعتمد نمط التوجيه على نمط النسخ المتماثل ، ولكن بدلا من وجود مصدر واحد وهدف واحد، فإن مهمة النسخ المتماثل لها أهداف متعددة، موضحة هنا في C#:
[FunctionName("EH2EH")]
public static async Task Run(
[EventHubTrigger("source", Connection = "EventHubConnectionAppSetting")] EventData[] events,
[EventHub("dest1", Connection = "EventHubConnectionAppSetting")] EventHubClient output1,
[EventHub("dest2", Connection = "EventHubConnectionAppSetting")] EventHubClient output2,
ILogger log)
{
foreach (EventData eventData in events)
{
// send to output1 and/or output2 based on criteria
EventHubReplicationTasks.ConditionalForwardToEventHub(input, output1, log, (eventData) => {
return ( inputEvent.SystemProperties.SequenceNumber%2==0 ) ? inputEvent : null;
});
EventHubReplicationTasks.ConditionalForwardToEventHub(input, output2, log, (eventData) => {
return ( inputEvent.SystemProperties.SequenceNumber%2!=0 ) ? inputEvent : null;
});
}
}
ستنظر دالة التوجيه في بيانات تعريف الرسالة و/أو حمولة الرسالة ثم تختار إحدى الوجهات المتوفرة لإرسالها.
في Azure Stream Analytics، يمكنك تحقيق الشيء نفسه مع تحديد مخرجات متعددة ثم تنفيذ استعلام لكل إخراج.
select * into dest1Output from inputSource where Info = 1
select * into dest2Output from inputSource where Info = 2
إسقاط السجل
يبسط نمط إسقاط السجل دفق الحدث على قاعدة بيانات مفهرسة، مع تحول الأحداث إلى سجلات في قاعدة البيانات. عادة ما تتم إضافة الأحداث إلى نفس المجموعة أو الجدول، ويصبح مفتاح قسم Event Hub جزءا من المفتاح الأساسي الذي يبحث عن جعل السجل فريدا.
يمكن أن ينتج إسقاط السجل مؤرخ سلسلة زمنية لبيانات الحدث أو طريقة عرض مضغوطة، حيث يتم الاحتفاظ بأحدث حدث فقط لكل مفتاح قسم. شكل قاعدة البيانات الهدف متروك لك واحتياجات التطبيق الخاص بك في نهاية المطاف. يشار إلى هذا النمط أيضا باسم "مصادر الأحداث".
تلميح
يمكنك بسهولة إنشاء إسقاطات السجل في قاعدة بيانات Azure SQLوAzure Cosmos DB في Azure Stream Analytics، ويجب أن تفضل هذا الخيار.
يعرض Azure Function التالي محتويات Event Hub المضغوط في مجموعة Azure Cosmos DB.
[FunctionName("Eh1ToCosmosDb1Json")]
[ExponentialBackoffRetry(-1, "00:00:05", "00:05:00")]
public static async Task Eh1ToCosmosDb1Json(
[EventHubTrigger("eh1", ConsumerGroup = "Eh1ToCosmosDb1", Connection = "Eh1ToCosmosDb1-source-connection")] EventData[] input,
[CosmosDB(databaseName: "SampleDb", collectionName: "foo", ConnectionStringSetting = "CosmosDBConnection")] IAsyncCollector<object> output,
ILogger log)
{
foreach (var ev in input)
{
if (!string.IsNullOrEmpty(ev.SystemProperties.PartitionKey))
{
var record = new
{
id = ev.SystemProperties.PartitionKey,
data = JsonDocument.Parse(ev.Body),
properties = ev.Properties
};
await output.AddAsync(record);
}
}
}