Azure 网站上的传出流量随机超时 21/42 秒



我有一个 ASP.NET 的MVC 5应用程序作为Azure Web App在Azure德国云中运行(单个实例 - 标准S3大小)。
我正在特定主机上调用非 azure 托管的 REST/SOAP 服务,Web 请求要么立即成功,要么在 21/42 秒后超时。
我已经对请求进行了负载测试,请求超时的百分位数在 20 到 80 之间。
超时的一个特别显着的特性是,它们发生在正好 21 或 42 秒之后(这很严重,没有参考顺风车的银河系指南)。
从 Web 应用程序调用不同的服务工作正常,至少暂时如此。
我们已经检查了非 Azure 服务的防火墙,如果发生超时,则没有一个数据包到达主机。

这个问题在过去一年前发生过一次,支持人员无法判断原因是什么,直到问题在首次发生大约两周后突然消失,所以票证被关闭为修复本身,但现在它回来了。

代码正在使用 https://github.com/canton7/RestEase(在下面使用HttpClient),看起来像

[Header("Content-Type", "application/json")]
public interface IApi
{
[Post("/Login")]
Task<LoginToken> Login([Body]LoginRequest request);
}
private static Dictionary<string, IApi> ApiClientsByHost = new Dictionary<string, IApi>();
private IApi GetApiForHost(string host)
{
if (!ApiClientsByHost.TryGetValue(host, out var client))
{
lock (ApiClientsByHost)
{
if (!ApiClientsByHost.TryGetValue(host, out client))
{
ApiClientsByHost[host] = client = RestClient.For<IApi>(host);
}
}
}
return client;
}
var client = GetApiForHost("https://production/");
var loginToken = await client.Login(new LoginRequest { Username = username, Password = password });

通过不同的服务,我的意思是使用"https://testserver/"而不是"https://production/"(测试服务器位于具有不同IP和所有IP的不同数据中心)。
API 身份验证通过查询传递令牌,但在能够获取令牌之前已经超时。
代码正在缓存IApi以避免处理 HttpClient 的 TCP 饥饿问题(但我从未遇到过端口耗尽)。
重新启动应用程序并不能解决问题,问题目前仅发生在生产环境中(但是一年前,当此问题发生在生产环境中时,我们已经切换到最初工作的testserver,但一段时间后,遇到了同样的问题)

编辑:在最后一个答案中找到了一些关于那些神奇的21秒来自哪里的解释。

编辑:我发现解决方法的一种方法是设置一个带有代理的 azure vm,并将 defaultProxy 配置为通过该 VM。

这是TCP重新传输超时。奇怪的是,你得到的是不同的值。

最新更新