1

我有两个Azure WebJobs。第一个消息传入一条消息,告诉它抓取PDF并将其分解为单独的页面图像,然后为第二个WebJob处理单个页面排队另一条消息。它在我们的QC实例中运行良好,但是当我们尝试转向生产时,我开始在第二份工作上出现奇怪的错误,但并不一致。第一份作业运行并将文件分解成页面图像。这工作正常。我已确认每个页面图像都已创建,并且每个页面消息都已排队。但是,对于第二份工作,只有部分消息得到正确处理。其余的节目出现此错误WebJob诊断:Azure WebJob DB连接错误仅在某些情况下

Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Microsoft.Azure.WebJobs.Host.FunctionInvocationException: Exception while executing function: Functions.ProcessBatchPage ---> System.Data.SqlClient.SqlException: A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: SQL Network Interfaces, error: 52 - Unable to locate a Local Database Runtime installation. Verify that SQL Server Express is properly installed and that the Local Database Runtime feature is enabled.) ---> System.ComponentModel.Win32Exception: The system cannot find the file specified

但是,什么是奇怪的是,这个错误中提到的本地数据库运行时和SQL Server Express,我无论是在我的代码的任何地方没有引用。系统指向Azure SQL数据库。作业是ADO.Net,并且我已经对连接字符串进行了硬编码,以尝试消除基于配置的连接字符串的任何问题。但奇怪的是,它只发生在消息的某个部分。其他处理完美。

最后,我在本地调试运行作业(仍然指向Azure上的真实队列和数据库)并得到同样的问题。但作业会输出一个控制台行,并将作业ID作为代码的第一行。对于那些成功处理的工作,我看到这条记录。对于那些失败的人,我从未看到任何东西。这几乎就像工作并没有真正开始。 (失败的作业也有一个非常短的运行时间50-100ms)

+0

你能发布这类部署到Azure中的app.config?如果你使用EF,你可以发布你如何设置连接字符串吗? – lopezbertoni

+0

根本不使用EF。我在网页作业中遇到了EF的麻烦,所以我只是直接用ADO.net重写了它。它具有带硬编码连接字符串的SQLConnection语句。以前我在app.config中有CS,但是在webjob functions.cs中用硬编码来试图消除这个问题。 –

回答

2

我有一些工作同样的问题,我已经来到翻过这些文章,以找到一个解决方案:

从论文的文章:

瞬态故障的原因

在云环境中,您会发现失败的数据库连接会定期发生。这部分是因为与Web服务器和数据库服务器具有直接物理连接的本地环境相比,您正在经历更多的负载平衡器。此外,有时当您依赖多租户服务时,您将看到对该服务的调用变得更慢或超时,因为使用该服务的其他人正在大量使用该服务。在其他情况下,您可能是频繁访问该服务的用户,并且该服务会故意阻止您 - 拒绝连接 - 以防止您对该服务的其他租户造成不利影响。

使用智能重试/回退逻辑,以减轻瞬时故障的效果:

Microsoft模式&实践团队拥有Transient Fault Handling Application Block,如果你正在使用ADO.NET为你做的一切用于SQL数据库访问(而不是通过实体框架)。你刚才设置的重试政策 - 多少次重试查询或命令多久尝试之间的等待时间 - 并在使用块换你的SQL代码:

public void HandleTransients() 
{ 
    var connStr = "some database"; 
    var _policy = RetryPolicy.Create < SqlAzureTransientErrorDetectionStrategy(
    retryCount: 3, 
    retryInterval: TimeSpan.FromSeconds(5)); 

    using (var conn = new ReliableSqlConnection(connStr, _policy)) 
    { 
     // Do SQL stuff here. 
    } 
} 

当您使用实体框架你通常不直接使用SQL连接,所以你不能使用这个模式和实践包,但实体框架6直接在框架中构建这种类型的重试逻辑。以类似的方式指定重试策略,然后EF在访问数据库时使用该策略。

To use this feature in the Fix It app, all we have to do is add a class that derives from DbConfiguration and turn on the retry logic.

// EF follows a Code based Configuration model and will look for a class that 
// derives from DbConfiguration for executing any Connection Resiliency strategies 
public class EFConfiguration : DbConfiguration 
{ 
    public EFConfiguration() 
    { 
     AddExecutionStrategy(() => new SqlAzureExecutionStrategy()); 
    } 
} 
+0

谢谢托马斯。我正在使用ADO.net并添加TFHAB代码似乎清除了此错误。虽然我应该一直在使用它,但是它返回的与SQL Server Express有关的错误却让我大发脾气! –

相关问题