我使用带有队列触发功能的Azure webjobs(依赖于Azure webjobs sdk)来执行一些后台处理工作。在webjobs中,我进行了各种连接到SQL Azure数据库(使用使用System.Data.SqlClient
的PetaPoco)。
我希望在我的数据库连接策略中有目的性 - 特别是因为环境中存在一些并发问题。
一个并发场景是SDK的BatchSize属性,您可以为队列触发的webjobs设置该属性。我的理解是设置BatchSize> 1导致在同一webjob进程中运行的队列触发函数的多个实例。
第二个并发方案是网站横向扩展方案,您可以在其中运行webjob本身的多个实例。这些当然是在不同的过程中。
在我的网站中,每个请求都有一个数据库连接(默认情况下,机器处理连接池)。没问题。
如何处理webjob场景中的连接,考虑上述并发场景? Webjobs当然只是长期存在的控制台进程(这些是连续的webjobs)。我的webjob启动时是否应该创建数据库连接,并通过webjob的生命周期重新使用该连接?我应该在需要时实例化和关闭每个函数的连接吗?
这些是我试图理解的东西。
答案 0 :(得分:1)
Webjobs当然只是长期存在的控制台进程(这些是连续的webjobs)。
主要进程是长期存在的进程,但是trigged sub- process
将在执行触发函数后释放。这意味着连接也将在子流程中自动释放。对于最佳程序实践,我们最好在退出功能之前手动关闭它。
第二个并发场景是网站横向扩展场景,您正在运行webjob本身的多个实例。这些当然是在不同的过程中。
WebJob SDK队列触发器将自动阻止由多个实例触发的队列。
如果您的Web应用程序在多个实例上运行,则在每台计算机上运行连续的WebJob,并且每台计算机将等待触发器并尝试运行功能。 WebJobs SDK队列触发器自动阻止函数多次处理队列消息;函数不必写成幂等的。但是,如果要确保即使存在多个主机Web应用程序实例,也只运行一个函数实例,则可以使用Singleton属性。
我的理解是设置BatchSize> 1导致在同一webjob进程中运行的队列触发函数的多个实例
BatchSize它意味着可以同时在WebJob中以并行方式执行的队列消息数量。
如何使用WebJobs SDK引入并行执行和多个实例的Azure队列存储,我们可以从doucment获取更多信息。