【问题标题】:How does one determine if all messages in an Azure Queue have been processed?如何确定 Azure 队列中的所有消息是否都已处理?
【发布时间】:2025-12-02 16:50:01
【问题描述】:

我刚刚开始对 Windows Azure 进行修补,如果有问题,我将不胜感激。

如何确定 Windows Azure 队列是否为空以及其中的所有工作项是否已处理?如果我有多个工作进程查询工作项队列,则 GetMessage(s) 在队列为空时不返回任何消息。但是不能保证当前不可见的消息不会被推回队列中。

我需要此功能,因为我的工作流程的后续行为取决于该特定队列中所有工作项的完成。解决此问题的一种可能方法是计算放置和删除的数量。但这将再次需要在共享存储级别进行同步,如果可能,我想避免它。

有什么想法吗?

【问题讨论】:

    标签: azure azure-storage azure-queues


    【解决方案1】:

    看看ApproximateMessageCount 方法。这应该返回队列中的消息数,包括不可见的消息(例如正在处理的消息)。

    Mike Wood 在博客中谈到了这一微妙之处,以及关于队列的 Clear 方法的花絮,here

    也就是说:您可能希望为工作流管理选择不同的机制。也许是一个表格行,其中您的行键等于一些多队列项交易 ID,并且各个属性是状态标志。这允许您跟踪事务的失败部分(例如,10 个队列项目中有 9 个处理正常,第 10 个失败;您仍然可以删除第 10 个队列项目,但将其状态标志设置为失败,然后让您处理这种情况因此)。另外:假设您使用同一个队列来处理另一个“事务”(意味着队列的长度再次非零)。通过使用像 Table Row 这样的单独对象,即使有其他队列消息,您仍然可以确定您的“事务”已完成。

    【讨论】:

    • 谢谢大卫。这真的很有帮助。感谢您提供有关维护表中处理状态的提示 - 我会牢记这一点。
    • 除了大卫所说的之外,还有一个出列计数可以用于此目的。
    【解决方案2】:

    最好的方法是创建另一个队列,将其称为终止指示器队列,然后在该队列中为您处理的来自主队列的每条消息放置一条消息。在研究项目中也是如此。看看这个http://www.cs.gsu.edu/dimos/content/gis-vector-data-overlay-processing-azure-platform.html

    【讨论】:

      最近更新 更多