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

从Azure Webjobs管理数据库连接的策略,azure,database-connection,azure-web-app-service,azure-webjobs,azure-webjobssdk,Azure,Database Connection,Azure Web App Service,Azure Webjobs,Azure Webjobssdk,我正在使用带有队列触发函数(依赖于Azure webjobs sdk)的Azure webjobs来执行一些后台处理工作。在webjobs中,我与sqlazure数据库进行了各种连接(使用PetaPoco,它使用System.Data.SqlClient) 我希望我的数据库连接策略是有目的的——特别是因为环境中存在一些固有的并发问题 一种并发场景是SDK的BatchSize属性,您可以为队列触发的WebJob设置该属性。我的理解是,设置BatchSize>1会导致队列触发函数的多个实例在同一we

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

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

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

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

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

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

这些都是我试图理解的类型

当然,Webjobs只是长期存在的控制台进程(这些是连续的Webjobs)

主进程是长寿命进程,但对于
而言,触发的子进程将在执行触发功能后释放。这意味着连接也将在子进程中自动释放。对于最佳程序实践,我们最好在退出函数之前手动关闭它

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

WebJob SDK队列触发器将自动阻止由多个实例触发的队列

如果您的web应用在多个实例上运行,则每台计算机上都会运行一个连续的WebJob,并且每台计算机都会等待触发器并尝试运行函数。WebJobs SDK队列触发器自动防止函数多次处理队列消息;函数不必写成幂等函数。但是,如果要确保即使主机web应用程序有多个实例,也只运行一个函数实例,则可以使用Singleton属性

我的理解是,设置BatchSize>1会导致队列触发函数的多个实例在同一webjob进程中运行

BatchSize表示在一个WebJob中可以同时拾取并并行执行的队列消息数


如何将Azure队列存储与包含并行执行和多个实例的WebJobs SDK一起使用,我们可以从中获得更多信息。

您能详细解释一下吗?对于触发的子进程,在执行触发函数后将释放。“什么子进程?”关于此:“WebJob SDK队列触发器将自动防止由多个实例触发的队列。“我认为您指的是SDK不允许多个实例拉同一个队列项。我同意,但这与这个问题无关。我专注于数据库连接。关于:“BatchSize意味着可以同时拾取多少队列消息以并行执行”好的,那么我们说的是同一件事。您提到
我使用的Azure webjobs带有队列触发函数(依赖于Azure webjobs sdk)执行一些后台处理工作。
WebJob SDK使用JobHost对象监视函数,监视触发函数的事件,然后执行函数。如果我们尝试在函数中初始化变量,它将在函数执行后释放。谢谢您的评论。你能帮我把它说清楚吗?我仍然不确定是否看到关于如何处理数据库连接的建议。我理解您的观点,即当函数存在时,堆栈上的变量将被释放——这只是正常的语言行为。但是,您是否建议如何处理由此产生的数据库连接?因此,在我的选项中,我们可以在触发函数中打开连接并关闭连接。