每天凌晨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类。今晚它将如何运行。
答案 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">