gpt4 book ai didi

azure - 现实世界中如何从多个队列中读取数据?

转载 作者:行者123 更新时间:2023-12-02 07:41:17 25 4
gpt4 key购买 nike

这是一个理论问题:

当我使用消息队列构建应用程序时,我将需要多个队列支持不同的数据类型以实现不同的目的。假设我有 20 个队列(例如,一个用于创建新用户,一个用于处理新订单,一个用于编辑用户设置等)。

我将使用“最少”1 个 Web 角色和 1 个辅助角色将其部署到 Windows Azure。

如何以正确的方式从所有这 20 个队列中读取数据?这就是我的想法,但我对此几乎没有或根本没有实际经验:

创建一个在辅助角色“主”类中生成 20 个线程的类。让这些线程中的每一个执行一个方法来轮询不同的队列,并让所有这些线程在每次轮询之间休眠(当然,使用回退机制来增加休眠时间)。

这会导致有 20 个线程(或 21 个?)和 20 个正在主动轮询的队列,从而导致大量浪费的消息(每次轮询空队列时,它都会按消息计费)。

如何解决这个问题?

最佳答案

我阅读了其他答案(非常好的答案),并想对此发表自己的看法。

坚持使用 Windows Azure 队列,正如 @Lucifure 所描述的:除了两种情况之外,我真的不认为需要多个队列:

  • 您想要不同的优先级。您最不想看到的就是一条高优先级消息被困在数百条低优先级消息后面。为这些创建一个高优先级队列。
  • 消息读取+删除的数量将超过每秒 500 笔交易的目标。在这种情况下,请创建多个队列,以将事务量分散到各个存储分区(并且一个存储帐户每秒将处理最多 5K 个事务)。

如果您坚持使用单个队列(基于存储,而不是服务总线),则可以一次读取消息 block (最多 32 个)。您可以轻松地制定一种格式来帮助您区分消息类型(可能使用简单的前缀)。然后,只需将消息交给适当的线程进行处理即可。服务总线队列不支持多消息读取,尽管它们允许预取(这会导致缓冲的消息被下载到缓存中)。

一个队列相对于多个队列的优势:您可以消除(或大大减少)“许多队列没有消息,导致空读取”的问题。

如果您需要更多吞吐量,您可以随时增加执行队列读取和调度的线程数量。

记住每次删除都是原子的;没有批处理。就队列轮询而言:您考虑退避是正确的。成功读取消息(或消息 block )后,您无需后退。当您尝试阅读后没有得到任何结果时,请退出。

与服务总线队列相比,一个很好的优势是:Windows Azure 队列为您提供了大概的消息计数(在考虑横向扩展到多个实例时,这非常有用)。服务总线队列不提供此功能。

关于azure - 现实世界中如何从多个队列中读取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10964933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com