Azure 事件方格中的用戶端容錯移轉實作
災害復原通常牽涉到建立備份資源,以防止區域狀況不良時中斷。 在此流程期間,您的工作負載中將需要 Azure 事件方格資源的主要和次要區域。
有不同方式可從嚴重遺失的應用程式功能中復原。 在本文中,我們將協助您需要遵循的檢查清單,以準備用戶端因資源或區域狀況不良而從失敗中復原。
事件方格支援伺服器端上的手動和自動異地災害復原 (GeoDR)。 如果您想要更充分地控管容錯移轉程序,仍可實作用戶端災害復原邏輯。 如需有關自動 GeoDR 的詳細資訊,請參閱 Azure 事件方格中的伺服器端異地災害復原。
下表說明事件方格中的用戶端容錯移轉和異地災害復原支援。
事件方格資源 | 用戶端容錯移轉支援 | 異地災害復原 (GeoDR) 支援 |
---|---|---|
自訂主題 | 支援 | 跨地理位置/區域 |
系統主題 | 不支援 | 自動啟用 |
網域 | 支援 | 跨地理位置/區域 |
合作夥伴命名空間 | 支援 | 不支援 |
命名空間 | 支援 | 不支援 |
用戶端容錯移轉考慮
- 建立及設定主要事件方格資源。
- 建立及設定次要事件方格資源。
- 請記住,這兩個資源必須啟用相同的設定、子資源與功能。
- 事件方格資源必須裝載於不同的區域。
- 如果 Event Grid 資源具有相依資源,例如用於寄不出的信件儲存體資源,您應該使用次要事件方格資源中使用的相同區域。
- 請確定您的端點會定期進行測試,以提供復原方案資源已就緒且正常運作的保固。
自訂主題的基本用戶端容錯移轉實作範例
下列範例程式碼說明會先嘗試發佈至主要主題的簡單 .NET 發行者。 如果不成功,則其接下來會容錯移轉至次要主題。 在任一情況下,它也都會在 https://<topic-name>.<topic-region>.eventgrid.azure.net/api/health
上執行 GET,以檢查其他主題的健康情況 API。 在 /api/health 端點上進行 GET 時,狀況良好的主題應一律會回應 200 確定。
注意
下列範例程式碼僅供示範之用,不適用於實際執行環境。
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;
}
}
}
試試看
現在,您所有的元件皆已準備就緒,接下來即可測試容錯移轉實作。
若要確定容錯移轉可運作,您可以變更主要主題金鑰中的幾個字元,使金鑰失效。 再次嘗試執行發行者。 當您查看用戶端時,下列範例事件會繼續流經事件方格,您會看到它們現在正透過次要主題發佈。
可能的擴充
您可以透過多種方式根據本身的需求擴充此範例。 針對高容量的案例,您可以個別定期檢查主題的健康情況 API。 如此,當主題停止運作時,您將無須在每一次發佈時檢查主題。 一旦您知道某個主題的狀況不良,您就可以預設為發佈至次要主題。
同樣地,您也可以根據本身的特定需求實作容錯回復邏輯。 如果您必須發佈至最接近的資料中心以降低延遲,您可以定期對已容錯移轉的主題探查健康情況 API。 在其狀況恢復正常後,可安全地容錯回復至最接近的資料中心。
下一步
- 了解如何在 HTTP 端點接收事件
- 探索如何將事件路由至混合式連線
- 了解如何使用 Azure DNS 和流量管理員進行災害復原