弹出收据在更新消息时更改
Pop receipt changed on update message
我们的应用程序将消息从 Azure 队列中取出,并使其在给定时间段内不可见。
Worker 然后处理它,当所有工作完成后,它将它从队列中删除。
但有时删除会失败并出现 404 错误未找到。问题可能是消息的弹出收据已更改。
因为当消息出队时,单独的线程也会 运行s 并增加消息的不可见性以防止它被其他消费者拾取。但它会调用 UpdateMessage,它实际上会更改弹出收据。
因为UpdateMesasge和DeleteMessage可能会同时运行,DeleteMessage有时会失败,因为它的PopReceipt不再有效。
有什么方法可以避免 UpdateMessage 上的 PopReceipt 更改?
代码示例:
TimerCallback extenderHandler = new TimerCallback(async state =>
{
try
{
var oldNextVisibleTime = queueMessage.NextVisibleTime.Value;
// extend message lease to prevent it from being picked by another worker instances
await returnMessage();
}
catch (Exception ex)
{
// NOTE: exceptions on Timer are not propagated to main thread; the error is only logged, because operation will be retried;
}
});
// start message extender timer which extends message lease time when it's nearing its max hold time, timer runs until it's disposed
using (var messageExtenderTimer = new System.Threading.Timer(extenderHandler, null, 0, (int)MessageLeaseCheckInterval.TotalMilliseconds))
{
processMessage();
}
在 returnMessage 方法中调用 Microsoft.WindowsAzure.Storage.Queue 的 UpdateMessageAsync。
在 processMessage 方法中,处理本身已完成,最后使用 Microsoft.WindowsAzure.Storage.Queue
中的 DeleteMessage 方法删除消息
有时 UpdateMessageAsync 失败,有时 DeleteMessage 失败。因此,我想知道当这两个并发线程对消息进行更改时 - 在 PopReceipt 更新消息本身之前,队列中的消息已更改。
Is there any way to avoid PopReceipt change on UpdateMessage?
很遗憾没有。每当更新消息时,都会返回一个新的 PopReceipt
。来自文档 link(#4 项):
The message has been updated with a new visibility timeout. When the
message is updated, a new pop receipt will be returned.
我们的应用程序将消息从 Azure 队列中取出,并使其在给定时间段内不可见。
Worker 然后处理它,当所有工作完成后,它将它从队列中删除。
但有时删除会失败并出现 404 错误未找到。问题可能是消息的弹出收据已更改。
因为当消息出队时,单独的线程也会 运行s 并增加消息的不可见性以防止它被其他消费者拾取。但它会调用 UpdateMessage,它实际上会更改弹出收据。
因为UpdateMesasge和DeleteMessage可能会同时运行,DeleteMessage有时会失败,因为它的PopReceipt不再有效。
有什么方法可以避免 UpdateMessage 上的 PopReceipt 更改?
代码示例:
TimerCallback extenderHandler = new TimerCallback(async state =>
{
try
{
var oldNextVisibleTime = queueMessage.NextVisibleTime.Value;
// extend message lease to prevent it from being picked by another worker instances
await returnMessage();
}
catch (Exception ex)
{
// NOTE: exceptions on Timer are not propagated to main thread; the error is only logged, because operation will be retried;
}
});
// start message extender timer which extends message lease time when it's nearing its max hold time, timer runs until it's disposed
using (var messageExtenderTimer = new System.Threading.Timer(extenderHandler, null, 0, (int)MessageLeaseCheckInterval.TotalMilliseconds))
{
processMessage();
}
在 returnMessage 方法中调用 Microsoft.WindowsAzure.Storage.Queue 的 UpdateMessageAsync。
在 processMessage 方法中,处理本身已完成,最后使用 Microsoft.WindowsAzure.Storage.Queue
中的 DeleteMessage 方法删除消息有时 UpdateMessageAsync 失败,有时 DeleteMessage 失败。因此,我想知道当这两个并发线程对消息进行更改时 - 在 PopReceipt 更新消息本身之前,队列中的消息已更改。
Is there any way to avoid PopReceipt change on UpdateMessage?
很遗憾没有。每当更新消息时,都会返回一个新的 PopReceipt
。来自文档 link(#4 项):
The message has been updated with a new visibility timeout. When the message is updated, a new pop receipt will be returned.