Implementatie van failover aan clientzijde in Azure Event Grid

Herstel na noodgevallen omvat meestal het maken van een back-upresource om onderbrekingen te voorkomen wanneer een regio beschadigd raakt. Tijdens dit proces zijn een primaire en secundaire regio van Azure Event Grid-resources nodig in uw workload.

Er zijn verschillende manieren om te herstellen van een ernstig verlies van toepassingsfunctionaliteit. In dit artikel beschrijven we de controlelijst die u moet volgen om uw client voor te bereiden op het herstellen van een fout vanwege een beschadigde resource of regio.

Event Grid ondersteunt handmatig en automatisch geo-noodherstel (GeoDR) aan de serverzijde. U kunt de logica voor noodherstel aan de clientzijde nog steeds implementeren als u meer controle wilt over het failoverproces. Zie Herstel na geonoodgeval aan de serverzijde in Azure Event Grid voor meer informatie over automatische GeoDR.

In de volgende tabel ziet u de ondersteuning voor failover aan de clientzijde en ondersteuning voor geo-herstel na noodgevallen in Event Grid.

Event Grid-resource Ondersteuning voor failover aan clientzijde Ondersteuning voor geo-herstel na noodgevallen (GeoDR)
Aangepaste onderwerpen Ondersteund Cross-Geo/Regionaal
Systeemonderwerpen Niet ondersteund Automatisch ingeschakeld
Domeinen Ondersteund Cross-Geo/Regionaal
Partnernaamruimten Ondersteund Niet ondersteund
Naamruimten Ondersteund Niet ondersteund

Overwegingen voor failover aan de clientzijde

  1. Maak en configureer uw primaire Event Grid-resource.
  2. Maak en configureer uw secundaire Event Grid-resource.
  3. Houd er rekening mee dat beide resources dezelfde configuratie, subresources en mogelijkheden moeten hebben ingeschakeld.
  4. Event Grid-resources moeten worden gehost in verschillende regio's.
  5. Als de Event Grid-resource afhankelijke resources heeft, zoals een opslagresource voor dead-lettering, moet u dezelfde regio gebruiken die wordt gebruikt in de secundaire Event Grid-resource.
  6. Zorg ervoor dat uw eindpunten regelmatig worden getest om garantie te bieden dat uw resources voor het herstelplan aanwezig zijn en goed werken.

Eenvoudig voorbeeld van failover-implementatie aan clientzijde voor aangepaste onderwerpen

De volgende voorbeeldcode is een eenvoudige .NET-uitgever die eerst naar uw primaire onderwerp probeert te publiceren. Als het niet lukt, wordt een failover uitgevoerd voor het secundaire onderwerp. In beide gevallen wordt ook de status-API van het andere onderwerp gecontroleerd door een GET uit te voeren op https://<topic-name>.<topic-region>.eventgrid.azure.net/api/health. Een onderwerp dat in orde is, reageert altijd met 200 OK als er een GET wordt uitgevoerd op het /api/health-eindpunt.

Notitie

De volgende voorbeeldcode is alleen bedoeld voor demonstratiedoeleinden en is niet bedoeld voor productiegebruik.

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

Probeer het zelf

Nu alle onderdelen op hun plaats staan, kunt u de implementatie van de failover testen.

Als u wilt controleren of uw failover werkt, kunt u een paar tekens in de primaire onderwerpsleutel wijzigen om deze niet langer geldig te maken. Voer de gebeurtenisuitgever nogmaals uit. Met de volgende voorbeeldgebeurtenissen blijft event grid doorlopen, maar wanneer u uw client bekijkt, ziet u dat deze nu worden gepubliceerd via het secundaire onderwerp.

Mogelijke uitbreidingen

U kunt dit voorbeeld op verschillende manieren naar behoefte uitbreiden. Voor scenario's met grote volumes is het mogelijk de status-API van het onderwerp onafhankelijk te controleren. Op die manier hoeft u een uitgevallen onderwerp niet voor elke afzonderlijke publicatie te controleren. Als u weet dat een onderwerp niet in orde is, kunt u terugvallen op publicatie naar het secundaire onderwerp.

U kunt ook failback-logica implementeren op basis van uw behoeften. Als u het belangrijk vindt te publiceren naar het dichtstbijzijnde datacentrum teneinde de latentie te verminderen, kunt u de status-API van een onderwerp waarvoor failover is uitgevoerd, periodiek testen. Zodra het weer in orde is, is het veilig om failback naar het dichtere datacenter uit te voeren.

Volgende stappen