Webjob错误,因为转移到Azure Sql v12

时间:2015-08-01 11:11:06

标签: azure-sql-database azure-webjobs

每天凌晨4点,计划任务在消息队列中创建大约500条消息。每封邮件都是要发送的电子邮件的ID。每个邮件都会被选中并创建一个网址并通过await HttpClient.GetAsync(url)发送。网址目标会创建并发送电子邮件。这已经好几个月了。

我刚刚升级到SQL Azure v12,现在一切都还不好。

要处理的第一条消息(运行时间为2分钟后)抛出一个

  

" System.Threading.Tasks.TaskCanceledException"

我也看到了

  

" System.Data.Entity.Core.EntityException:底层提供者   打开失败。 ---> System.InvalidOperationException:超时   过期。在获得连接之前经过了超时时间   从游泳池。这可能是因为所有汇集的连接   正在使用并达到最大池大小。"

和几个

  

"完成操作之前经过的超时时间或   服务器没有响应。尝试时发生此故障   连接到路由目标。持续时间   尝试连接到原始服务器是 - [预登录]   初始化= 6;握手= 426; [登录]初始化= 0;   认证= 0;"

将请求发送到api的webjob正在等待响应。我想知道是否因为它是异步的,在等待响应时线程被释放以关闭并处理另一个队列项 - 因此创建了另一个api请求,基本上这会一次又一次地击中api直到api处理了这么多请求所有的theads都在使用 - 并且我可能最好不要让webjob异步,因为那时它(被困的'线程)会仅在第一个请求完成后发送请求?是对的吗?编辑:实际上IIS日志表明api请求不是一次全部发生。所以我的问题是"我接下来应该怎么看?这些常见的SQL v12错误或最近升级是红鲱鱼吗?"

只是为了澄清,响应队列消息而触发的webjob只是: using (HttpClient client = new HttpClient()) { response = await client.GetAsync(url); }

并点击Always On标准层azure网站的web api。发生这种情况时,数据库DTU%约为25%。

编辑:

  

"网关不再在V12中提供重试逻辑在版本V12之前,   Azure SQL数据库有一个网关,充当缓冲所有的代理   数据库与客户端程序之间的交互。网关   为某些瞬态错误提供了自动重试逻辑。

     

V12淘汰了网关。现在你的程序必须更全面地处理   瞬态错误。"

为SqlAzureExecutionStrategy添加DbConfiguration类。今晚它将如何运行。

1 个答案:

答案 0 :(得分:4)

添加EF重试配置类修复了瞬态错误。取消的任务是一个不同的问题(新问题)

//https://msdn.microsoft.com/en-us/data/jj680699
public class SqlAzureConfiguration : DbConfiguration
{
    public SqlAzureConfiguration()
    {
        this.SetExecutionStrategy("System.Data.SqlClient", () => new SqlAzureExecutionStrategy());
    }
}

和web.config(因为我有多个上下文)

<entityFramework codeConfigurationType="Abc.DataService.SqlAzureConfiguration, Abc.DataService">