4

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

4

3 回答 3

10

是的,您可以将同一消息出列两次。这可能有两个原因:

  1. 工人 A 使消息 B 出列并且不可见超时到期。消息 B 再次可见,并且 Worker C 将消息 B 出列,从而使 Worker A 的 pop 收据无效。工人 A 完成工作,去删除消息 B 并抛出错误。这是最常见的。
  2. 在某些情况下(非常频繁的队列轮询),您可以在GetMessage. 这是一种竞争条件,虽然很少发生。工人 A 和 B 轮询非常快,同时进入队列,都得到相同的消息。这曾经在高轮询场景下更为常见(SDK 1.0 时间框架),但现在在以后的存储更新中变得更加罕见(不记得最近看到过这种情况)。

话虽如此 - 如果您只有 1 个工作人员弹出消息,那么您将两次排队消息。1 和 2 仅在您有超过 1 个工人时发生。

于 2012-05-03T01:40:05.053 回答
0

您不应该两次将其出列。如果我没记错的话,即使删除它两次也不可能,因为弹出收据应该在第二次出队和锁定后改变。

正如 SilverNinja 建议的那样,我会查看消息是否可能无意中排队了两次。

于 2012-05-02T19:59:25.237 回答
0

您是否有多个工人角色?

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

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

于 2012-05-02T20:41:33.997 回答