【发布时间】:2023-03-17 07:16:02
【问题描述】:
我正在使用 Azure 存储队列服务来跟踪由多个不同客户端排队的长时间运行的作业队列,但我现在需要从队列中删除任何符合某些给定条件的消息。
我意识到这对于队列来说有点反模式,但该服务确实提供了除了简单队列之外的一些功能(例如Delete Message 和Peek Messages),所以我想我会尝试实现它。
我提出的解决方案可行,但不是很优雅而且效率很低 - 我想知道它是否可以做得更好 - 或者我是否应该将整个方法装箱并使用支持这个的机制设计要求(这将需要跨不同系统进行大量工作)。这是简化的代码:
var queue = MethodThatGetsTheAppropriateQueueReference();
await queue.FetchAttributesAsync(); //populates the current queue length
if (queue.ApproximateMessageCount.HasValue)
{
// Get all messages and find any messages to be removed.
// this makes those messages unavailable for other clients
// for the visibilityTimeOut period.
// I've set this to the minimum of 1 second - not ideal though
var messages = await queue.GetMessagesAsync(queue.ApproximateMessageCount.Value);
var messagesToDelete = messages.Where(x => x.AsString.Contains(someGuid));
// Delete applicable messages
messagesToDelete.ToList().ForEach(x => queue.DeleteMessageAsync(x));
}
注意最初我尝试使用PeekMessagesAsync() 来避免影响不需要删除的消息,但这并没有给您DeleteMessageAsync() 所需的PopReceipt。
问题:
- 有没有办法做到这一点,而无需拉下 ALL 的消息? (可能有很多)
- 如果 1 不可能,如果我们使用
PeekMessagesAsync(),有没有办法获得PopReceipt的消息?
【问题讨论】:
标签: c# azure azure-storage asp.net-core-1.1 azure-queues