Sdílet prostřednictvím


Implementace převzetí služeb při selhání na straně klienta ve službě Azure Event Grid

Zotavení po havárii obvykle zahrnuje vytvoření záložního prostředku, aby se zabránilo přerušení v případě, že oblast není v pořádku. Během tohoto procesu bude ve vaší úloze potřeba primární a sekundární oblast prostředků Azure Event Gridu.

Existují různé způsoby, jak se zotavit z závažné ztráty funkčnosti aplikace. V tomto článku popíšeme kontrolní seznam, který budete muset provést, abyste připravili klienta, aby se zotavil z důvodu prostředku nebo oblasti, která není v pořádku.

Event Grid podporuje ruční a automatické geografické zotavení po havárii (GeoDR) na straně serveru. Logiku zotavení po havárii na straně klienta můžete stále implementovat, pokud chcete mít větší kontrolu nad procesem převzetí služeb při selhání. Podrobnosti o automatické geografické zotavení po havárii na straně serveru najdete v Tématu Zotavení po havárii na straně serveru ve službě Azure Event Grid.

Následující tabulka znázorňuje podporu převzetí služeb při selhání na straně klienta a podporu geografického zotavení po havárii ve službě Event Grid.

Prostředek Event Gridu Podpora převzetí služeb při selhání na straně klienta Podpora geografického zotavení po havárii (GeoDR)
Vlastní témata Podporováno Cross-Geo / Regional
Systémová témata Nepodporováno Povoleno automaticky
Domény Podporováno Cross-Geo / Regional
Obory názvů partnerů Podporováno Nepodporováno
Obory názvů Podporováno Nepodporováno

Aspekty převzetí služeb při selhání na straně klienta

  1. Vytvořte a nakonfigurujte primární prostředek Event Gridu.
  2. Vytvořte a nakonfigurujte sekundární prostředek Event Gridu.
  3. Mějte na paměti, že oba prostředky musí mít stejnou konfiguraci, podsourcy a možnosti povolené.
  4. Prostředky Event Gridu musí být hostované v různých oblastech.
  5. Pokud prostředek Event Gridu závisí na prostředcích, jako je prostředek úložiště pro nedoručované dopisy, měli byste použít stejnou oblast jako v sekundárním prostředku Event Gridu.
  6. Ujistěte se, že vaše koncové body pravidelně testují, aby poskytovaly záruku, že jsou prostředky plánu obnovení zavedené a fungují správně.

Ukázka implementace převzetí služeb při selhání na straně klienta pro vlastní témata

Následující ukázkový kód je jednoduchý vydavatel .NET, který se nejprve pokusí publikovat do primárního tématu. Pokud se nezdaří, převezme služby při selhání sekundárního tématu. V obou případech také kontroluje rozhraní API stavu jiného tématu pomocí get on https://<topic-name>.<topic-region>.eventgrid.azure.net/api/health. Při vytváření get v koncovém bodu /api/health by vždy mělo být v pořádku téma, které je v pořádku, vždy reagovat s 200 OK.

Poznámka:

Následující ukázkový kód je určený pouze pro demonstrační účely a není určený pro produkční použití.

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

Vyzkoušejte si to.

Teď, když máte všechny komponenty na místě, můžete otestovat implementaci převzetí služeb při selhání.

Abyste měli jistotu, že převzetí služeb při selhání funguje, můžete změnit několik znaků v primárním klíči tématu, aby už nebylo platné. Zkuste vydavatele spustit znovu. Následující ukázkové události budou pokračovat v procházení Event Gridu, ale když se podíváte na klienta, uvidíte, že se teď publikují prostřednictvím sekundárního tématu.

Možná rozšíření

Existuje mnoho způsobů, jak tuto ukázku rozšířit na základě vašich potřeb. U scénářů s velkým objemem můžete chtít pravidelně kontrolovat rozhraní API pro stav tématu nezávisle na sobě. Pokud by se tak téma mělo snížit, nemusíte ho kontrolovat při každém publikování. Jakmile víte, že téma není v pořádku, můžete ve výchozím nastavení publikovat do sekundárního tématu.

Podobně můžete chtít implementovat logiku navrácení služeb po obnovení na základě vašich konkrétních potřeb. Pokud je publikování do nejbližšího datového centra pro vás důležité, abyste snížili latenci, můžete pravidelně testovat rozhraní API stavu tématu, u kterého došlo k převzetí služeb při selhání. Jakmile je znovu v pořádku, je bezpečné navrácení služeb po obnovení do bližšího datacentra.

Další kroky