你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
当队列或订阅中存在消息但没有接收方时,服务总线可以向事件网格发出事件。 您可以为服务总线命名空间创建事件网格订阅,以侦听这些事件,然后启动接收方来响应事件。 借助此功能,可以在反应式编程模型中使用服务总线。 此功能的关键场景是,对于消息量较低的服务总线队列或订阅,不需要一个持续轮询消息的接收器。
若要启用该功能,需要以下项:
- 具有至少一个服务总线队列的服务总线高级命名空间,或者至少包含一个订阅的服务总线主题。
- 对服务总线命名空间的贡献者访问权限。 在 Azure 门户中导航到服务总线命名空间,然后选择 “访问控制”(IAM),然后选择“ 角色分配 ”选项卡。验证你是否具有对命名空间的参与者访问权限。
- 此外,还需要服务总线命名空间的事件网格订阅。 此订阅将收到来自 Event Grid 的通知,指示有消息需要处理。 典型的订阅者可以是 Azure 应用服务中的 Logic Apps 功能、Azure Functions,或者是联系 Web 应用的 Webhook。 然后,订阅者处理消息。
可用事件类型
服务总线发出以下事件类型:
事件类型 | DESCRIPTION |
---|---|
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"
}]
事件属性
事件具有以下顶级数据:
资产 | 类型 | DESCRIPTION |
---|---|---|
topic |
字符串 | 事件源的完整资源路径。 此字段不可写入。 事件网格提供此值。 |
subject |
字符串 | 定义了发布者的事件主题路径。 |
eventType |
字符串 | 该事件源的其中一种注册事件类型。 |
eventTime |
字符串 | 事件生成的时间是基于提供者的 UTC 时间。 |
id |
字符串 | 事件的唯一标识符。 |
data |
物体 | 服务总线事件数据。 |
dataVersion |
字符串 | 数据对象的架构版本。 发布者定义架构版本。 |
metadataVersion |
字符串 | 事件元数据的架构版本。 事件网格定义顶级属性的架构。 事件网格提供此值。 |
数据对象具有以下属性:
资产 | 类型 | DESCRIPTION |
---|---|---|
namespaceName |
字符串 | 资源所在的服务总线命名空间。 |
requestUri |
字符串 | 发出事件的特定队列或订阅项的 URI。 |
entityType |
字符串 | 发出事件的服务总线实体类型(队列或订阅)。 |
queueName |
字符串 | 如果是订阅队列,则该队列包含活动消息。 如果使用主题/订阅,则值为 null。 |
topicName |
字符串 | 包含活动消息的服务总线订阅属于的主题。 如果使用队列,则值为 null。 |
subscriptionName |
字符串 | 包含活动消息的服务总线订阅。 如果使用队列,则值为 null。 |
服务总线命名空间的事件网格订阅
可以通过三种不同的方式为服务总线命名空间创建事件网格订阅:
- Azure 门户。 请参阅以下教程,了解如何使用 Azure 门户通过 Azure 逻辑应用和 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>"
发出了多少个事件,频率如何?
如果命名空间中有多个队列、主题或订阅,您将会为每个队列和每个订阅至少获得一个事件。 如果服务总线实体中没有消息且新消息到达,则立即发出这些事件。 或者事件每两分钟发出一次,除非服务总线检测到活动接收器。 消息浏览不会中断事件。
默认情况下,服务总线会为命名空间中的所有实体发出事件。 如果只想获取特定实体的事件,请参阅下一部分。
使用筛选器限制事件来源
如果只想从命名空间中的一个队列或一个订阅获取事件,则可以使用事件网格提供的筛选器 “以...开始” 或“以...结束”。 在某些接口中,筛选器称为 Pre 和 Suffix 筛选器。 如果要为多个队列和订阅获取事件(但并非全部),可以创建多个事件订阅,并为每个订阅提供筛选器。
后续步骤
参阅以下教程: