作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个简单的视频编码工作角色,它从队列中提取消息对视频进行编码,然后将视频上传到存储。一切似乎都正常,但偶尔在完成编码和上传后删除消息时,我会收到“StorageClientException:指定的消息不存在。”虽然视频已处理,但我相信该消息是由于未正确删除而重新出现在队列中。我将消息可见性设置为 5 分钟,没有一个视频的处理时间超过 2 分钟。
一些代码...
//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/
我是一名优秀的程序员,十分优秀!