我有一个简单的视频编码工人角色,该角色从队列中摘下消息编码视频,然后将视频上传到存储。一切似乎都在起作用,但偶尔在我完成编码和上传后删除消息时,我会得到一个 “ StorageClientException:不存在指定的消息。” 尽管处理了视频,但我相信该消息在队列中重新出现,因为它没有正确删除。我的消息可查看到5分钟,没有一个以上的视频来处理。

  • 工人角色的另一个实例是否可能是处理和删除消息?
  • GetMessage()难道不是阻止其他工人角色捡起相同的消息吗?
  • 我在队列的设置中做错了什么?
  • 什么可能导致此消息在DELETE上找不到?

一些代码...

  //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);
            }
        }
    }
有帮助吗?

解决方案 3

我的发展,生产和舞台都从同一队列中拉出来,这引起了一些奇怪的行为。我相信这是罪魁祸首。

其他提示

是否需要比您设定为超时的五分钟的时间更长?

如果 编码过程比消息隐身超时需要更多的时间 (在您的情况下为5分钟),然后 消息将再次出现在队列中. 。这将导致第二名工人开始处理它。但是,很有可能在第二工人完成处理时,第一工人已经完成了工作,并正确删除了这项工作。这将导致第二名工人在删除阶段失败,因为该信息不再存在于他。

这是由于 Windows Azure队列轻巧的交易模型. 。它保证了 消息将至少处理一次 (即使工人默默失败),但是 不能保证“一次”处理.

由于您的编码过程似乎是势力和轻量级的(由于错误出现错误),因此我建议我建议 增加隐形超时明确捕获此例外 (按状态代码)围绕删除(可选地记录过程持续时间,以便能够进一步调整隐形超时)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top