當佇列中有訊息或訂用帳戶中沒有任何接收者時,服務總線可以將事件發出至事件方格。 您可以建立服務總線命名空間的事件方格訂用帳戶、接聽這些事件,然後啟動接收者來回應事件。 透過這項功能,您可以在回應式程序設計模型中使用服務總線。 這項功能的主要案例是,具有低容量訊息的服務總線佇列或訂用帳戶不需要有持續輪詢訊息的接收者。
若要啟用此功能,您需要下列項目:
- 具有至少一個服務總線佇列的服務總線進階命名空間,或具有至少一個訂用帳戶的服務總線主題。
- 服務總線命名空間的參與者存取權。 流覽至 Azure 入口網站中的服務總線命名空間,然後選取 [存取控制][IAM],然後選取 [ 角色指派] 索引標籤 。確認您具有命名空間的參與者存取權。
- 此外,您需要服務總線命名空間的事件方格訂用帳戶。 此訂閱會收到來自 Event Grid 的通知,指出有訊息需要接收。 一般的訂閱者可能包括 Azure App Service 的 Logic Apps 功能、Azure Functions,或是連絡 Web 應用程式的 Webhook。 訂閱者接著會處理訊息。
可用的事件類型
服務匯流排會發出下列事件類型:
事件類型 | 說明 |
---|---|
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 |
字符串 | 事件來源的完整資源路徑。 此欄位無法寫入。 事件方格提供此值。 |
subject |
字符串 | 發行者定義的事件主題路徑。 |
eventType |
字符串 | 這個事件來源的其中一個已註冊事件類型。 |
eventTime |
字符串 | 事件產生的時間,以提供者的 UTC 時間為準。 |
id |
字符串 | 事件的唯一識別碼。 |
data |
物體 | 服務總線事件數據。 |
dataVersion |
字符串 | 數據對象的架構版本。 發行者會定義架構版本。 |
metadataVersion |
字符串 | 事件元數據的架構版本。 事件方格會定義最上層屬性的架構。 事件方格提供此值。 |
資料物件具有下列屬性:
房產 | 類型 | 說明 |
---|---|---|
namespaceName |
字符串 | 資源存在於的服務總線命名空間。 |
requestUri |
字符串 | 發出事件之特定佇列或訂用帳戶的 URI。 |
entityType |
字符串 | 發送事件的服務總線實體類型(佇列或訂閱)。 |
queueName |
字符串 | 訂閱佇列時,具有活躍訊息的佇列。 如果使用主題/訂用帳戶,則為空值。 |
topicName |
字符串 | 具有作用中訊息的服務總線訂用帳戶所屬主題。 如果使用佇列,則為 Null。 |
subscriptionName |
字符串 | 具有有效消息的服務總線訂閱 如果使用佇列,則為 Null。 |
服務總線命名空間的事件格線訂閱
您可以透過三種不同的方式建立服務總線命名空間的事件方格訂用帳戶:
- 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>"
發出多少個事件,以及發出的頻率?
如果您在命名空間中有多個佇列和主題或訂用帳戶,則每個佇列至少有一個事件,而每個訂用帳戶至少有一個事件。 如果 Service Bus 實體中沒有任何訊息,且有新訊息送達,則會立即觸發事件。 或者,除非服務總線偵測到作用中的接收者,否則事件會每隔兩分鐘發出一次。 訊息流覽不會中斷事件。
根據預設,服務總線會針對命名空間中的所有實體發出事件。 如果您想要只取得特定實體的事件,請參閱下一節。
使用篩選器來限定事件的來源範圍
如果您想要只從命名空間內的一個佇列或一個訂用帳戶取得事件,您可以使用 Event Grid 所提供的篩選來使用 Begins with 或 Ends 。 在某些介面中,篩選條件稱為 Pre 和 Suffix 篩選條件。 如果您想要取得多個佇列和訂閱事件,但不是所有的,您可以建立多個事件網格訂閱,並為每個訂閱提供篩選條件。
後續步驟
請參閱下列教學課程: