Azure Service Bus 队列
组件格式
要设置 Azure Service Bus 队列发布订阅,需创建类型为 pubsub.azure.servicebus.queues 的组件。请参阅 发布订阅代理组件文件 以了解 ConsumerID 是如何自动生成的。阅读操作指南:发布和订阅了解如何创建和应用发布订阅配置。
此组件使用 Azure Service Bus 上的队列;有关主题和队列之间差异的说明,请参阅官方文档。 若要使用主题,请参阅 Azure Service Bus Topics 发布订阅组件。
连接字符串身份验证
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: servicebus-pubsub
spec:
type: pubsub.azure.servicebus.queues
version: v1
metadata:
# 未使用 Microsoft Entra ID 身份验证时必需
- name: connectionString
value: "Endpoint=sb://{ServiceBusNamespace}.servicebus.windows.net/;SharedAccessKeyName={PolicyName};SharedAccessKey={Key};EntityPath={ServiceBus}"
# - name: consumerID # 可选
# value: channel1
# - name: timeoutInSec # 可选
# value: 60
# - name: handlerTimeoutInSec # 可选
# value: 60
# - name: disableEntityManagement # 可选
# value: "false"
# - name: maxDeliveryCount # 可选
# value: 3
# - name: lockDurationInSec # 可选
# value: 60
# - name: lockRenewalInSec # 可选
# value: 20
# - name: maxActiveMessages # 可选
# value: 10000
# - name: maxConcurrentHandlers # 可选
# value: 10
# - name: defaultMessageTimeToLiveInSec # 可选
# value: 10
# - name: autoDeleteOnIdleInSec # 可选
# value: 3600
# - name: minConnectionRecoveryInSec # 可选
# value: 2
# - name: maxConnectionRecoveryInSec # 可选
# value: 300
# - name: maxRetriableErrorsPerSec # 可选
# value: 10
# - name: publishMaxRetries # 可选
# value: 5
# - name: publishInitialRetryIntervalInMs # 可选
# value: 500
警告
上述示例将密钥作为纯字符串使用。建议按照此处的描述使用密钥存储来管理密钥。规范元数据字段
| 字段 | 必填 | 详情 | 示例 |
|---|---|---|---|
connectionString | Y | Service Bus 的共享访问策略连接字符串。除非使用 Microsoft Entra ID 身份验证,否则为必填。 | 见上方示例 |
consumerID | N | 消费者 ID(consumer tag)将一个或多个消费者组织成一个组。具有相同消费者 ID 的消费者作为一个虚拟消费者工作;例如,一条消息仅由组中的一个消费者处理一次。如果未提供 consumerID,Dapr 运行时会将其设置为 Dapr 应用程序 ID(appID)的值。 | 可以设置为字符串值(如上方示例中的 "channel1")或字符串格式的值(如 "{podName}" 等)。请参阅您可以在组件元数据中使用的所有模板标签。 |
namespaceName | N | 用于设置 Service Bus 命名空间地址的参数,为完全限定域名。如果使用 Microsoft Entra ID 身份验证,则为必填。 | "namespace.servicebus.windows.net" |
timeoutInSec | N | 发送消息和管理操作的超时时间。默认值:60 | 30 |
handlerTimeoutInSec | N | 调用应用程序处理器的超时时间。默认值:60 | 30 |
lockRenewalInSec | N | 定义缓冲消息锁的续订频率。默认值:20。 | 20 |
maxActiveMessages | N | 定义一次处理或缓冲的最大消息数。此值应至少与最大并发处理器数一样大。默认值:1000 | 2000 |
maxConcurrentHandlers | N | 定义最大并发消息处理器数。默认值:0(无限制) | 10 |
disableEntityManagement | N | 当设置为 true 时,队列和订阅不会自动创建。默认值:"false" | "true", "false" |
defaultMessageTimeToLiveInSec | N | 默认消息存活时间,以秒为单位。仅在创建订阅时使用。 | 10 |
autoDeleteOnIdleInSec | N | 在自动删除空闲订阅之前等待的时间(秒)。仅在创建订阅时使用。必须为 300 秒或更长。默认值:0(禁用) | 3600 |
maxDeliveryCount | N | 定义服务器尝试传递消息的次数。仅在创建订阅时使用。默认值由服务器设置。 | 10 |
lockDurationInSec | N | 定义消息在过期前被锁定的时长(秒)。仅在创建订阅时使用。默认值由服务器设置。 | 30 |
minConnectionRecoveryInSec | N | 在连接失败后重新连接到 Azure Service Bus 之前等待的最小间隔(秒)。默认值:2 | 5 |
maxConnectionRecoveryInSec | N | 在连接失败后重新连接到 Azure Service Bus 之前等待的最大间隔(秒)。每次尝试后,组件会在最小值和最大值之间等待一个随机秒数,每次都在增加。默认值:300(5 分钟) | 600 |
maxRetriableErrorsPerSec | N | 每秒处理的最大可重试错误数。如果消息因可重试错误而处理失败,组件会在开始处理另一条消息之前添加延迟,以避免立即重新处理失败的消息。默认值:10 | 10 |
publishMaxRetries | N | 当 Azure Service Bus 响应"太忙"以限制消息时的最大重试次数。默认值:5 | 5 |
publishInitialRetryIntervalInMs | N | 当 Azure Service Bus 限制消息时初始指数退避的时间(毫秒)。默认值:500 | 500 |
Microsoft Entra ID 身份验证
Azure Service Bus 队列发布订阅组件支持使用所有 Microsoft Entra ID 机制进行身份验证,包括托管标识。有关更多信息以及根据选择的 Microsoft Entra ID 身份验证机制需要提供的相关组件元数据字段,请参阅向 Azure 进行身份验证的文档。
示例配置
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: servicebus-pubsub
spec:
type: pubsub.azure.servicebus.queues
version: v1
metadata:
- name: namespaceName
# 使用 Azure 身份验证时必需。
# 必须是完全限定域名
value: "servicebusnamespace.servicebus.windows.net"
- name: azureTenantId
value: "***"
- name: azureClientId
value: "***"
- name: azureClientSecret
value: "***"
消息元数据
Azure Service Bus 消息使用其他上下文元数据扩展了 Dapr 消息格式。一些元数据字段由 Azure Service Bus 本身设置(只读),其他字段可以在发布消息时由客户端设置。
发送带有元数据的消息
要在发送消息时设置 Azure Service Bus 元数据,请在 HTTP 请求上设置查询参数或 gRPC 元数据,如此处所述。
metadata.MessageIdmetadata.CorrelationIdmetadata.SessionIdmetadata.Labelmetadata.ReplyTometadata.PartitionKeymetadata.Tometadata.ContentTypemetadata.ScheduledEnqueueTimeUtcmetadata.ReplyToSessionId
注意
接收带有元数据的消息
当 Dapr 调用您的应用程序时,它使用 HTTP 标头或 gRPC 元数据将 Azure Service Bus 消息元数据附加到请求中。 除了上面列出的可设置元数据之外,您还可以访问以下只读消息元数据。
metadata.DeliveryCountmetadata.LockedUntilUtcmetadata.LockTokenmetadata.EnqueuedTimeUtcmetadata.SequenceNumber
要了解这些元数据属性的用途的更多详细信息,请参阅官方 Azure Service Bus 文档。
此外,原始 Azure Service Bus 消息的所有 ApplicationProperties 条目都会作为 metadata.<application property's name> 附加。
注意
所有时间都由服务器填充,不会针对时钟偏差进行调整。发送和接收多条消息
Azure Service Bus 支持使用批量发布订阅 API 在单个操作中发送和接收多条消息。
配置批量发布
要设置批量发布操作的元数据,请在 HTTP 请求上设置查询参数或 gRPC 元数据,如此处所述
| 元数据 | 默认值 |
|---|---|
metadata.maxBulkPubBytes | 131072 (128 KiB) |
配置批量订阅
订阅主题时,您可以配置 bulkSubscribe 选项。有关更多详细信息,请参阅批量订阅消息。了解有关批量订阅 API的更多信息。
| 配置 | 默认值 |
|---|---|
maxMessagesCount | 100 |
为队列创建 Azure Service Bus 代理
按照此处的说明设置 Azure Service Bus 队列。
注意
您的队列必须与您使用 Dapr 发布到的主题同名。例如,如果您在主题"orders" 上发布到发布订阅 "myPubsub",您的队列必须命名为 "orders"。
如果您使用共享访问策略连接到队列,该策略必须能够"管理"队列。要使用死信队列,该策略必须位于包含主队列和死信队列的 Service Bus 命名空间上。重试策略和死信队列
默认情况下,Azure Service Bus 队列有一个死信队列。消息会重试 maxDeliveryCount 给定的次数。默认的 maxDeliveryCount 值默认为 10,但可以设置为最高 2000。这些重试发生得非常快,如果没有返回成功,消息将被放入死信队列。
Dapr 发布订阅提供了自己的死信队列概念,允许您控制重试策略并通过 Dapr 订阅死信队列。
- 在 Azure Service Bus 命名空间中设置一个单独的队列作为死信队列,以及一个定义如何重试的弹性策略。
- 订阅主题以获取失败的消息并处理它们。
例如,在订阅中设置死信队列 orders-dlq 和弹性策略可以让您订阅主题 orders-dlq 来处理失败的消息。
有关设置死信队列的更多详细信息,请参阅死信文章。
相关链接
- Dapr 组件的基本架构
- 发布订阅构建块
- 阅读本指南了解配置发布订阅组件的说明