Azure 中的 websocket 限制故障排除,活动连接

Posted

技术标签:

【中文标题】Azure 中的 websocket 限制故障排除,活动连接【英文标题】:Troubleshooting the websocket limit in Azure, active connections 【发布时间】:2017-12-05 19:59:48 【问题描述】:

我正在对使用 websocket 的应用服务进行故障排除。 它在允许 350 个 websocket 的服务计划 Basic 上运行。 这是该计划中唯一使用 websockets 的应用程序。

问题是大约 20 小时后,我收到 503 条回复,说我达到了 websocket 限制。

现在的设置有 3 个客户端连接到服务。

在我的应用程序中调查 websocket 泄漏的过程中,我想跟踪正在使用的 websocket 数量。

我的应用程序或 Azure 门户中是否有任何地方可以查看活动 websocket 连接的数量?

跟进:

我已将 websocket 连接记录为Amor suggested。 我的应用程序的 HTTP 部分仍在工作,我可以从应用程序获取动态结果,该应用程序现在报告哪些 websocket 连接处于活动状态以及自启动以来已创建了多少。

重启应用服务并配置一个客户端无限重连接后。

在“总的 websocket 连接数”达到 350 之前运行良好。此时我关闭了客户端。

限制应该是 350 个并发连接,但自开始以来总共看起来是 350 个。 这些连接中的大多数(至少 340 个)是由单个客户端发起的,该客户端在开始新的连接之前处理每个连接,一旦达到限制,它就会被关闭。

有人建议我从基本升级到标准,因为标准没有人为限制。我能看到这项工作的唯一原因是基本计划的 websocket 限制存在错误。

更新 2

与此同时,我一直在与 Microsoft 开发人员支持联系,他们注意到 似乎 套接字卡在 IIS 中,而没有卡在 Kestrel 中。原因仍在调查中。

支持人员可以向我显示一段时间内的连接使用图表,清楚地显示如何达到限制。

我会及时更新这个问题,以防我的代码出现错误。

【问题讨论】:

【参考方案1】:

我建议您定义一个变量来计算连接数。如果打开了 Web 套接字连接,只需增加连接数即可。如果 Web 套接字连接已关闭,请减少连接数。以下代码供您参考。

计算 ASP.NET SignalR 的连接数。

public class MyHub : Hub

    private int _connectionCount = 0;

    public override Task OnConnected()
    
        _connectionCount++;
        return base.OnConnected();
    

    public override Task OnReconnected()
    
        _connectionCount++;
        return base.OnReconnected();
    

    public override Task OnDisconnected(bool stopCalled)
    
        _connectionCount--;
        return base.OnDisconnected(stopCalled);
    

统计传统 ASP.NET 中的连接数。

public class WSChatController : ApiController

    private int _connectionCount = 0;

    public HttpResponseMessage Get()
    
        if (HttpContext.Current.IsWebSocketRequest)
        
            HttpContext.Current.AcceptWebSocketRequest(ProcessWSChat);
        
        return new HttpResponseMessage(HttpStatusCode.SwitchingProtocols);
    

    private async Task ProcessWSChat(AspNetWebSocketContext context)
    
        WebSocket socket = context.WebSocket;
        while (true)
        
            ArraySegment<byte> buffer = new ArraySegment<byte>(new byte[1024]);
            WebSocketReceiveResult result = await socket.ReceiveAsync(
                buffer, CancellationToken.None);
            if (socket.State == WebSocketState.Open)
            
                _connectionCount++;
                //Process the request
            
            else
            
                _connectionCount--;
                break;
            
        
    

【讨论】:

我添加了第二个计数器,它只会为每个新的 websocket 增加。结果看起来像是限制了总共 350 个(非并发)websocket 连接。 请检查您是否正确关闭了连接。以下链接供您参考。 How to gracefully close a two-way WebSocket in .Net 嘿,如果我在一个基本托管计划上有多个应用程序服务,它们是否都共享 350 连接限制?

以上是关于Azure 中的 websocket 限制故障排除,活动连接的主要内容,如果未能解决你的问题,请参考以下文章

Rancher 2.0 - 故障排除和修复“控制器管理器不健康问题”

在Azure中重新部署VM

Azure 上的 Websocket 服务器

对 Cron 中的 PM2 重启进行故障排除

诊断 Azure 事件网格中的故障?

有没有办法对 Oracle 中的更改通知进行故障排除?