0

我有两个 Azure 函数。我可以将它们视为“生产者-消费者”。一种是基于“HttpTrigger”的函数(生产者),可以随机触发。它将输入数据写入静态“ConcurrentDictionary”。第二个是“定时器触发器”Azure Function(consumer)。它定期从“Producer”函数App使用的同一个“ConcurrentDictionary”中读取数据,然后进行一些处理。

这两个功能都在同一个 .Net 项目中(但在不同的类中)。当我在本地运行应用程序时,通过静态“ConcurrentDictionary”进行的内存数据共享工作得非常好。在本地运行时,我假设它们在同一进程下运行。但是,当我在 Azure 门户中部署这些函数时(它们在同一个函数 App 资源中),我发现通过静态“ConcurrentDictionary”进行数据共享不起作用。

我只是想知道,如果在 Azure 门户中,这两个函数都有自己的进程(可能这就是他们无法共享进程内静态集合的原因)。如果是这种情况,我有什么选择让这两个功能作为正确的“生产者-消费者”工作?将两个函数保持在同一个类中会有帮助吗?

可能情况与帖子中描述的相反 - “https://stackoverflow.com/questions/62203987/do-azure-function-from-same-app-service-run-in-same-instance” . 与帖子中的问题相反,我希望两个函数都使用静态类实例的相同静态成员。

很抱歉我不能做太多实验,因为部署是通过 Azure-DevOps 管道完成的。存储库中签入过多有点不方便。正如我所提到的,它在本地运行良好。所以,我不知道如何在本地环境中重新创建 Azure 门户中发生的事情,以便我可以尝试不同的选项?有没有我想申请的可配置的东西?

4

1 回答 1

1

不要那样做,使用天蓝色队列、事件网格、服务总线或其他可靠但不要尝试使用共享对象的东西。一旦发生横向扩展或其中一个进程终止,它就会失败。将功能视为独立的部分,不要试图违背框架。

是的,当您在本地运行函数但随后在单台机器上运行并且运行时可能使用相同的进程但一旦部署后,它可能会起作用。

如果你真的不想将你的逻辑分离成一个完全分离的生产者和消费者,那么编写一个使用进程中队列或集合的函数,并让该函数处理处理。

于 2021-09-19T20:37:18.650 回答