2012-05-02 54 views
4

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

+1

你确定你没有发送两次吗?一旦你删除/离队消息,它就消失了。 – SliverNinja

+1

我一直在梳理我的日志,注意到当我们排队的消息,并不能看到它排队两次,但它可能我失去了一些东西。现在可以添加更多的日志记录,并通过更多一点的思考。谢谢 – Bryan

+1

而且你去了 - 这是我身边的一个错误,在一次没有记录的情况下排队两次。 – Bryan

回答

0

您应该不能将其退出两次。如果我正确地回忆起事情,即使删除它两次也是不可能的,因为弹出收据应该在第二次出列和锁定之后改变。正如SilverNinja建议的那样,我想看看这封邮件是否被无意中排队两次。

0

您是否有多个工作者角色?

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

在这一点上,第一个角色将完成并将邮件出列,然后在超时后拾取它的另一个角色将结束并尝试将邮件出列。关于我的头顶,我不记得当一个角色试图将已经出队的邮件出列时究竟发生了什么。

+0

是的 - 我有两个工人的实例。不过,我的操作非常快,不会长时间运行。这几乎就像GetMessage和Delete一样。但基于上述情况,这更可能是一个调度错误或其他问题。我不认为消息再次变得可见,除非我在出队时传入的值中存在一个错误 - 默认情况下应该是5分钟,但我允许进行配置 - 我打算对其进行检查。 – Bryan

5

是的,你可以两次出列相同的消息。这可能发生的原因有两个:

  1. 工作人员出列消息B和隐形超时到期。消息B再次可见,并且工人C使消息B出队,使工人A的流行收据无效。工作者A完成工作,去删除消息B并抛出错误。这是最常见的。
  2. 在某些情况下(非常频繁的队列轮询),您可以在GetMessage上两次获取相同的消息。这是一种竞争状态,虽然很少发生。工作者A和B非常快速地进行轮询并同时进入队列,并且都得到相同的信息。在高轮询情况下,这种情况通常比较常见(SDK 1.0时间范围),但现在在以后的存储更新中变得更加罕见(最近无法回想这一点)。

这就是说 - 如果你只有1个工人弹出消息,那么你排队消息两次。 1和2只有当你有超过1名工人时才会发生。