我在Azure Azure Web App(单一实例 - 标准S3大小)中运行在azure德国云中的ASP.NET MVC 5应用程序。
我在特定主机上调用非天蓝色托管的REST / SOAP服务,并且Web请求要么立即成功,要么在21/42秒后超时。
我已加载测试请求,请求超时的百分位数在20到80之间
超时的一个特别值得注意的特性是它们在21或42秒之后发生(这是严重的,没有提到搭便车的银河系指南)。
从网络应用程序调用不同的服务工作得很好,暂时至少
我们已经检查了非天蓝服务的防火墙,如果发生超时,则没有一个数据包到达主机。
这个问题在过去的一年前曾经发生过一次,支持部门无法确定原因是什么,直到问题在第一次发生后大约两个星期突然消失,因此机票已经关闭,因为它已经固定,但现在已经关闭了。 / p>
代码正在使用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/”(testserver位于具有不同IP的所有数据中心)。
API身份验证通过查询传递令牌,但在能够获取令牌之前已经超时
代码缓存IApi
以避免处理HttpClients的TCP饥饿问题(但我从未遇到过端口耗尽)。
重新启动应用程序无法解决问题,此问题仅发生在当前的生产中(但是一年前,当生产中出现此问题时,我们已切换到最初工作的testserver,但在一段时间后,遇到同样的问题)< / p>
编辑:找到一些explanation in the last answer关于那些神奇的21秒来自哪里。
编辑:我发现解决方法的一种方法是设置一个带有代理的azure vm并配置defaultProxy以通过该虚拟机。
答案 0 :(得分:0)
那是TCP重传超时。奇怪的是,你获得了不同的价值观。