azure - 存储客户端异常 : The specified message does not exist?

标签 azure azure-storage

我有一个简单的视频编码工作角色,它从队列中提取消息对视频进行编码,然后将视频上传到存储。一切似乎都正常,但偶尔在完成编码和上传后删除消息时,我会收到“StorageClientException:指定的消息不存在。”虽然视频已处理,但我相信该消息是由于未正确删除而重新出现在队列中。我将消息可见性设置为 5 分钟,没有一个视频的处理时间超过 2 分钟。

  • 是否有可能是另一个实例 Worker 角色的核心是处理和 删除该消息吗?
  • GetMessage() 不会阻止 其他 worker 角色 同样的消息?
  • 我是不是做错了什么 设置我的队列?
  • 什么可能导致此消息 删除时找不到?

一些代码...

  //onStart() queue setup
  var queueStorage = _storageAccount.CreateCloudQueueClient();
  _queue = queueStorage.GetQueueReference(QueueReference);
  queueStorage.RetryPolicy = RetryPolicies.Retry(5, new TimeSpan(0, 5, 0));
  _queue.CreateIfNotExist();


 public override void Run()
  {
        while (true)
        {
            try
            {
                var msg = _queue.GetMessage(new TimeSpan(0, 5, 0));
                if (msg != null)
                {
                   EncodeIt(msg);
                   PostIt(msg);
                   _queue.DeleteMessage(msg);
                }
                else
                {
                    Thread.Sleep(WaitTime);
                }
            }
            catch (StorageClientException exception)
            {
                BlobTrace.Write(exception.ToString());
                Thread.Sleep(WaitTime);
            }
        }
    }

最佳答案

如果编码过程花费的时间超过消息不可见超时(在您的情况下为 5 分钟),则消息将再次显示在队列中。这将导致第二个工作人员开始处理它。然而,很可能当第二个工作人员完成处理时,第一个工作人员已经完成了工作,并正确删除了它。这将导致第二个工作人员在删除阶段失败,因为该消息不再存在。

发生这种情况是由于 Windows Azure 队列的轻量级事务模型。它保证消息至少被处理一次(即使工作线程默默地失败),但不保证“仅一次”处理

由于您的编码过程似乎是幂等且轻量级的(因为错误很少出现),因此我建议增加不可见超时显式捕获此异常(通过状态代码)围绕DeleteMessages(可以选择记录进程持续时间,以便能够进一步调整不可见超时)。

关于azure - 存储客户端异常 : The specified message does not exist?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2718559/

相关文章:

azure - Azure 备份服务需要哪些权限?

asp.net-mvc-4 - 使用 Windows Azure Active Directory 注册 MVC 4 网站的新用户

azure - 将预训练模型从存储帐户注册到 Azure ML

ios - 如何将 iOS 数据发送到 Azure 移动服务数据库?

c# - 在 Azure Blob 存储中存储字符串并使用 C# 获取对 Blob 的引用

azure - 如何使用 azure powershell 命令获取给定存储帐户名称和资源组的存储帐户 ID?

c# - 将枚举列表存储在Azure表存储中

azure - 使用核心工具 2 的 azure 函数 c# 中的绑定(bind)类型 'serviceBusTrigger' 未注册错误

azure - Azure 存储 CDN 和 CORS 问题

具有 Azure Blob 存储操作的 Azure 逻辑应用程序 : Getting 429 statusCode error