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

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

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

什么是 Azure 队列存储?

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

什么是 Azure 服务总线队列?

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

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

什么是 Azure 服务总线主题?

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

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

队列的优点

队列基础结构可以支持许多高级功能,因此非常有用

更高的可靠性

分布式应用程序将队列用作待传递到目标组件的消息的临时存储位置。 源组件可将消息添加到队列中,目标组件可检索队列前面需要处理的消息。 队列增加了消息交换的可靠性,因为在需求很大时,在目标组件准备好处理消息前,消息只需进行等待即可。

消息传递保证

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

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

  • “至多一次”传递: 在此方法中,不保证传递每条消息,并且极少数情况下,消息可能无法到达。 但是,与“至少一次”传递不同,消息不会传递两次。 有时,这被称为“自动重复检测”。

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

事务支持

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

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

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

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

应该选择什么服务?

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

如果为以下情况,请选择服务总线主题:

  • 需要多个接收方来处理每条消息

如果为以下情况,请选择服务总线队列:

  • 需要“至多一次”传递保证。
  • 需要 FIFO 保证。
  • 需要将消息分组到事务中。
  • 需要在不轮询队列的情况下接收消息。
  • 需要为队列提供基于角色的访问模型。
  • 需要处理大于 64 KB 但小于 256 KB 的消息。
  • 队列大小不会增长到超过 80 GB。
  • 希望能够发布并使用成批消息。

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

如果为以下情况,请选择队列存储:

  • 需要通过队列的所有消息的审核线索。
  • 预期队列大小会超过 80GB。
  • 需要跟踪队列内部的消息处理进度。

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

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