是否可以从azure存储队列获取两次消息?

是否可以从azure存储队列获取两次消息?,azure,azure-storage,azure-queues,Azure,Azure Storage,Azure Queues,我知道,如果工作进程无法处理队列外的消息,它将再次可见,您必须对此进行编码(幂等)。但是,一个工作者是否有可能将一条消息排两次队?根据我的日志记录,我似乎看到了这种行为,我不知道为什么。我甚至会在收到下一条消息的过程中删除该消息,但似乎我又收到了它。您不应该两次将其出列。如果我能正确地回忆起来,即使删除两次也不可能,因为pop收据应该在第二次出列和锁定后更改 正如SilverNinja所建议的,我会看看消息是否被无意中排队两次 您是否有多个工人角色 队列项目可见性的超时可能在您的角色完成其正在执

我知道,如果工作进程无法处理队列外的消息,它将再次可见,您必须对此进行编码(幂等)。但是,一个工作者是否有可能将一条消息排两次队?根据我的日志记录,我似乎看到了这种行为,我不知道为什么。我甚至会在收到下一条消息的过程中删除该消息,但似乎我又收到了它。

您不应该两次将其出列。如果我能正确地回忆起来,即使删除两次也不可能,因为pop收据应该在第二次出列和锁定后更改


正如SilverNinja所建议的,我会看看消息是否被无意中排队两次

您是否有多个工人角色

队列项目可见性的超时可能在您的角色完成其正在执行的任何操作之前结束(特别是对于需要一段时间的进程)。在这种情况下,另一个相同的角色可以拾取相同的消息(这实际上是您需要考虑的-如果同一消息被多次处理,您不希望它成为问题)


此时,第一个角色将完成并退出消息队列,然后在超时后拾取消息的另一个角色将结束并尝试退出消息队列。我一时想不起当一个角色试图将一条已经出列的消息出列时会发生什么事。

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

  • 工作者A退出消息B的队列,不可见性超时过期。消息B再次可见,工作人员C将消息B退出队列,使工作人员A的pop收据无效。工作者A完成工作,转到删除消息B并抛出错误。这是最常见的
  • 在某些情况下(非常频繁的队列轮询),您可以在
    GetMessage
    上两次获得相同的消息。这是一种罕见的种族状况。工作人员A和B正在非常快速地轮询并同时命中队列,两者都得到相同的消息。在高轮询场景下,这种情况过去更为常见(SDK 1.0时间范围),但在以后的存储更新中,这种情况变得更加罕见(我想不起来最近见过这种情况)

  • 这就是说,若您只有1个工作者弹出消息,那个么您将消息排队两次。1和2仅在您有多个工作人员时发生。

    您确定不会发送两次吗?一旦你删除/退出消息队列,它就消失了。我一直在梳理我的日志,当我们对消息进行排队时,我注意到它没有排队两次,但我可能遗漏了什么。是时候添加更多日志记录了,再仔细考虑一下。谢谢,你看,这是我这边的一个bug,在一个案例中排队两次,但没有记录。是的,我有两个工人的实例。但是,我的操作非常快,运行时间不长。这几乎就像GetMessage和Delete没有使用一样。但基于上述情况,它更可能是一个调度错误或什么的。我不认为消息会再次变得可见,除非我在出列时传入的值中有错误-默认情况下应该是5分钟,但我允许对其进行配置-我计划对此进行审查。