Compartilhar via

为 Azure 服务总线中的队列或主题启用重复消息检测

为队列或主题启用重复检测时,Azure Service Bus 会在配置的时间段内保留发送到队列或主题的所有消息的历史记录。 在此间隔期间,队列或主题将不会存储任何重复的消息。 启用此属性可保证在用户定义的时间段内准确地传递一次。 有关详细信息,请参阅 重复检测。 本文介绍了为Service Bus队列或主题启用重复消息检测的不同方法。

注意

  • Service Bus的基本层不支持重复检测。 标准层和高级层支持重复检测。 有关这些层之间的差异,请参阅 Service Bus 定价
  • 创建队列或主题后,无法启用或禁用重复检测。 只能在创建队列或主题时执行此操作。

使用 Azure 门户

在 Azure 门户中创建 queue 时,请选择 启用重复检测,如下图所示。 你可以在创建队列或主题时配置重复检测窗口的大小。

在创建队列时启用重复检测

在 Azure 门户中创建主题时,请选择启用重复检测,如下图所示。

在创建主题时启用重复检测

如果你在创建时启用了重复检测,也可以为现有队列或主题配置此设置。

为现有队列或主题更新重复检测窗口大小

若要更改现有队列或主题的重复检测窗口大小,请在“概述”页上选择“重复检测窗口”“更改”

队列

为队列设置重复检测窗口大小

主题

设置主题的重复检测窗口大小

使用Azure CLI

若要创建启用了重复检测的队列,请使用设置为az servicebus queue create--enable-duplicate-detection命令true

az servicebus queue create \
    --resource-group myresourcegroup \
    --namespace-name mynamespace \
    --name myqueue \
    --enable-duplicate-detection true \
    --duplicate-detection-history-time-window P1D

若要创建启用了重复检测的主题,请使用az servicebus topic create命令,并将--enable-duplicate-detection设置为true

az servicebus topic create \
    --resource-group myresourcegroup \
    --namespace-name mynamespace \
    --name mytopic \
    --enable-duplicate-detection true \
    --duplicate-detection-history-time-window P1D

上述示例还通过使用 --duplicate-detection-history-time-window 参数设置重复检测窗口的大小。 时间窗口大小设置为 1 天。 默认值为 10 分钟,允许的最大值为 7 天。

若要 使用新的检测窗口大小更新队列,请使用有az servicebus queue update参数的--duplicate-detection-history-time-window命令。 在本示例中,时间窗口大小更新为 7 天。

az servicebus queue update \
    --resource-group myresourcegroup \
    --namespace-name mynamespace \
    --name myqueue \
    --duplicate-detection-history-time-window P7D

同样,若要 使用新的检测窗口大小更新主题,请使用 az servicebus topic update 命令并配合 --duplicate-detection-history-time-window 参数。 在本示例中,时间窗口大小更新为 7 天。

az servicebus topic update \
    --resource-group myresourcegroup \
    --namespace-name mynamespace \
    --name mytopic \
    --duplicate-detection-history-time-window P7D

使用 Azure PowerShell

若要创建启用了重复检测的队列,请使用设置为New-AzServiceBusQueue-RequiresDuplicateDetection命令$True

New-AzServiceBusQueue -ResourceGroup myresourcegroup `
    -NamespaceName mynamespace `
    -QueueName myqueue `
    -RequiresDuplicateDetection $True `
    -DuplicateDetectionHistoryTimeWindow P1D

若要创建启用了重复检测的主题,请使用New-AzServiceBusTopic命令,并将-RequiresDuplicateDetection设置为true

New-AzServiceBusTopic -ResourceGroup myresourcegroup `
    -NamespaceName mynamespace `
    -Name mytopic `
    -RequiresDuplicateDetection $True
    -DuplicateDetectionHistoryTimeWindow P1D

上述示例还通过使用 -DuplicateDetectionHistoryTimeWindow 参数设置重复检测窗口的大小。 时间窗口大小设置为 1 天。 默认值为 10 分钟,允许的最大值为 7 天。

若要 使用新的检测窗口大小更新队列,请参阅以下示例。 在本示例中,时间窗口大小更新为 7 天。

$queue=Get-AzServiceBusQueue -ResourceGroup myresourcegroup `
    -NamespaceName mynamespace `
    -QueueName myqueue 

$queue.DuplicateDetectionHistoryTimeWindow='P7D'

Set-AzServiceBusQueue -ResourceGroup myresourcegroup `
    -NamespaceName mynamespace `
    -QueueName myqueue `
    -QueueObj $queue

若要 使用新的检测窗口大小更新主题,请参阅以下示例。 在本示例中,时间窗口大小更新为 7 天。

$topic=Get-AzServiceBusTopic -ResourceGroup myresourcegroup `
    -NamespaceName mynamespace `
    -Name mytopic

$topic.DuplicateDetectionHistoryTimeWindow='P7D'

Set-AzServiceBusTopic -ResourceGroup myresourcegroup `
    -NamespaceName mynamespace `
    -Name mytopic `
    -TopicObj $topic

使用模板

若要创建启用了重复检测的队列,请在“队列属性”部分将requiresDuplicateDetection设为true。 有关详细信息,请参阅 Microsoft.ServiceBus 命名空间/队列模板参考。 指定 duplicateDetectionHistoryTimeWindow 属性的值以设置重复检测窗口的大小。 在以下示例中,它被设为 1 天。

@description('Name of the Service Bus namespace')
param serviceBusNamespaceName string

@description('Name of the Queue')
param serviceBusQueueName string

@description('Location for all resources.')
param location string = resourceGroup().location

resource serviceBusNamespace 'Microsoft.ServiceBus/namespaces@2024-01-01' = {
  name: serviceBusNamespaceName
  location: location
  sku: {
    name: 'Standard'
  }

  resource queue 'queues' = {
    name: serviceBusQueueName
    properties: {
      requiresDuplicateDetection: true
      duplicateDetectionHistoryTimeWindow: 'P1D'
    }
  }
}

若要创建启用了重复检测的主题,请在“主题属性”部分设置为requiresDuplicateDetectiontrue。 有关详细信息,请参阅 Microsoft.ServiceBus 命名空间/主题模板参考

@description('Name of the Service Bus namespace')
param serviceBusNamespaceName string

@description('Name of the Topic')
param serviceBusTopicName string

@description('Location for all resources.')
param location string = resourceGroup().location

resource serviceBusNamespace 'Microsoft.ServiceBus/namespaces@2024-01-01' = {
  name: serviceBusNamespaceName
  location: location
  sku: {
    name: 'Standard'
  }

  resource topic 'topics' = {
    name: serviceBusTopicName
    properties: {
      requiresDuplicateDetection: true
      duplicateDetectionHistoryTimeWindow: 'P1D'
    }
  }
}

后续步骤

尝试使用所选语言的示例来探索Azure Service Bus功能。

在下面查找较旧的.NET和Java客户端库的示例:

注意

2026 年 9 月 30 日,我们将停用 Azure Service Bus SDK 库 WindowsAzure.ServiceBus Microsoft.Azure。ServiceBus 和 com.microsoft。azure.servicebus 不符合Azure SDK准则。 我们还将结束对 SBMP 协议的支持,因此在 2026 年 9 月 30 日之后,你将无法再使用此协议。 在该日期之前迁移到最新的 Azure SDK 库,这些库提供关键的安全更新和改进的功能。

尽管旧库仍可在 2026 年 9 月 30 日以后使用,但它们将不再从Azure获得官方支持和更新。 有关详细信息,请参阅支持停用公告