【问题标题】:Azure queues getMessages method in sdk not working as expectedsdk 中的 Azure 队列 getMessages 方法未按预期工作
【发布时间】:2016-06-10 08:35:32
【问题描述】:

我在 Azure Queue 中创建了一个队列,并将其中的两个项目排入队列。使用 nodejs sdk,我创建了一个每 5 秒执行一次的计时器并调用:

azure.createQueueService("precondevqueues", "<key>").getMessages(queueName, {numOfMessages : 1, visibilityTimeout: 1 }, callback)

我希望队列中两个相同的消息每 5 秒显示一次,但似乎并非如此。此调用的输出在两条消息之间交替。

这不应该是这种情况,因为 visibilityTimeout 设置为 1,因此在 1 秒后,在第一次调用中出列的消息应该在下一次 getMessage 调用之前再次可见。

【问题讨论】:

    标签: node.js azure-queues azure-storage-queues


    【解决方案1】:

    here 所述,FIFO 排序无法保证。因此,大多数情况下,消息都是按 FIFO 顺序获取的,但这并不能保证,Azure 可以按照最适合其实施的顺序为您提供消息。

    消息通常被添加到队列的末尾并被检索 从队列的前面,虽然先进先出(FIFO) 行为无法保证。

    【讨论】:

    • 嗯,我每次都看到这种行为。似乎 getMessages 实际上更新了条目,将其推到了队列的后面。
    • 是的,这是可能的,他们文档中的声明绝对没问题
    • 我尝试了 3 个项目,然后是 4 个项目,它的行为就像 getMessages 将项目取出然后将其重新排入尾部一样。因此,如果您将 a、b、c 和 d 排入队列,然后每隔几个时间间隔执行一次 getMessage(可见性超时小于时间间隔),您基本上会循环 a->b->c->d
    • 再一次,这对他们的文档来说绝对没问题,因为他们不保证排序。它可以是 a->b->c->d 或 b->a->c->d。这不是不当行为,因为没有保证订购
    【解决方案2】:

    啊哈我的错!我再次非常仔细地阅读了 getMessages 文档并意识到 getMessages 将消息出列但保留了一个不可见的副本在队列之外。如果消息处理器在可见性超时到期之前没有删除消息,则副本将重新排列在消息中,因此它们会进入队列的末尾。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-25
      • 1970-01-01
      • 2019-04-22
      • 2015-01-28
      • 1970-01-01
      相关资源
      最近更新 更多