Azure Event Grid'de istemci tarafı yük devretme uygulaması

Olağanüstü durum kurtarma genellikle bir bölge iyi durumda olmadığında kesintileri önlemek için bir yedekleme kaynağı oluşturmayı içerir. Bu işlem sırasında iş yükünüzde Azure Event Grid kaynaklarının birincil ve ikincil bölgesi gerekir.

Uygulama işlevselliğinde ciddi bir kayıptan kurtulmanın farklı yolları vardır. Bu makalede, sağlıksız bir kaynak veya bölge nedeniyle oluşan bir hatadan kurtarmaya müşterinizi hazırlamak için izlemeniz gereken kontrol listesini açıklayacağız.

Event Grid, sunucu tarafında el ile ve otomatik coğrafi olağanüstü durum kurtarmayı (GeoDR) destekler. İstemci tarafında daha fazla denetime sahip olmak istiyorsanız olağanüstü durum kurtarma mantığını uygulamaya devam edebilirsiniz. Otomatik GeoDR hakkında ayrıntılı bilgi için bkz. Azure Event Grid'de sunucu tarafı coğrafi olağanüstü durum kurtarma.

Aşağıdaki tabloda Event Grid'de istemci tarafı yük devretme ve coğrafi olağanüstü durum kurtarma desteği gösterilmektedir.

Event Grid kaynağı İstemci tarafı yük devretme desteği Coğrafi olağanüstü durum kurtarma (GeoDR) desteği
Özel Konu Başlıkları Destekleniyor Çapraz Coğrafi / Bölgesel
Sistem Konuları Desteklenmiyor Otomatik olarak etkinleştirildi
Etki alanları Destekleniyor Çapraz Coğrafi / Bölgesel
İş Ortağı Ad Alanları Destekleniyor Desteklenmiyor
Namespace'ler Destekleniyor Desteklenmiyor

İstemci tarafı yük devretme sırasında dikkate alınması gerekenler

  1. Birincil Event Grid kaynağınızı oluşturun ve yapılandırın.
  2. İkincil Event Grid kaynağınızı oluşturun ve yapılandırın.
  3. Her iki kaynağın da aynı yapılandırmaya, alt kaynaklara ve özelliklere sahip olması gerektiğini unutmayın.
  4. Event Grid kaynaklarının farklı bölgelerde barındırılması gerekir.
  5. Event Grid kaynağının, ölü mektup işlemesi için depolama kaynağı gibi bağımlı kaynakları varsa, ikincil Event Grid kaynağında kullanılan aynı bölgeyi kullanmalısınız.
  6. Kurtarma planı kaynaklarınızın yerinde ve düzgün çalıştığından emin olmak için uç noktalarınızın düzenli olarak test olduğundan emin olun.

Özel konular için temel istemci tarafı yük devretme uygulama örneği

Aşağıdaki örnek kod, önce birincil konu başlığınızda yayımlamayı deneyen basit bir .NET yayımcısıdır. Başarılı olmazsa ikincil konu üzerinden başarısız olur. Her iki durumda da üzerinde get https://<topic-name>.<topic-region>.eventgrid.azure.net/api/healthyaparak diğer konunun sistem durumu api'sini denetler. /api/health uç noktasında bir GET yapıldığında sağlıklı bir konu her zaman 200 Tamam ile yanıt vermelidir.

Uyarı

Aşağıdaki örnek kod yalnızca tanıtım amaçlıdır ve üretim kullanımına yönelik değildir.

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;
        }
    }
}

Deneyin

Artık tüm bileşenlerinizi oluşturduğunuza göre yük devretme uygulamanızı test edebilirsiniz.

Yük devretme işleminizin doğru bir şekilde çalıştığından emin olmak için, birincil konu anahtarındaki birkaç karakteri değiştirerek onu geçersiz hale getirebilirsiniz. Yayımcıyı yeniden çalıştırmayı deneyin. Aşağıdaki örnek olaylar Event Grid üzerinden akmaya devam edecektir, ancak istemcinize baktığınızda, bunların artık ikincil konu üzerinden yayımlandığını görürsünüz.

Olası uzantılar

Bu örneği gereksinimlerinize göre genişletmenin birçok yolu vardır. Yüksek hacimli senaryolar için, konunun sistem durumu api'sini düzenli olarak bağımsız olarak denetlemek isteyebilirsiniz. Bu şekilde, bir konu devre dışı kalırsa, her yayında bunu kontrol etmeniz gerekmez. Bir konunun sağlıksız olduğunu bildiğinizde, ikincil konuya yayım yapmayı tercih edebilirsiniz.

Benzer şekilde, kendi gereksinimlerinize göre geri dönüş mantığı uygulamak isteyebilirsiniz. Gecikme süresini azaltmak için en yakın veri merkezine yayımlamak sizin için kritik önemdeyse, başka bir sunucuya aktarılan konunun sağlık API'sini düzenli aralıklarla kontrol edebilirsiniz. Sistem tekrar sağlıklı hale geldiğinde yakın olan veri merkezine geri dönmek güvenlidir.

Sonraki Adımlar