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

当队列或订阅中存在消息时,服务总线可以在没有接收器的情况下,将事件发出到事件网格。 可以针对服务总线命名空间创建事件网格订阅、侦听这些事件,然后通过启动接收器对这些事件做出反应。 借助此功能,可以在反应式编程模型中使用服务总线。 此功能实现的重要方案是,消息量不大的服务总线队列或订阅不需要一直使用接收器来轮询消息。

若要启用此功能,需要准备好以下各项:

  • 至少包含一个服务总线队列的服务总线高级命名空间,或者至少包含一个订阅的服务总线主题。
  • 对服务总线命名空间拥有“参与者”访问权限。 导航到 Azure 门户中的“服务总线”命名空间,选择“访问控制(IAM)”,并选择“角色分配”选项卡。验证你是否拥有该命名空间的参与者访问权限 。
  • 此外,需要服务总线命名空间的事件网格订阅。 存在可提取的消息时,此订阅将从事件网格接收通知。 典型的订阅方可能是 Azure 应用服务的逻辑应用功能、Azure Functions,或者与 Web 应用联系的 Webhook。 然后,订阅方会处理消息。

19

可用事件类型

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

事件类型 说明
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.chinacloudapi.cn/{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.chinacloudapi.cn/{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.chinacloudapi.cn/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.chinacloudapi.cn/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。

为服务总线命名空间创建事件网格订阅

可以使用三种不同的方法,为服务总线命名空间创建事件网格订阅:

  • 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>"
    

发出事件的数量和频率如何?

如果命名空间中有多个队列和主题或订阅,则对于每个队列和每个订阅,你会至少收到一个事件。 如果服务总线实体中没有任何消息,在新消息抵达时,会立即发出事件。 或者,除非服务总线检测到活动的接收方,否则每隔两分钟发送事件。 对消息进行浏览不会导致事件中断。

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

使用筛选器限制事件的来源

例如,如果你只想从命名空间中的某个队列或订阅接收事件,可以使用事件网格提供的“开头为”或“结尾为”筛选器。 在某些界面中,这两个筛选器称为“前缀”和“后缀”筛选器。 如果需要接收多个(但并非所有)队列和订阅的事件,可以创建多个事件网格订阅,并为每个订阅提供一个筛选器。

后续步骤

参阅以下教程: