Azure网站上的传出通信中随机21/42秒超时

时间:2018-03-09 10:30:33

标签: azure azure-web-sites

我在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以通过该虚拟机。

1 个答案:

答案 0 :(得分:0)

那是TCP重传超时。奇怪的是,你获得了不同的价值观。