Bagikan melalui


Implementasi failover sisi klien di Azure Event Grid

Pemulihan bencana biasanya melibatkan pembuatan sumber daya cadangan untuk mencegah gangguan ketika suatu wilayah menjadi tidak sehat. Selama proses ini, wilayah utama dan sekunder sumber daya Azure Event Grid akan diperlukan dalam beban kerja Anda.

Ada berbagai cara untuk pulih dari hilangnya fungsionalitas aplikasi yang parah. Dalam artikel ini kami akan menjelaskan daftar periksa yang perlu Anda ikuti untuk mempersiapkan klien Anda pulih dari kegagalan karena sumber daya atau wilayah yang tidak sehat.

Event Grid mendukung pemulihan bencana geografis manual dan otomatis (GeoDR) di sisi server. Anda masih dapat menerapkan logika pemulihan bencana sisi klien jika Anda menginginkan kontrol yang lebih besar pada proses kegagalan. Untuk detail tentang GeoDR otomatis, lihat Pemulihan bencana geografis sisi server di Azure Event Grid.

Tabel berikut mengilustrasikan failover sisi klien dan dukungan pemulihan bencana geografis di Event Grid.

Sumber daya Azure Event Grid Dukungan failover sisi klien Dukungan pemulihan bencana geografis (GeoDR)
Topik kustom Didukung Lintas Geo / Regional
Topik Sistem Tidak didukung Diaktifkan secara otomatis
Domain Didukung Lintas Geo / Regional
Namespace Mitra Didukung Tidak didukung
Namespace Didukung Tidak didukung

Pertimbangan failover sisi klien

  1. Buat dan konfigurasikan sumber daya Event Grid utama Anda.
  2. Buat dan konfigurasikan sumber daya Event Grid sekunder Anda.
  3. Perlu diingat kedua sumber daya harus memiliki konfigurasi, sub sumber daya, dan kemampuan yang sama diaktifkan.
  4. Sumber daya Event Grid harus dihosting di berbagai wilayah.
  5. Jika sumber daya Event Grid memiliki sumber daya dependen seperti sumber daya penyimpanan untuk dead-lettering, Anda harus menggunakan wilayah yang sama yang digunakan di sumber daya Event Grid sekunder.
  6. Pastikan titik akhir Anda diuji secara berkala untuk memberikan garansi sumber daya rencana pemulihan Anda tersedia dan berfungsi dengan benar.

Sampel implementasi failover sisi klien dasar untuk topik kustom

Kode sampel berikut adalah penerbit .NET sederhana yang mencoba menerbitkan ke topik utama Anda terlebih dahulu. Jika tidak berhasil, itu gagal melalui topik sekunder. Dalam kedua kasus, sampel kode juga memeriksa api kesehatan topik lain dengan melakukan GET pada https://<topic-name>.<topic-region>.eventgrid.azure.net/api/health. Topik yang sehat akan selalu merespons dengan 200 OK ketika GET dibuat pada titik akhir /api/kesehatan.

Catatan

Kode sampel berikut hanya untuk tujuan demonstrasi dan tidak dimaksudkan untuk penggunaan produksi.

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

Cobalah

Sekarang setelah Anda memiliki semua komponen, Anda dapat menguji implementasi kegagalan Anda.

Untuk memastikan failover berfungsi, Anda dapat mengubah beberapa karakter di kunci topik utama agar tidak lagi valid. Coba jalankan kembali penerbit. Dengan contoh peristiwa berikut akan terus mengalir melalui Event Grid, namun ketika Anda melihat klien Anda, Anda akan melihat peristiwa tersebut sekarang diterbitkan melalui topik sekunder.

Ekstensi yang memungkinkan

Ada banyak cara untuk memperpanjang sampel ini berdasarkan kebutuhan Anda. Untuk skenario volume tinggi, Anda mungkin ingin secara teratur memeriksa api kesehatan topik secara independen. Dengan begitu, jika sebuah topik tidak berfungsi, Anda tidak perlu memeriksanya dengan setiap publikasi. Setelah mengetahui sebuah topik tidak sehat, Anda dapat menstandarkan untuk menerbitkan ke topik sekunder.

Demikian pula, Anda mungkin ingin menerapkan logika failback berdasarkan kebutuhan spesifik Anda. Jika mempublikasikan ke pusat data terdekat sangat penting bagi Anda untuk mengurangi latensi, Anda dapat secara berkala menyelidiki api kesehatan dari topik yang telah gagal. Setelah sehat lagi, aman untuk failback ke pusat data yang lebih dekat.

Langkah berikutnya