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
- Maak en configureer uw primaire Event Grid-resource.
- Maak en configureer uw secundaire Event Grid-resource.
- Houd er rekening mee dat beide resources dezelfde configuratie, subresources en mogelijkheden moeten hebben ingeschakeld.
- Event Grid-resources moeten worden gehost in verschillende regio's.
- 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.
- 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
- Informatie over het ontvangen van gebeurtenissen op een HTTP-eindpunt
- Leer gebeurtenissen routeren naar Hybride verbindingen
- Informatie over herstel na noodgevallen met Azure DNS en Traffic Manager