在 Azure 服务总线中批量删除消息(预览版)

Azure 服务总线是一个完全托管的企业集成消息中转站,使你能够在解耦的应用程序和服务之间发送和接收消息。 但是,你有时可能想要从队列或订阅中删除消息而不处理消息,例如,如果消息已过期、损坏或不相关。 本文介绍如何在 Azure 服务总线中批量删除消息。

批量删除消息的方案

在许多情况下,你可能想要使用 Azure 服务总线中的批量删除消息功能。 以下是其中一些原因:

  • 过期的消息:删除超过其生存时间 (TTL) 值且位于死信队列中的消息。
  • 验证或处理失败:删除验证或处理逻辑失败且位于死信队列中的消息。
  • 不相关的消息:从活动队列中删除与应用程序逻辑不再相关的消息。
  • 处理重复或不正确的内容:从活动队列中删除重复或不正确的消息。

通过使用批量删除消息功能,可以一次性从队列或订阅中删除多条消息,而不必逐条删除。 由于删除是在服务端完成的,因此不需要在删除消息之前接收消息。 该方法可最大程度地减少服务请求的数量和网络延迟。

重要

目前,分区实体不支持批量删除。 在一个批量删除调用中最多可以删除 4000 个消息。 批量删除是按尽力而为的原则执行的,不保证在单个 API 调用中删除切确的 messageCount。

如何在服务总线中批量删除消息

可以通过对服务总线接收器对象调用 DeleteMessagesAsync 来删除消息。 在服务器端,DeleteMessagesAsync 需要两个参数:messageCount 和 beforeEnqueueTime,如下所述:

  • messageCount:要删除的消息数。 服务可能会删除少于此限制的消息。
  • beforeEnqueueTime:可选的 DateTimeOffset,以 UTC 表示,指删除操作的截止时间。 只会删除在此时间之前排入队列的消息。

此外,可以调用 PurgeMessagesAsync 来清除实体中的所有消息。

使用 Azure SDK 执行这些操作时,beforeEnqueueTime 参数默认为当前 UTC 时间 (DateTime.UtcNow())。 请务必提供正确的值以防意外删除消息。

注意

清除操作可能导致 CPU 使用率增加,因为它涉及到多个 API 调用。 在清除期间,锁定的消息无法删除,而会保留在实体中。

后续步骤

若要了解 Azure 服务总线功能,请尝试学习采用所选语言的示例:

旧版 .NET 和 Java 客户端库示例如下:

注意

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

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