azure - 是否可以从 azure 存储队列中获取消息两次?

标签 azure azure-storage azure-queues

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

最佳答案

是的,您可以使同一条消息两次出队。发生这种情况的原因有两个:

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

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

关于azure - 是否可以从 azure 存储队列中获取消息两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10420570/

相关文章:

.net - 使用 DeveloperExceptionPage 时如何使用 ApplicationInsights 2.x 记录 ASP.NET Core 应用程序中的异常

azure - az ad sp create-for-rbac --role ="Contributor">> 缺少订阅,

azure - 我可以在 Azure VNET 中设置 Azure 机器人服务吗?

azure - 无法删除 Azure 应用服务计划

azure - AzCopy 同步命令失败

azure - 将类型化对象添加到 Azure 中的 MessageQueue

azure - S3 上的 Azure 存储的 SAS(共享访问签名)功能相当于什么?

azure - 有没有办法使用逻辑应用将数据加载到 Azure 数据湖存储第 2 代?

azure - 如果 Azure 函数超时,触发消息是否会放回 Azure 队列?

azure - 创建可以处理多个队列的 Azure.Storage.Queues 客户端