从Azure Webjobs管理数据库连接的策略

时间:2017-02-14 18:28:21

标签: azure database-connection azure-web-sites azure-webjobs azure-webjobssdk

我使用带有队列触发功能的Azure webjobs(依赖于Azure webjobs sdk)来执行一些后台处理工作。在webjobs中,我进行了各种连接到SQL Azure数据库(使用使用System.Data.SqlClient的PetaPoco)。

我希望在我的数据库连接策略中有目的性 - 特别是因为环境中存在一些并发问题。

一个并发场景是SDK的BatchSize属性,您可以为队列触发的webjobs设置该属性。我的理解是设置BatchSize> 1导致在同一webjob进程中运行的队列触发函数的多个实例。

第二个并发方案是网站横向扩展方案,您可以在其中运行webjob本身的多个实例。这些当然是在不同的过程中。

在我的网站中,每个请求都有一个数据库连接(默认情况下,机器处理连接池)。没问题。

如何处理webjob场景中的连接,考虑上述并发场景? Webjobs当然只是长期存在的控制台进程(这些是连续的webjobs)。我的webjob启动时是否应该创建数据库连接,并通过webjob的生命周期重新使用该连接?我应该在需要时实例化和关闭每个函数的连接吗?

这些是我试图理解的东西。

1 个答案:

答案 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获取更多信息。