我知道,如果工作人员无法处理队列中的消息,该消息将再次可见,并且您必须针对此情况进行编码(幂等)。但是一个worker是否有可能使一条消息两次出队呢?根据我的记录,我似乎看到了这种行为,但我不确定为什么。我什至在去获取下一条消息之间删除了该消息,看起来我又收到了。
最佳答案
是的,您可以使同一条消息两次出队。发生这种情况的原因有两个:
- 工作线程 A 将消息 B 出列,并且不可见超时到期。消息 B 再次变得可见,并且工作人员 C 将消息 B 出列,从而使工作人员 A 的弹出收据无效。 Worker A 完成工作,去删除 Message B 并抛出错误。这是最常见的。
- 在某些情况下(非常频繁的队列轮询),您可以通过
GetMessage
两次获取相同的消息。这是一种竞争条件,虽然很少见,但确实会发生。 Worker A 和 B 的轮询速度非常快,同时进入队列,并且都收到相同的消息。过去,这种情况在高轮询场景下更为常见(SDK 1.0 时间范围),但在后来的存储更新中,这种情况变得更加罕见(不记得最近看到过这种情况)。
话虽如此 - 如果您只有 1 个工作人员弹出消息,那么您将两次对消息进行排队。 1 和 2 仅当您有超过 1 个工作人员时才会发生。
关于azure - 是否可以从 azure 存储队列中获取消息两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10420570/