【问题标题】:Troubleshooting the websocket limit in Azure, active connectionsAzure 中的 websocket 限制故障排除,活动连接
【发布时间】: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 中。原因仍在调查中。

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

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

【问题讨论】:

    标签: azure websocket asp.net-core azure-web-app-service


    【解决方案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 连接限制?
    猜你喜欢
    • 2012-09-28
    • 1970-01-01
    • 2014-08-19
    • 2014-08-13
    • 2019-07-25
    • 2021-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多