是否有可能从天蓝色存储队列中获取两次消息?

时间:2012-05-02 19:44:04

标签: azure azure-storage azure-queues

我知道如果一个工作者无法处理队列中的消息,它将再次变为可见,并且您必须对此进行编码(幂等)。但工人是否可以将邮件两次出列?根据我的日志记录,我似乎看到了这种行为,我不知道为什么。我甚至在之间删除了消息,然后去获取下一条消息,似乎我又得到了它。

3 个答案:

答案 0 :(得分:9)

是的,您可以将相同的消息两次出列。出现这种情况有两个原因:

  1. 工作人员A将队列消息B和隐身超时到期。消息B再次可见,工作者C使消息B出列,使工作者A的弹出收据无效。工作者A完成工作,去删除消息B并抛出错误。这是最常见的。
  2. 在某些情况下(非常频繁的队列轮询),您可以在GetMessage上两次获得相同的消息。这是一种竞争条件,虽然很少发生。工作人员A和B非常快速地轮询并同时命中队列并且都获得相同的消息。在高轮询情况下,这曾经更常见(SDK 1.0时间框架),但现在在以后的存储更新中变得更加罕见(不记得最近看到这个)。
  3. 话虽如此 - 如果你只有一个工人弹出消息,那么你正在排队消息两次。只有当你有一个以上的工人时才会发生1和2。

答案 1 :(得分:0)

你不应该将它出列两次。如果我正确地回忆起事情,即使删除它也不可能,因为弹出收据应该在第二次出列并锁定后改变。

正如SilverNinja建议的那样,我希望看看该消息是否无意中排队了两次。

答案 2 :(得分:0)

你有多个工人角色吗?

有可能(特别是对于需要一段时间的进程)队列项可见性的超时可能在角色完成处理之前结束。在这种情况下,另一个相同的角色可以获取相同的消息(这实际上是您需要允许的 - 如果多次处理相同的消息,您不希望它成为问题。)

此时,第一个角色将完成并使消​​息出列,然后在超时后拾取它的另一个角色将结束并尝试使消息出列。在我的脑海中,我不记得当角色试图将已经出列的消息出列时究竟发生了什么。