Compartilhar via

什么是Azure Service Bus?

Azure Service Bus是一个完全托管的企业消息中转站,其中包含消息队列和发布-订阅主题。 使用Service Bus将应用程序和服务彼此分离。 它具有以下优点:

  • 在竞争的工作节点之间实现负载均衡。
  • 跨服务和应用程序边界安全路由和传输数据和控制
  • 协调需要高度可靠性的事务工作

概述

应用程序和服务使用 消息相互传输数据。 消息是一个容器,用于保存数据并使用元数据进行修饰。 数据可以是任何类型的信息,包括使用通用格式编码的结构化数据,如 JSON、XML、Apache Avro 或纯文本。

一些常见的消息传送方案包括:

  • 消息。 传输业务数据,例如销售或采购订单、日志或库存变动。

  • 分离应用程序。 提高应用程序和服务的可靠性和可伸缩性。 生产者和使用者不必同时处于联机或可用状态。 负载平衡,使流量高峰不会使服务负担过重。

  • 负载均衡。 允许多个竞争性使用者同间从队列读取内容,每个使用者都安全地获取对特定消息的独占所有权。

  • 主题和订阅。 在发布服务器和订阅服务器之间启用 1:n 关系,使订阅服务器可以从已发布的消息流中选择特定消息。

  • Transactions。 执行多个操作,所有操作都在原子事务的范围内。 例如,可以在事务范围内执行以下操作:

    1. 从一个消息队列中获取一条消息。
    2. 将处理结果发布到一个或多个不同的队列。
    3. 从原始队列移动输入消息。

    只有在成功的情况下,结果才对下游使用者可见,包括成功处理输入消息,允许仅处理一次的语义。 对于更大的解决方案上下文中的补偿事务模式,此事务模型是一个可靠的基础。

  • 消息会话。 对于需要严格消息排序或消息延迟的工作流和多路复用传输,实现大规模协调。

如果您熟悉 Apache ActiveMQ 等其他消息代理,那么 Service Bus 的概念与您了解的类似。 由于Service Bus是一种平台即服务(PaaS)产品,因此您无需担心以下操作。 Azure为您处理那些杂务。

  • 担心硬件故障
  • 持续修补操作系统或产品
  • 存放日志和管理磁盘空间
  • 处理备份
  • 切换到备用机器

概念

本部分讨论Service Bus的基本概念。

队列

通过 队列发送和接收消息。 在能够使用接收应用程序接收并处理消息之前,可以通过队列来存储消息。

该图显示了一个包括发送方和接收方用于发送和接收消息的 Service Bus 队列。

队列中的消息在接收时会被排序并加盖时间戳。 一旦代理服务器接受到消息,它会始终将消息持久保存于跨可用性区域分布的三重冗余存储中,如果命名空间是区域启用的。 Service Bus将消息保留在内存或易失性存储中,直到客户端将其报告为接受状态。

消息以 拉取 模式传递,因此系统仅在请求时传递消息。 与其他一些云队列的忙轮询模型不同,拉取操作可以长期运行,只有在消息可用时才会完成。

注意

有关Service Bus队列与存储队列的比较,请参阅 Storage 队列和Service Bus队列 - 比较和对比

主题

你也可以通过主题发送和接收消息。 队列通常用于点对点通信,而主题则适用于发布-订阅场景。

显示了一个具有一个发送方和多个接收方的服务总线主题的图表。

主题可以有多个独立的订阅。 这些订阅附加到主题,并在接收方看来,它们的工作方式完全像队列。 主题的订阅者可以收到发送到该主题的每个消息的副本。 订阅是被命名的实体。 默认情况下,订阅是持久的,但你可以将其配置为过期,然后自动删除。 通过Java消息服务 (JMS) API,Service Bus Premium 还允许创建在连接期间存在的可变订阅。

你可以定义订阅的规则。 订阅规则有一个筛选器,用于定义要复制到订阅中的消息应满足的条件,以及可以修改消息元数据的可选操作。 有关详细信息,请参阅主题筛选器和操作。 此功能在以下情况下很有用:

  • 你可能不希望通过订阅接收所有发送到某个主题的消息。
  • 您希望当消息通过订阅时用额外的元数据标记消息。

注意

有关队列和主题的详细信息,请参阅Service Bus队列、主题和订阅

命名空间

命名空间是所有消息传送组件的容器,例如队列和主题。 命名空间可以有一个或多个队列和主题,并且它通常充当应用程序容器。

可以在其他中转站的术语中将命名空间与服务器进行比较,但概念并不直接等效。 Service Bus 命名空间是您在由数十个全活动虚拟机组成的大型群集中的专属容量份额。 它可以选择跨三个Azure可用性区域。 你可以获得大规模运行消息中转站的可用性和可靠优势。 而且无需担心底层复杂性。 Service Bus是无服务器消息传送。

高级功能

Service Bus还具有高级功能,使你能够解决更复杂的消息传送问题。 以下部分介绍这些重要功能:

消息会话

为了在处理 Service Bus 队列或订阅中的消息时实现先入先出的(FIFO)保证,请使用会话。 还可以使用会话来实现请求-响应模式。 通过“请求-响应”模式,发送方应用程序可以发送请求并为接收方提供将响应正确发送回发送方应用程序的方法。 有关详细信息,请参阅消息会话

自动转发

通过自动转发功能,可将队列或订阅连接到作为相同命名空间组成部分的另一个队列或主题。 启用自动转发时,Service Bus会自动删除放置在第一个队列或订阅(源)中的消息,并将其放入第二个队列或主题(目标)。 有关详细信息,请参阅自动转发功能链接服务总线实体

死信

Service Bus队列和主题订阅提供一个辅助子队列,称为死信队列(DLQ)。 死信队列可存放无法传递给任何接收方的消息或无法处理的消息。 然后,可从 DLQ 中删除这些消息并对其进行检查。 在操作员的帮助下,应用程序可能会纠正问题并重新提交消息,记录存在错误的事实,并采取纠正措施。 有关详细信息,请参阅Service Bus 死信队列概述

预定的送货

可以将消息提交到队列或主题,以便进行延迟处理。 例如,用来计划作业,以使其在特定时间可供系统处理。 有关详细信息,请参阅定时消息

消息延迟

当队列或订阅客户端收到它愿意处理的消息时,由于应用程序中的特殊情况,当前无法处理,实体可以将消息检索延迟到以后的某个时间点。 该消息将保留在队列或订阅中,但会被搁置。 有关详细信息,请参阅消息延迟

交易

一个事务将两个或更多操作组合成执行作用域。 Service Bus支持在事务范围内对单个消息实体(队列、主题、订阅)进行分组操作。 有关详细信息,请参阅 Service Bus 的事务处理概述

筛选器和操作

订阅者可以定义他们希望从主题接收的消息。 这些消息采用一个或多个命名订阅规则的形式指定。 每个规则都包含用于选择特定消息的筛选器条件,并且(可选)包含对所选消息进行批注的操作。 对于每个匹配规则条件,订阅会生成消息的副本,并且可以针对每个匹配规则以不同方式进行注释。 有关详细信息,请参阅主题筛选器和操作

空闲时自动删除

通过使用 空闲时自动删除,可以指定自动删除队列之后的空闲间隔。 当队列上有流量时,该时间间隔会重置。 最短持续时间为五分钟。

重复检测

如果发生导致客户端怀疑发送作结果的错误,则重复检测会消除这些情况下的怀疑。 发送方可以重新发送相同的消息,而队列或主题会丢弃任何重复的副本。 有关详细信息,请参阅重复检测

批量删除消息

Azure Service Bus支持批量删除消息。 当队列或订阅中的消息过期或不再相关时,此功能非常有用,需要清理。 有关详细信息,请参阅批量删除

安全性

Service Bus支持安全协议,例如共享访问签名(SAS)基于角色的访问控制(RBAC)Azure资源的托管身份

Service Bus支持标准 Advanced Message Queuing Protocol (AMQP) 1.0HTTP/REST 协议。

符合标准和协议

Service Bus的主要线路协议是 Advanced Messaging Queueing Protocol (AMQP) 1.0,这是一个开放的 ISO/IEC 标准。 它允许客户编写适用于 Service Bus 和本地代理(例如 ActiveMQ 或 RabbitMQ)的应用程序。 如果你想生成这样的抽象,AMQP 协议指南提供了详细信息。

Service Bus Premium完全符合 Java/Jakarta EE Java 消息服务 (JMS) 2.0 API。 而且,Service Bus Standard 支持专注于队列的 JMS 1.1 子集。 JMS 是消息代理的一般抽象,可与许多应用程序和框架(包括热门的 Spring 框架)集成。 若要从其他代理切换到Azure Service Bus,只需重新创建队列和主题的拓扑,并更改客户端提供程序依赖项和配置。 有关示例,请参阅 ActiveMQ 迁移指南

客户端库

完全支持的Service Bus客户端库可通过Azure SDK获取。

Azure Service Bus的主要协议是 AMQP 1.0,并且可从任何符合 AMQP 1.0 的协议客户端使用它。 多个开源 AMQP 客户端具有显式演示Service Bus互作性的示例。 查看 AMQP 1.0 协议指南了解如何将Service Bus功能直接用于 AMQP 1.0 客户端。

语言
Java Apache Qpid Proton-J
C/C++ Azure uAMQP CApache Qpid Proton-C
Python Azure uAMQP for PythonApache Qpid Proton Python
PHP Azure uAMQP for PHP
Ruby Apache Qpid Proton Ruby
Go Azure Go AMQPApache Qpid Proton Go
C#/F#/VB AMQP .NET LiteApache NMS AMQP
JavaScript/Node 瑞亚

集成

Service Bus与许多Microsoft和Azure服务完全集成,例如:

后续步骤

若要开始使用Service Bus消息传送,请参阅以下文章: