Azure 服務匯流排與 Event Grid 的整合概觀
當佇列或訂用帳戶中有訊息,但沒有任何接收者存在時,服務匯流排可以將事件發出至 Event Grid。 您可以在服務匯流排命名空間中建立 Event Grid 訂用帳戶,接聽這些事件,然後啟動接收者來回應事件。 利用此功能,您可以在反應靈敏的程式設計模型中使用服務匯流排。 此功能的主要案例就是具有少量訊息的服務匯流排佇列或訂用帳戶,不必讓接收者持續輪詢訊息。
若要啟用此功能,您需要下列項目:
- 具有至少一個服務匯流排佇列的服務匯流排進階命名空間或具有至少一個訂用帳戶的服務匯流排主題。
- 服務匯流排命名空間的參與者存取權。 在 Azure 入口網站中導覽至您的服務匯流排命名空間,然後選取 [存取控制 (IAM)],然後選取 [角色指派] 索引標籤。確認您具有命名空間的參與者存取權。
- 此外,您還需要適用於服務匯流排命名空間的 Event Grid 訂用帳戶。 此訂用帳戶會從有訊息可供挑選的 Event Grid 接收通知。 典型訂閱者可能是 Azure App Service 的 Logic Apps 功能、Azure Functions,或聯繫 Web 應用程式的 Web Hook。 訂閱者會接著處理訊息。
可用的事件類型
服務匯流排會發出下列事件類型:
事件類型 | 描述 |
---|---|
Microsoft.ServiceBus.ActiveMessagesAvailableWithNoListeners |
當佇列或訂用帳戶有作用中的新訊息但沒有接聽的接聽程式時,就會引發。 |
Microsoft.ServiceBus.DeadletterMessagesAvailableWithNoListeners |
當無效信件佇列中有作用中的新訊息但沒有作用中的接聽程式時,就會引發。 |
Microsoft.ServiceBus.ActiveMessagesAvailablePeriodicNotifications |
如果佇列或訂閱中有作用中的訊息,則每 30 秒引發一次,即使該特定佇列或訂閱上有作用中的接聽程式也一樣。 當作用中的訊息計數從 0 轉換為佇列或訂閱的正數值時,也會引發此事件。 |
Microsoft.ServiceBus.DeadletterMessagesAvailablePeriodicNotifications |
如果佇列或訂閱的無效信件實體中有訊息,則每 30 秒引發一次,即使該特定佇列或訂閱的無效信件實體上有作用中的接聽程式也一樣。 當無效信件訊息計數從 0 轉換為佇列或訂閱的無效信件實體的正數值時,也會引發此事件。 |
事件範例
沒有接聽程式的可用作用中訊息
如果佇列或訂用帳戶有作用中的訊息,但沒有接聽的接收者,就會產生此事件。
[{
"topic": "/subscriptions/{subscription-id}/resourcegroups/{your-rg}/providers/Microsoft.ServiceBus/namespaces/{your-service-bus-namespace}",
"subject": "topics/{your-service-bus-topic}/subscriptions/{your-service-bus-subscription}",
"eventType": "Microsoft.ServiceBus.ActiveMessagesAvailableWithNoListeners",
"eventTime": "2018-02-14T05:12:53.4133526Z",
"id": "dede87b0-3656-419c-acaf-70c95ddc60f5",
"data": {
"namespaceName": "YOUR SERVICE BUS NAMESPACE WILL SHOW HERE",
"requestUri": "https://{your-service-bus-namespace}.servicebus.windows.net/{your-topic}/subscriptions/{your-service-bus-subscription}/messages/head",
"entityType": "subscriber",
"queueName": "QUEUE NAME IF QUEUE",
"topicName": "TOPIC NAME IF TOPIC",
"subscriptionName": "SUBSCRIPTION NAME"
},
"dataVersion": "1",
"metadataVersion": "1"
}]
沒有接聽程式的可用無效信件訊息
無效信件佇列事件的結構描述相當類似。 您可對每個無效信件佇列取得至少一個事件,而此種佇列具有訊息,但沒有作用中的接收者。
[{
"topic": "/subscriptions/{subscription-id}/resourcegroups/{your-rg}/providers/Microsoft.ServiceBus/namespaces/{your-service-bus-namespace}",
"subject": "topics/{your-service-bus-topic}/subscriptions/{your-service-bus-subscription}",
"eventType": "Microsoft.ServiceBus.DeadletterMessagesAvailableWithNoListeners",
"eventTime": "2018-02-14T05:12:53.4133526Z",
"id": "dede87b0-3656-419c-acaf-70c95ddc60f5",
"data": {
"namespaceName": "YOUR SERVICE BUS NAMESPACE WILL SHOW HERE",
"requestUri": "https://{your-service-bus-namespace}.servicebus.windows.net/{your-topic}/subscriptions/{your-service-bus-subscription}/$deadletterqueue/messages/head",
"entityType": "subscriber",
"queueName": "QUEUE NAME IF QUEUE",
"topicName": "TOPIC NAME IF TOPIC",
"subscriptionName": "SUBSCRIPTION NAME"
},
"dataVersion": "1",
"metadataVersion": "1"
}]
作用中訊息可用定期通知
如果在特定佇列或訂閱上有著作用中訊息,即使該特定佇列或訂閱上有作用中的接聽程式,也會定期產生此事件。
[{
"topic": "/subscriptions/<subscription id>/resourcegroups/DemoGroup/providers/Microsoft.ServiceBus/namespaces/<YOUR SERVICE BUS NAMESPACE WILL SHOW HERE>",
"subject": "topics/<service bus topic>/subscriptions/<service bus subscription>",
"eventType": "Microsoft.ServiceBus.ActiveMessagesAvailablePeriodicNotifications",
"eventTime": "2018-02-14T05:12:53.4133526Z",
"id": "dede87b0-3656-419c-acaf-70c95ddc60f5",
"data": {
"namespaceName": "YOUR SERVICE BUS NAMESPACE WILL SHOW HERE",
"requestUri": "https://YOUR-SERVICE-BUS-NAMESPACE-WILL-SHOW-HERE.servicebus.windows.net/TOPIC-NAME/subscriptions/SUBSCRIPTIONNAME/$deadletterqueue/messages/head",
"entityType": "subscriber",
"queueName": "QUEUE NAME IF QUEUE",
"topicName": "TOPIC NAME IF TOPIC",
"subscriptionName": "SUBSCRIPTION NAME"
},
"dataVersion": "1",
"metadataVersion": "1"
}]
無效信件訊息可用定期通知
如果在特定佇列或訂閱上有著無效信件訊息,即使該特定佇列或訂閱上的無效信件實體上有作用中的接聽程式,也會定期產生此事件。
[{
"topic": "/subscriptions/<subscription id>/resourcegroups/DemoGroup/providers/Microsoft.ServiceBus/namespaces/<YOUR SERVICE BUS NAMESPACE WILL SHOW HERE>",
"subject": "topics/<service bus topic>/subscriptions/<service bus subscription>",
"eventType": "Microsoft.ServiceBus.DeadletterMessagesAvailablePeriodicNotifications",
"eventTime": "2018-02-14T05:12:53.4133526Z",
"id": "dede87b0-3656-419c-acaf-70c95ddc60f5",
"data": {
"namespaceName": "YOUR SERVICE BUS NAMESPACE WILL SHOW HERE",
"requestUri": "https://YOUR-SERVICE-BUS-NAMESPACE-WILL-SHOW-HERE.servicebus.windows.net/TOPIC-NAME/subscriptions/SUBSCRIPTIONNAME/$deadletterqueue/messages/head",
"entityType": "subscriber",
"queueName": "QUEUE NAME IF QUEUE",
"topicName": "TOPIC NAME IF TOPIC",
"subscriptionName": "SUBSCRIPTION NAME"
},
"dataVersion": "1",
"metadataVersion": "1"
}]
事件屬性
事件具有下列的最高層級資料:
屬性 | 類型 | 描述 |
---|---|---|
topic |
string | 事件來源的完整資源路徑。 此欄位無法寫入。 事件方格提供此值。 |
subject |
string | 發行者定義事件主旨的路徑。 |
eventType |
string | 此事件來源已註冊的事件類型之一。 |
eventTime |
string | 事件產生的時間,以提供者的 UTC 時間為準。 |
id |
string | 事件的唯一識別碼。 |
data |
object | blob 儲存體帳戶。 |
dataVersion |
string | 資料物件的結構描述版本。 發行者會定義結構描述版本。 |
metadataVersion |
string | 事件中繼資料的結構描述版本。 「事件方格」會定義最上層屬性的結構描述。 事件方格提供此值。 |
資料物件具有下列屬性:
屬性 | 類型 | 描述 |
---|---|---|
namespaceName |
string | 資源所在的服務匯流排命名空間。 |
requestUri |
string | 要發出此事件的特定佇列或訂用帳戶 URI。 |
entityType |
string | 發出事件 (佇列或訂閱) 的服務匯流排實體類型。 |
queueName |
string | 如果訂閱佇列則為作用中訊息佇列。 如果使用主題 / 訂用帳戶則為 null 值。 |
topicName |
string | 包含作用中訊息所屬之服務匯流排訂用帳戶的主題。 如果使用佇列則為 null 值。 |
subscriptionName |
string | 具有作用中訊息的服務匯流排訂用帳戶。 如果使用佇列則為 null 值。 |
服務匯流排命名空間的事件方格訂閱
為服務匯流排命名空間建立 Event Grid 訂用帳戶的方式有三種:
- Azure 入口網站。 請參閱下列教學課程,瞭解如何使用 Azure 入口網站,為服務匯流排事件建立事件方格訂閱,並搭配 Azure Logic Apps 和 Azure Functions 作為處理常式。
Azure CLI。 下列 CLI 範例示範如何為服務匯流排命名空間所建立的系統主題建立起 Azure Functions 訂閱。
namespaceid=$(az resource show --namespace Microsoft.ServiceBus --resource-type namespaces --name "<service bus namespace>" --resource-group "<resource group that contains the service bus namespace>" --query id --output tsv az eventgrid event-subscription create --resource-id $namespaceid --name "<YOUR EVENT GRID SUBSCRIPTION NAME>" --endpoint "<your_endpoint_url>" --subject-ends-with "<YOUR SERVICE BUS SUBSCRIPTION NAME>"
- PowerShell。 以下是範例:
$namespaceID = (Get-AzServiceBusNamespace -ResourceGroupName "<YOUR RESOURCE GROUP NAME>" -NamespaceName "<YOUR NAMESPACE NAME>").Id New-AzEVentGridSubscription -EventSubscriptionName "<YOUR EVENT GRID SUBSCRIPTION NAME>" -ResourceId $namespaceID -Endpoint "<YOUR ENDPOINT URL>” -SubjectEndsWith "<YOUR SERVICE BUS SUBSCRIPTION NAME>"
發出事件的數量和頻率為何?
如果命名空間中有多個佇列和主題或訂用帳戶,您會對每個佇列和每個訂用帳戶取得至少一個事件。 如果服務匯流排實體中沒有任何訊息,而且有一則新訊息送達,系統就會立即發出事件。 除非服務匯流排偵測到作用中的接收者,否則會每兩分鐘發出事件。 瀏覽訊息並不會干擾事件。
依預設,服務匯流排會針對命名空間中的所有實體發出事件。 如果您只想取得特定實體的事件,請參閱下一節。
使用篩選條件來限制您取得事件的來源
如果您只想從命名空間內的一個佇列或一個訂用帳戶取得事件,您可以使用 Event Grid 所提供的「開頭為」或「結尾為」篩選條件。 在某些介面中,篩選條件稱為「前置」和「尾碼」篩選條件。 如果您想取得多個佇列和訂用帳戶 (但並非所有佇列和訂用帳戶) 的事件,您可以建立多個 Event Grid 訂用帳戶並且為每個訂用帳戶提供一個篩選條件。
下一步
請參閱下列教學課程: