你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

Azure 服务总线到事件网格集成概述

当队列或订阅中存在消息但没有接收方时,服务总线可以向事件网格发出事件。 您可以为服务总线命名空间创建事件网格订阅,以侦听这些事件,然后启动接收方来响应事件。 借助此功能,可以在反应式编程模型中使用服务总线。 此功能的关键场景是,对于消息量较低的服务总线队列或订阅,不需要一个持续轮询消息的接收器。

若要启用该功能,需要以下项:

  • 具有至少一个服务总线队列的服务总线高级命名空间,或者至少包含一个订阅的服务总线主题。
  • 对服务总线命名空间的贡献者访问权限。 在 Azure 门户中导航到服务总线命名空间,然后选择 “访问控制”(IAM),然后选择“ 角色分配 ”选项卡。验证你是否具有对命名空间的参与者访问权限。
  • 此外,还需要服务总线命名空间的事件网格订阅。 此订阅将收到来自 Event Grid 的通知,指示有消息需要处理。 典型的订阅者可以是 Azure 应用服务中的 Logic Apps 功能、Azure Functions,或者是联系 Web 应用的 Webhook。 然后,订阅者处理消息。

19

可用事件类型

服务总线发出以下事件类型:

事件类型 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>"
    

发出了多少个事件,频率如何?

如果命名空间中有多个队列、主题或订阅,您将会为每个队列和每个订阅至少获得一个事件。 如果服务总线实体中没有消息且新消息到达,则立即发出这些事件。 或者事件每两分钟发出一次,除非服务总线检测到活动接收器。 消息浏览不会中断事件。

默认情况下,服务总线会为命名空间中的所有实体发出事件。 如果只想获取特定实体的事件,请参阅下一部分。

使用筛选器限制事件来源

如果只想从命名空间中的一个队列或一个订阅获取事件,则可以使用事件网格提供的筛选器 “以...开始”“以...结束”。 在某些接口中,筛选器称为 PreSuffix 筛选器。 如果要为多个队列和订阅获取事件(但并非全部),可以创建多个事件订阅,并为每个订阅提供筛选器。

后续步骤

参阅以下教程: