تنفيذ تجاوز الفشل من جانب العميل في 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 بسيط يحاول النشر إلى موضوعك الأساسي أولا. إذا لم ينجح، فإنه يفشل على الموضوع الثانوي. في كلتا الحالتين، فإنه يتحقق أيضا من سلامة واجهة برمجة التطبيقات للموضوع الآخر عن طريق القيام «باستدعاء» على https://<topic-name>.<topic-region>.eventgrid.azure.net/api/health. يجب أن يستجيب الموضوع الصحي دائمًا مع 200 OK عند إجراء «استدعاء» على نقطة النهاية /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، ولكن عندما تنظر إلى العميل الخاص بك، سترى أنها يتم نشرها الآن عبر الموضوع الثانوي.

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

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

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

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