Azure 函数读取队列中的一些消息

问题描述 投票:0回答:1

考虑这种情况: 有一个队列接收一些消息:

  1. 收到新消息
  2. 它开始处理它们(消息数量 未知,但我需要知道队列是否为空),然后当所有消息都已处理并且队列已完成时,我需要向另一个 Azure 函数或端点发送 ok 响应以执行其他任务 空了。

现有系统的工作方式是始终通过手动调用端点来监控队列。我需要找到一种方法来停止这个连续的后台任务,它会给系统带来一些过载。

我不确定哪种方式是最好的,使用 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 。欢迎任何建议。

.net azure azure-functions queue azureservicebus
1个回答
0
投票

为自己创建一个

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
有时会出错,并有适当的方法来处理该问题,例如:

  • 一个单独的计时器作业,定期检查队列,如果它以某种方式跳到空,则触发您的其他进程。
  • 确保您的其他进程仍然正常运行,即使队列中还剩下一些项目。
  • 根据用例,考虑有保证的消息传递(服务总线等)或其他模式。

参考:https://learn.microsoft.com/en-us/azure/storage/queues/queues-storage-monitoring-scenarios?tabs=azure-powershell#monitor-message-counts-in-each-queue

© www.soinside.com 2019 - 2024. All rights reserved.