Azure StorageClientException:指定的消息不存在?

Azure StorageClientException:指定的消息不存在?,azure,azure-storage,Azure,Azure Storage,我有一个简单的视频编码工作者角色,它从队列中提取消息,对视频进行编码,然后将视频上传到存储器。一切似乎都正常,但在完成编码和上传后删除邮件时,偶尔会出现“StorageClientException:指定的邮件不存在”。虽然视频已被处理,但我相信邮件会重新出现在队列中,因为它没有被正确删除。我将消息Visablity设置为5分钟,所有视频的处理时间都不超过2分钟 有没有可能是另一个例子 工人角色的作用是处理和 删除消息 GetMessage()不阻止 其他工作人员角色从拾取开始 同样的信息 我

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

  • 有没有可能是另一个例子 工人角色的作用是处理和 删除消息
  • GetMessage()不阻止 其他工作人员角色从拾取开始 同样的信息
  • 我是不是在做错事 设置我的队列
  • 是什么原因导致此消息丢失 删除时找不到
一些代码…

  //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 fabric中,没有一个视频会超过2分钟。我建议节省处理时间和存储中所有未处理的异常,以便调试这些视频e死后可能发生的冲突。没有一个视频超过2分钟。好吧,你粘贴在这里的代码看起来很好,所以我会查看其余的代码,或者添加一些日志来尝试调试……这里没有任何可疑之处。