使用队列选择基于消息的交付

已完成

假设你正在计划音乐共享应用程序的体系结构。 想要确保音乐文件可以从移动应用可靠地上传到 Web API。 然后,当艺术家向其集锦中添加新音乐时,你需要将新歌曲的详细信息直接传递到应用。 此方案是对基于消息的系统的完美使用,Azure 为此问题提供了两种解决方案:

  • Azure 队列存储
  • Azure 服务总线

什么是 Azure 队列存储?

队列存储是一项使用 Azure 存储来存储大量消息的服务,可通过使用简单的基于 REST 的接口从世界上任何地方安全地访问这些消息。 队列可以包含数百万条消息,仅受拥有这些消息的存储帐户容量的限制。

什么是 Azure 服务总线队列?

服务总线是一个适用于企业应用程序的消息中转站系统。 这些应用通常使用多种通信协议,具有不同的数据协定以及更高的安全性要求,并且可能同时包括云和本地服务。 服务总线构建在专用的消息基础结构之上,此基础结构是专门针对这些方案而设计的。

这两种服务都基于“队列”的概念,即队列保留已发送的消息,直到目标可以接收它们。

什么是 Azure 服务总线主题?

Azure 服务总线主题类似于队列,但可以有多个订阅者。 当消息发送到主题(而不是队列)时,可以触发多个组件来完成其工作。 假设在音乐共享应用程序中,用户正在听歌。 移动应用可能会向“Listened”主题发送信息。 该主题将为“UpdateUserListenHistory”提供订阅以及为“UpdateArtistsFanList”提供不同的订阅。 每个函数都由接收自己的消息副本的不同组件处理。

在内部,主题使用队列。 发布到主题时,会复制消息并将其拖放到每个订阅的队列中。 队列意味着,即使处理该订阅的组件太忙而无法跟上,也会保留消息副本供“每个订阅分支”处理。

队列的优点

队列基础结构可以支持许多高级功能,这些功能可以通过以下方式发挥作用:

可靠性更高

分布式应用程序将队列用作待传递到目标组件的消息的临时存储位置。 源组件可将消息添加到队列中,目标组件可检索队列前面需要处理的消息。 队列提高了消息交换的可靠性,因为在高需求时,消息可以等到目标组件能够处理它们时。

消息传递保证

队列系统通常会保证将队列中的每条消息传递到目标组件。 但是,这些保证可以采取不同的方法:

  • “至少一次”传递:在这种方法中,保证将每个消息传递到至少一个从队列中检索消息的组件。 但请注意,在某些情况下,同一条消息可能会传递多次。 例如,如果有两个 Web 应用实例从队列中检索消息,通常,每条消息仅传递到其中一个实例。 但是,如果一个实例花费较长时间来处理消息,并且超时已到期,则消息也可能会被发送到另一个实例。 设计 Web 应用代码时应该考虑到这种可能性。

  • 至多一次传递:在此方法中,不保证每个消息都能被传递,并且消息可能不会到达的可能性很小。 但是,与“至少一次”传递不同,消息不会被传递两次。 这有时被称为“自动重复检测”。

  • 先进先出 (FIFO):在大多数消息传递系统中,消息通常按照添加时的顺序离开队列,但你应考虑这种传递是否得到了保证。 如果分布式应用程序要求以完全正确的顺序处理消息,则必须选择包含 FIFO 保证的队列系统。

事务支持

当组中的一条消息传递失败时,一些紧密相关的消息组可能会引发问题。

例如,以电子商务应用程序为考虑对象。 当用户选择“购买”按钮时,可能会生成一系列消息并被发送到各个处理目标:

  • 包含订单详细信息的消息将被发送到配送中心
  • 包含总金额和付款详细信息的消息将被发送到信用卡处理器
  • 包含收据信息的消息将被发送到数据库,从而为客户生成发票

在此示例中,我们希望确保所有的消息都得到处理,或者不处理任何消息。 如果信用卡信息未送达并且所有的订单在没有付款的情况下就进行配送,那么我们将难以长久地在这个行业中发展! 可以通过将两条消息分组到一个事务中来避免这类问题。 消息事务作为一个单元成功或失败,就像在数据库领域中一样。 如果信用卡详细信息消息传递失败,订单详细信息消息也将失败。

应该选择什么服务?

在了解到此体系结构的通信策略应该是一条消息后,必须选择是使用 Azure 存储队列还是使用 Azure 服务总线。 这两者都可用于在组件间存储和传递消息。 两种队列的功能集略有不同,这意味着可以选择其中一种,或者同时使用这两种,具体取决于要解决的问题。

在以下情况下,使用服务总线队列:

  • 你需要“最多一次”传送保证。
  • 你需要 FIFO 保证。
  • 你需要将消息分组到事务中。
  • 你希望在不轮询队列的情况下接收消息。
  • 你需要为队列提供基于角色的访问模型。
  • 需要处理大于 64KB 但小于 100 MB 的消息。 标准层支持的最大消息大小为 256 KB,高级层则为 100 MB。
  • 队列大小不会增长到超过 1 TB。 标准层的最大队列大小为 80 GB,高级层的最大队列大小为 1 TB。
  • 你希望发布并使用成批消息。

在以下情况下,使用服务总线主题:

  • 需要服务总线队列提供的所有功能,此外实现一个发布订阅模式,让消息可以路由到多个订阅中的某一个,每条消息都有自己的独立接收方

尽管队列存储的功能不是很丰富,但如果你不需要这些功能中的任何一个,则它是一种更简单的选择。 此外,如果你的应用有以下任何要求,这将是最佳解决方案。

在以下情况下,使用队列存储:

  • 你需要通过队列传递的所有消息的审核线索。
  • 预期队列大小会超过 1 TB。
  • 你希望跟踪队列中消息的处理进度。

队列是分布式应用程序组件之间所发送消息的简单临时存储位置。 使用队列来组织消息并适当地处理不可预测的需求激增。

如果需要简单且易于编码的队列系统,请使用存储队列。 有关更高级的需求,请使用服务总线队列。 如果一个消息有多个目标,但你需要类似队列的行为,请使用服务总线主题。