考虑这种情况: 有一个队列接收一些消息:
现有系统的工作方式是始终通过手动调用端点来监控队列。我需要找到一种方法来停止这个连续的后台任务,它会给系统带来一些过载。
我不确定哪种方式是最好的,使用 Azure 服务总线触发器 也许可以代替持续监控?但不确定是否有办法找出队列为空以将某些内容发送到另一个 Azure 函数。
我进行了一些研究,也许可以使用https://learn.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-overview?tabs=in-process%2Cnodejs-v3% 2Cv1-model&pivots=csharp#monitoring 。欢迎任何建议。
为自己创建一个
QueueClient
对象,可能在 Function 应用程序的依赖注入配置中,然后检查 Azure Function 处理程序末尾的 ApproximateMessagesCount
。
如果计数中的消息少于几条,则将其视为空。 (不要忘记考虑您已经处理的 1 条消息)
public class MyQueueHandler
{
private readonly QueueClient _queueClient;
public MyQueueHandler(QueueClient queueClient)
{
_queueClient = queueClient; // From your DI config.
}
public async Task HandleQueueItemAsync([QueueTrigger("your-queue")] Something myQueueItem, FunctionContext context)
{
// TODO: Process your queue item as normal.
await ProcessThisItemAsync(myQueueItem);
// Check if the queue is nearly empty.
QueueProperties properties = await _queueClient.GetPropertiesAsync();
if (properties.ApproximateMessageCount <= 1)
{
// TODO: Whatever you need to notify about the queue being empty.
await NotifyQueueNearlyEmpty();
}
}
}
请注意,您永远不能依赖队列计数的准确性。对于可扩展的云架构来说,通常会存在许多竞争条件。
即使在最好的情况下,您也可以想象当您检查队列时队列看起来是空的,但仅仅一纳秒后另一条消息就会被发布到队列中。您会通知其他函数队列为空,但实际上可能不是。
同样,我不能保证
ApproximateMessagesCount
会(或不会)包含您当前正在处理的消息。我再次怀疑会有竞争条件。
因此,即使对
ApproximateMessageCount <= 1
进行了上述测试,也不能保证它一定会出现在“空”队列中。
如果您可以提供有关用例的更多信息,以及计数的准确程度,也许人们可以提供更多指导。
TL;DR:假设
ApproximateMessagesCount
有时会出错,并有适当的方法来处理该问题,例如: