Node.js 禁用Azure函数多个同时触发器

Node.js 禁用Azure函数多个同时触发器,node.js,azure,azure-storage,azure-functions,azure-storage-queues,Node.js,Azure,Azure Storage,Azure Functions,Azure Storage Queues,我有一个Azure Function应用程序,其中7个函数是用Node.js编写的,通过Bitbucket CI和项目根目录下的以下host.json-文件部署的: { "id": "...", "queues": { // retrieve only 1 queue message at a time "batchSize": 1, "maxDequeueCount": 1, "newBatchThreshold"

我有一个Azure Function应用程序,其中7个函数是用Node.js编写的,通过Bitbucket CI和项目根目录下的以下
host.json
-文件部署的:

{
    "id": "...",
    "queues": {
        // retrieve only 1 queue message at a time
        "batchSize": 1,
        "maxDequeueCount": 1,
        "newBatchThreshold": 0
    }
}
据我所知,这应该确保一次只触发1个队列触发函数

但是,如果我在函数中放入以下语句:

context.log(`Started processing at ${new Date()}`);
我仍然有一些情况下,2个队列消息的开始时间完全相同

知道我错过了什么吗? 这是每个函数还是每个队列使用的
batchSize
属性?

如果查看,可以看到batchSize是每个(作业)函数

在这里,Azure函数将批次拉入

每个QueueTrigger绑定都创建了一个单独的队列侦听器,因此
batchSize
是每个函数的。在这种情况下,由于有7个函数从同一个队列触发,因此可以在单独的函数执行中在此实例上同时处理多达7条队列消息

我通过编写一个webjobs控制台应用程序进行验证,该应用程序具有从同一队列触发的两个函数。我可以看到有两个单独的QueueListener对象(通过
GetHashCode
),每个函数一个,同时在同一队列上侦听


为什么要禁用同步执行?

我有7个函数,其中3个函数有一个队列触发器,但所有函数都有一个单独的队列。所以你可以说,我有一个函数处理一个特定的队列,并且仍然一次将多个消息出列。实际上,我正在编写一个web scraper,所以我需要按顺序执行我的函数,直到我的队列中什么都没有。理想的方法是将计时器触发器与队列消息相结合,并且仅每X秒触发一次函数,但是如果队列触发器能够像我期望的那样工作,那么每次使用一个队列触发器就足够了。感谢您的回复。因此,在调用
context.done()
尝试将我的函数限制为10秒之前,我尝试在函数末尾添加一个
setTimeout()
,但这没有帮助,在到达我的超时时间之前,一条新消息已退出队列。Matt所做的所有评论都正确描述了这些配置旋钮如何影响单个主机实例上的处理。但是,如果您的函数应用程序正在向外扩展(在消费计划中运行时会自动扩展),那么您将在不同的VM实例之间获得并发性。这些旋钮是每个实例的,而不是全局的。您是否正在消耗中运行?@Schaemelhout是的,因为您可以保证并发实例的数量(在这种情况下,您只需要一个)。如果应用程序的负载足够大,消费将添加实例。部署单元是功能应用程序-这意味着如果功能应用程序中的任何功能需要扩展,您将获得一个包含该应用程序中所有功能的新实例。此外,缩放取决于队列长度等因素-如果将
batchSize
maxDequeueCount
设置为1,但队列长度较长,我们的缩放控制器将添加新实例以尝试处理负载。