تنفيذ تجاوز الفشل من جانب العميل في Azure Event Grid

يتضمن الاسترداد بعد الكوارث عادة إنشاء مورد نسخ احتياطي لمنع الانقطاعات عندما تصبح المنطقة غير صحية. أثناء هذه العملية، ستكون هناك حاجة إلى منطقة أساسية وثانوية من موارد Azure Event Grid في حمل العمل الخاص بك.

هناك طرق مختلفة للتعافي من فقدان شديد لوظائف التطبيق. في هذه المقالة سنصف قائمة الاختيار التي ستحتاج إلى اتباعها لإعداد العميل الخاص بك للتعافي من الفشل بسبب مورد أو منطقة غير صحية.

تدعم Event Grid الاسترداد اليدوي والتلقائي للكوارث الجغرافية (GeoDR) على جانب الخادم. لا يزال بإمكانك تطبيق منطق التعافي من الكوارث من جانب العميل إذا كنت تريد تحكمًا أكبر في عملية تجاوز الفشل. للحصول على تفاصيل حول GeoDR التلقائي، راجع Server-side geo disaster recovery in Azure Event Grid.

يوضح الجدول التالي تجاوز الفشل من جانب العميل ودعم التعافي من الكوارث الجغرافية في Event Grid.

مورد شبكة الأحداث دعم تجاوز الفشل من جانب العميل دعم التعافي من الكوارث الجغرافية (GeoDR)
مواضيع مخصصة مدعوم عبر المناطق الجغرافية / الإقليمية
مواضيع النظام غير مدعوم ممكن تلقائيا
المجالات مدعوم عبر المناطق الجغرافية / الإقليمية
مساحات أسماء الشركاء مدعوم غير مدعوم
مساحة الاسم مدعوم غير مدعوم

اعتبارات تجاوز الفشل من جانب العميل

  1. إنشاء مورد Event Grid الأساسي وتكوينه.
  2. إنشاء وتكوين مورد Event Grid الثانوي .
  3. ضع في اعتبارك أن كلا الموارد يجب أن يكون لها نفس التكوين والمصادر الفرعية والقدرات الممكنة.
  4. يجب استضافة موارد شبكة الأحداث في مناطق مختلفة.
  5. إذا كان مورد Event Grid يحتوي على موارد تابعة مثل مورد تخزين للأحرف غير المستخدمة، فيجب عليك استخدام نفس المنطقة المستخدمة في مورد Event Grid الثانوي.
  6. تأكد من أن نقاط النهاية الخاصة بك هي اختبارات منتظمة لتوفير الضمان موارد خطة الاسترداد الخاصة بك في مكانها وتعمل بشكل صحيح.

نموذج تنفيذ تجاوز الفشل الأساسي من جانب العميل للمواضيع المخصصة

نموذج التعليمات البرمجية التالي هو ناشر .NET بسيط يحاول النشر إلى موضوعك الأساسي أولا. إذا لم ينجح، فإنه يفشل على الموضوع الثانوي. في كلتا الحالتين، فإنه يتحقق أيضا من واجهة برمجة التطبيقات الصحية للموضوع الآخر عن طريق القيام ب GET على https://<topic-name>.<topic-region>.eventgrid.azure.net/api/health. يجب أن يستجيب الموضوع السليم دائما ب 200 موافق عند إجراء GET على نقطة النهاية /api/health .

ملاحظه

نموذج التعليمات البرمجية التالي هو فقط لأغراض العرض التوضيحي وليس مخصصا لاستخدام الإنتاج.

using System;
using System.Net.Http;
using System.Collections.Generic;
using System.Threading.Tasks;
using Azure;
using Azure.Messaging.EventGrid;

namespace EventGridFailoverPublisher
{
    // This captures the "Data" portion of an EventGridEvent on a custom topic
    class FailoverEventData
    {
        public string TestStatus { get; set; }
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            // TODO: Enter the endpoint each topic. You can find this topic endpoint value
            // in the "Overview" section in the "Event Grid topics" page in Azure portal.
            string primaryTopic = "https://<primary-topic-name>.<primary-topic-region>.eventgrid.azure.net/api/events";
            string secondaryTopic = "https://<secondary-topic-name>.<secondary-topic-region>.eventgrid.azure.net/api/events";

            // TODO: Enter topic key for each topic. You can find this in the "Access Keys" section in the
            // "Event Grid topics" page in Azure portal.
            string primaryTopicKey = "<your-primary-topic-key>";
            string secondaryTopicKey = "<your-secondary-topic-key>";

            Uri primaryTopicUri = new Uri(primaryTopic);
            Uri secondaryTopicUri = new Uri(secondaryTopic);

            Uri primaryTopicHealthProbe = new Uri($"https://{primaryTopicUri.Host}/api/health");
            Uri secondaryTopicHealthProbe = new Uri($"https://{secondaryTopicUri.Host}/api/health");

            var httpClient = new HttpClient();

            try
            {
                var client = new EventGridPublisherClient(primaryTopicUri, new AzureKeyCredential(primaryTopicKey));

                await client.SendEventsAsync(GetEventsList());
                Console.Write("Published events to primary Event Grid topic.");

                HttpResponseMessage health = httpClient.GetAsync(secondaryTopicHealthProbe).Result;
                Console.Write("\n\nSecondary Topic health " + health);
            }
            catch (RequestFailedException ex)
            {
                var client = new EventGridPublisherClient(secondaryTopicUri, new AzureKeyCredential(secondaryTopicKey));

                await client.SendEventsAsync(GetEventsList());
                Console.Write("Published events to secondary Event Grid topic. Reason for primary topic failure:\n\n" + ex);

                HttpResponseMessage health = await httpClient.GetAsync(primaryTopicHealthProbe);
                Console.WriteLine($"Primary Topic health {health}");
            }

            Console.ReadLine();
        }

        static IList<EventGridEvent> GetEventsList()
        {
            List<EventGridEvent> eventsList = new List<EventGridEvent>();

            for (int i = 0; i < 5; i++)
            {
                eventsList.Add(new EventGridEvent(
                    subject: "test" + i,
                    eventType: "Contoso.Failover.Test",
                    dataVersion: "2.0",
                    data: new FailoverEventData
                    {
                        TestStatus = "success"
                    }));
            }

            return eventsList;
        }
    }
}

عليك تجربة ذلك

الآن بعد أن أصبح لديك جميع المكونات الخاصة بك في مكانها، يمكنك اختبار تنفيذ تجاوز الفشل الخاص بك.

للتأكد من أن تجاوز الفشل يعمل، يمكنك تغيير بضعة أحرف في مفتاح الموضوع الأساسي لجعله لم يعد صالحا. حاول تشغيل الناشر مرة أخرى. مع أحداث العينة التالية ستستمر في التدفق عبر Event Grid، ولكن عندما تنظر إلى العميل الخاص بك، سترى أنها يتم نشرها الآن عبر الموضوع الثانوي.

الملحقات المحتملة

هناك العديد من الطرق لتوسيع هذه العينة بناء على احتياجاتك. بالنسبة للسيناريوهات ذات الحجم الكبير، قد تحتاج إلى التحقق بانتظام من صحة واجهة برمجة التطبيقات للموضوع بشكل مستقل. بهذه الطريقة، إذا كان الموضوع سيتعطل، فلن تحتاج إلى التحقق منه مع كل نشرة واحدة. بمجرد أن تعرف أن الموضوع غير سليم، يمكنك النشر بشكل افتراضي إلى الموضوع الثانوي.

وبالمثل، قد ترغب في تنفيذ منطق إرجاع الموارد استنادا إلى احتياجاتك المحددة. إذا كان النشر إلى أقرب مركز بيانات أمرا بالغ الأهمية لتقليل زمن الانتقال، يمكنك فحص واجهة برمجة التطبيقات الصحية لموضوع فشل بشكل دوري. بمجرد أن يصبح سليما مرة أخرى، من الآمن إعادة الموارد إلى مركز البيانات الأقرب.

الخطوات التالية