我知道,如果一个工作人员未能处理消息队列中的消息,它将再次变为可见,并且您必须对此进行编码(幂等)。但是,工作人员是否有可能两次将邮件出列?根据我的日志记录,我似乎看到了这种行为,我不知道为什么。我甚至在删除之间的消息去获得下一条消息,似乎我再次得到它。是否可以从蔚蓝存储队列中获取消息两次?
4
A
回答
0
您应该不能将其退出两次。如果我正确地回忆起事情,即使删除它两次也是不可能的,因为弹出收据应该在第二次出列和锁定之后改变。正如SilverNinja建议的那样,我想看看这封邮件是否被无意中排队两次。
0
您是否有多个工作者角色?
在角色完成处理任何事情之前,可能(特别是对于需要一段时间的进程)队列项可见性的超时可能会结束。在这种情况下,另一个相同的角色可能会选择相同的消息(这实际上是您需要允许的 - 如果同一消息被多次处理,您不希望它成为问题)。
在这一点上,第一个角色将完成并将邮件出列,然后在超时后拾取它的另一个角色将结束并尝试将邮件出列。关于我的头顶,我不记得当一个角色试图将已经出队的邮件出列时究竟发生了什么。
+0
是的 - 我有两个工人的实例。不过,我的操作非常快,不会长时间运行。这几乎就像GetMessage和Delete一样。但基于上述情况,这更可能是一个调度错误或其他问题。我不认为消息再次变得可见,除非我在出队时传入的值中存在一个错误 - 默认情况下应该是5分钟,但我允许进行配置 - 我打算对其进行检查。 – Bryan
5
是的,你可以两次出列相同的消息。这可能发生的原因有两个:
- 工作人员出列消息B和隐形超时到期。消息B再次可见,并且工人C使消息B出队,使工人A的流行收据无效。工作者A完成工作,去删除消息B并抛出错误。这是最常见的。
- 在某些情况下(非常频繁的队列轮询),您可以在GetMessage上两次获取相同的消息。这是一种竞争状态,虽然很少发生。工作者A和B非常快速地进行轮询并同时进入队列,并且都得到相同的信息。在高轮询情况下,这种情况通常比较常见(SDK 1.0时间范围),但现在在以后的存储更新中变得更加罕见(最近无法回想这一点)。
这就是说 - 如果你只有1个工人弹出消息,那么你排队消息两次。 1和2只有当你有超过1名工人时才会发生。
相关问题
- 1. 蔚蓝存储队列消息的现场时间
- 2. 如何压缩蔚蓝的队列消息(JSON字符串),推动并从Azure存储队列中提取
- 3. 获取从蔚蓝的表存储
- 4. 如何获得在蔚蓝的队列中的消息数
- 5. 蔚蓝云队列的可伸缩性
- 6. 是否可以从崩溃转储中分析Windows消息队列?
- 7. 如何获取从蔚蓝
- 8. JT400 - 从队列中获取消息
- 9. 从消息中获取队列名称
- 10. 是否可以在列存储中只存储一次列值?
- 11. 从Linux IPC消息队列中读取消息两次的方法
- 12. 蔚蓝存储队列(json vs二进制)
- 13. RabbitMQ只有一次从队列中获取消息计数
- 14. WCSession:是否可以取消排队的消息?
- 15. 在消息队列中存储变量
- 16. 蔚蓝表存储查询
- 17. 蔚蓝表存储和Python
- 18. 错误从JMS消息获取队列
- 19. 从队列中获取消息只检索单条消息
- 20. 存储XML在蔚蓝的表存储
- 21. 是否可以从IDialogContext参数中获取用户的消息?
- 22. 可以Azure存储可用于制造蔚蓝用户
- 23. 在蔚蓝表存储中存储枚举列表
- 24. 限制Azure存储队列中消息处理尝试次数
- 25. 从rabbitmq队列中获取一条消息并取消订阅
- 26. Windows消息队列是否以FIFO方式处理消息?
- 27. 获取RabbitMQ队列中的消息数
- 28. Azure队列存储消息大小
- 29. 是否可以在RabbitMQ队列之间移动/合并消息?
- 30. 是否可以从maven中心存储库获取weblogic-maven-plugin?
你确定你没有发送两次吗?一旦你删除/离队消息,它就消失了。 – SliverNinja
我一直在梳理我的日志,注意到当我们排队的消息,并不能看到它排队两次,但它可能我失去了一些东西。现在可以添加更多的日志记录,并通过更多一点的思考。谢谢 – Bryan
而且你去了 - 这是我身边的一个错误,在一次没有记录的情况下排队两次。 – Bryan