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

Azure 服务总线 - 常见问题解答 (FAQ)

本文讨论了一些关于 Microsoft Azure 服务总线的常见问题解答。 还可以访问 Azure 支持常见问题解答了解常规的 Azure 定价和支持信息。

关于 Azure 服务总线的一般问题

什么是 Azure 服务总线?

Azure 服务总线 是一个异步消息传送云平台,可让你在分离的系统之间发送数据。 Microsoft 以服务的形式提供此功能,这意味着不需要托管自有硬件就能使用它。

什么是服务总线命名空间?

命名空间提供了用于对应用程序中的服务总线资源进行寻址的范围容器。 必须创建命名空间才能使用服务总线,而且这也是开始使用的第一步。

什么是 Azure 服务总线队列?

服务总线队列是用于存储消息的实体。 有多个应用程序,或者有多个需要彼此通信的分布式应用程序部分时,队列特别有用。 队列和发行中心的相似之处在于,两者都会接收多个产品(消息),再从该处送出。

什么是 Azure 服务总线主题和订阅?

主题可被视为队列,使用多个订阅时,它成为更丰富的消息传送模型;实质上是一种一对多的通信工具。 此发布/订阅模型(或 pub/sub)启用了一个应用程序,该应用程序将消息发送到具有多个订阅的主题中,进而使多个应用程序接收到该消息。

什么是分区实体?

传统的队列或主题由单个消息中转站进行处理并存储在一个消息存储中。 分区队列或主题由多个消息中转站处理,并存储在多个消息传送存储中。 此功能意味着分区的队列或主题的总吞吐量不再受到单个消息中转站或消息存储的性能限制。 此外,消息传送存储的临时中断不会导致分区队列或主题不可用。

使用分区实体时不保证排序。 如果某个分区不可用,仍可从其他分区发送和接收消息。

Azure 服务总线将数据存储在何处?

Azure 服务总线标准层利用 Azure SQL 数据库提供其后端存储层。 对于除巴西南部和亚洲东南部以外的所有区域,数据库备份将托管在不同的区域中(通常是 Azure 配对区域)。 对于巴西南部和亚洲东南部区域,数据库备份存储在同一区域中,以适应这些区域的数据驻留要求。

Azure 服务总线高级层在你选择的区域中存储元数据和数据。 为 Azure 服务总线高级命名空间设置异地灾难恢复时,会将元数据复制到你选择的次要区域。

需要在防火墙上打开哪些端口?

可以将以下协议与 Azure 服务总线配合使用,以便发送和接收消息:

  • 高级消息队列协议 1.0 (AMQP)
  • 具有 TLS 的超文本传输协议 1.1 (HTTPS)

请查看下表,了解需要打开哪些出站 TCP 端口,以便使用这些协议与 Azure 服务总线通信:

协议 端口 详细信息
AMQP 5671, 5672 具有 TLS 的 AMQP。 请参阅 AMQP 协议指南
HTTPS 443 此端口用于 HTTP/REST API 和 AMQP-over-WebSockets

通过端口 5671 使用 AMQP 时,通常还需要使用 HTTPS 端口进行出站通信,因为客户端 SDK 执行的一些管理操作和从 Microsoft Entra ID(使用时)获取令牌的操作都是通过 HTTPS 运行的。

正式的 Azure SDK 通常使用 AMQP 协议通过服务总线发送和接收消息。

与 HTTP/REST API 一样,AMQP-over-WebSockets 协议选项通过端口 TCP 443 运行,但在功能上与普通 AMQP 相同。 由于额外的握手往返,此选项的初始连接延迟较高,并且作为共享 HTTPS 端口的折衷方案,此选项的开销略高。 如果选择此模式,TCP 端口 443 足以进行通信。 以下选项允许选择 AMQP WebSockets 模式。

语言 选项
.NET (Azure.Messaging.ServiceBus) 使用将 ServiceBusClientOptions 用作参数的构造函数创建 ServiceBusClient。 将 ServiceBusClientOptions.TransportType 设置为 ServiceBusTransportType.AmqpWebSockets
.NET (Microsoft.Azure.ServiceBus) 创建客户端对象时,请使用将 TransportTypeServiceBusConnectionServiceBusConnectionStringBuilder 用作参数的构造函数。

对于采用 transportType 作为参数的构造,请将参数设置为 TransportType.AmqpWebSockets

对于采用 ServiceBusConnection 作为参数的构造函数,请将 ServiceBusConnection.TransportType 设置为TransportType.AmqpWebSockets

如果使用 ServiceBusConnectionStringBuilder,则使用可让你选择指定 transportType 的构造函数。

Java (com.azure.messaging.servicebus) 创建客户端时,请将 ServiceBusClientBuilder.transportType 设置为 AmqpTransportType.AMQP.AMQP_WEB_SOCKETS
Java (com.microsoft.azure.servicebus) 创建客户端时,请将 com.microsoft.azure.servicebus.ClientSettings 中的 transportType 设置为 com.microsoft.azure.servicebus.primitives.TransportType.AMQP_WEB_SOCKETS
JavaScript 在创建服务总线客户端对象时,请使用 ServiceBusClientOptions 中的 webSocketOptions 属性。
Python 在创建服务总线客户端时,请将 ServiceBusClient.transport_type 设置为 TransportType.AmqpOverWebSocket

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 日之后仍然可以使用较旧的库,但它们将不再获得 Microsoft 的官方支持和更新。 有关详细信息,请参阅支持停用公告

Azure 服务总线是否支持 Java 消息服务 (JMS)?

是的。 它确实存在。 请参阅以下文章:

需要将哪些 IP 地址添加到允许列表?

若要查找要添加到允许列表以进行连接的正确 IP 地址,请执行以下步骤:

  1. 从命令提示符处运行以下命令:

    nslookup <YourNamespaceName>.servicebus.windows.net
    
  2. 记下 Non-authoritative answer 中返回的 IP 地址。

如果对命名空间使用区域冗余,则需执行一些额外的步骤:

  1. 首先,在命名空间中运行 nslookup。

    nslookup <yournamespace>.servicebus.windows.net
    
  2. 记下“非权威回答”部分中的名称,该名称采用下述格式之一:

    <name>-s1.cloudapp.net
    <name>-s2.cloudapp.net
    <name>-s3.cloudapp.net
    
  3. 为每一个运行 nslookup,使用后缀 s1、s2 和 s3 获取所有三个在三个可用性区域中运行的实例的 IP 地址。

    注意

    nslookup 命令返回的 IP 地址不是静态 IP 地址。 在基础部署被删除或移动到其他群集之前,它保持不变,但不建议也不支持使用 IN 地址,你需要跟踪 IP 地址的更改。

我可以在哪里找到客户端向命名空间发送/从中接收消息的 IP 地址?

我们不记录客户端向命名空间发送或从中接收消息的 IP 地址。 重新生成密钥,以便所有现有的客户端将无法进行身份验证并查看 Azure 基于角色的访问控制 (Azure RBAC) 设置,以确保仅允许的用户或应用程序可以访问该命名空间。

如果使用的是高级命名空间,请使用 IP 筛选虚拟网络服务终结点专用终结点来限制对命名空间的访问。

最佳实践

Azure 服务总线的最佳实践有哪些?

请参阅使用服务总线改进性能的最佳做法 - 此文介绍了如何在交换消息时优化性能。

创建实体前的须知事项有哪些?

队列和主题的以下属性是固定不变的。 创建实体时,请考虑此限制,因为只有创建新的替代实体才可修改这些属性。

  • 分区
  • 会话
  • 重复检测
  • 快速实体

定价

本部分回答了一些关于服务总线定价结构的常见问题解答。

服务总线定价和计费译文介绍了服务总线中的计费标准。 有关服务总线定价选项的具体信息,请参阅服务总线定价详细信息

还可以访问 Azure 支持常见问题解答了解常规的 Azure 定价信息。

服务总线如何收取费用?

有关服务总线定价的完整信息,请参阅服务总线定价。 除标示的价格外,还需为在其中部署应用程序的数据中心之外的相关数据输出支付费用。

服务总线的哪些使用情况受数据传输限制? 哪些不受限制?

在给定 Azure 区域内的任何数据传输和入站数据传输均不收费。 区域外的数据传输需收取输出费用,详见此处

服务总线是否对存储收费?

不能。 服务总线不对存储收费。 但是,对每个队列/主题可以保留的数据最大量设有配额限制。 请参阅下一个常见问题。

我有一个服务总线标准命名空间。 为什么我在资源组 `$system` 下看到了费用?

Azure 服务总线最近升级了计费组件。 由于此更改,如果你有服务总线标准命名空间,则可能会在资源组 $system 下看到资源 /subscriptions/<azure_subscription_id>/resourceGroups/$system/providers/Microsoft.ServiceBus/namespaces/$system 的行项。

这些费用表示已预配服务总线标准命名空间的每个 Azure 订阅的基本费用。

请务必注意,这些费用不是新的,即它们也存在于以前的计费模型中。 唯一的更改是它们现在会列在 $system 下。 这是由于新的计费系统中的限制所致,它将订阅级别的费用组在一起,而不是绑定到 $system 资源 ID 下的特定资源。

配额

有关服务总线限制和配额的列表,请参阅服务总线配额概述

如何处理大小 > 1 MB 的消息?

服务总线消息服务(队列和主题/订阅)允许应用程序发送大小不超过 256 KB(标准层)或 100 MB(高级层)的消息。 若要处理大小超过允许大小的消息,请使用此博客文章中所述的声明检查模式。

疑难解答

为什么在从其他订阅中删除命名空间后无法创建该命名空间?

从订阅中删除命名空间时,请等待 4 个小时,然后才能在另一个订阅中使用相同的名称重新创建它。 否则,可能会收到以下错误消息:Namespace already exists

Azure 服务总线 API 生成了哪些异常?建议采取什么操作?

有关可能的服务总线异常的列表,请参阅异常概述

什么是共享访问签名?哪些语言支持生成签名?

共享访问签名是基于 SHA-256 安全哈希或 URI 的身份验证机制。 有关如何在 Node.js、PHP、Java、Python 和 C# 中生成自己的签名的信息,请参阅共享访问签名一文。

订阅和命名空间管理

如何将命名空间迁移到另一个 Azure 订阅中?

可以使用 Azure 门户或 PowerShell 命令,将命名空间从一个 Azure 订阅移到另一个 Azure 订阅。 若要执行此操作,命名空间必须已处于活动状态。 执行这些命令的用户必须是源订阅和目标订阅的管理员。

门户

若要使用 Azure 门户将服务总线命名空间迁移到其他订阅,可按照此处的说明操作。

PowerShell

下面的 PowerShell 命令序列将命名空间从一个 Azure 订阅迁移到另一个 Azure 订阅。 若要执行此操作,命名空间必须已经处于活动状态,而且运行 PowerShell 命令的用户必须同时是源订阅和目标订阅的管理员。

# Create a new resource group in target subscription
Select-AzSubscription -SubscriptionId 'ffffffff-ffff-ffff-ffff-ffffffffffff'
New-AzResourceGroup -Name 'targetRG' -Location 'East US'

# Move namespace from source subscription to target subscription
Select-AzSubscription -SubscriptionId 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'
$res = Find-AzResource -ResourceNameContains mynamespace -ResourceType 'Microsoft.ServiceBus/namespaces'
Move-AzResource -DestinationResourceGroupName 'targetRG' -DestinationSubscriptionId 'ffffffff-ffff-ffff-ffff-ffffffffffff' -ResourceId $res.ResourceId

是否可以在服务总线命名空间上禁用 TLS 1.0 或 TLS 1.1?

是的,可以通过设置最低 TLS 版本,在服务总线命名空间上禁用 TLS 1.0 或 1.1。 有关详细信息,请参阅针对发送到服务总线命名空间的请求强制实施必需的最低版本的传输层安全性 (TLS)

后续步骤

若要了解有关服务总线的详细信息,请参阅以下文章: