我知道如果一个工作者无法处理队列中的消息,它将再次变为可见,并且您必须对此进行编码(幂等)。但工人是否可以将邮件两次出列?根据我的日志记录,我似乎看到了这种行为,我不知道为什么。我甚至在之间删除了消息,然后去获取下一条消息,似乎我又得到了它。
答案 0 :(得分:9)
是的,您可以将相同的消息两次出列。出现这种情况有两个原因:
GetMessage
上两次获得相同的消息。这是一种竞争条件,虽然很少发生。工作人员A和B非常快速地轮询并同时命中队列并且都获得相同的消息。在高轮询情况下,这曾经更常见(SDK 1.0时间框架),但现在在以后的存储更新中变得更加罕见(不记得最近看到这个)。话虽如此 - 如果你只有一个工人弹出消息,那么你正在排队消息两次。只有当你有一个以上的工人时才会发生1和2。
答案 1 :(得分:0)
你不应该将它出列两次。如果我正确地回忆起事情,即使删除它也不可能,因为弹出收据应该在第二次出列并锁定后改变。
正如SilverNinja建议的那样,我希望看看该消息是否无意中排队了两次。
答案 2 :(得分:0)
你有多个工人角色吗?
有可能(特别是对于需要一段时间的进程)队列项可见性的超时可能在角色完成处理之前结束。在这种情况下,另一个相同的角色可以获取相同的消息(这实际上是您需要允许的 - 如果多次处理相同的消息,您不希望它成为问题。)
此时,第一个角色将完成并使消息出列,然后在超时后拾取它的另一个角色将结束并尝试使消息出列。在我的脑海中,我不记得当角色试图将已经出列的消息出列时究竟发生了什么。