HttpListener 拒绝连接问题

背景:

客户端使用 UnityWebRequest 发送请求,而且,所有消息全部异步发送,没有任何排队,某一时刻,会出现
HTTP/1.1 501 Not Implemented 或则 502。因为客户端业务原因,某些请求,必须返回成功,业务才能继续走下去。

现象:

 某一时刻单个客户端大量消息发送,但是其他客户端通信正常完全不受影响。

分析:

发生时,服务器指标一切正常,显然不是达到服务器处理瓶颈,猜测可能单个客户端是消息过多问题,底层直接返回的错误码,上层没有任何信息

        1.使用 tcpdump 查看 

确实服务器返回 501

        2.查找 官方文档

HTTP status code overview - Internet Information Services | Microsoft Learn

 

IIS 服务器默认,限制 同一 ip 的客户端并发数,发送频率等,如果客户端超过一定限制,就会收到 50X的错误码。 

我们发现 在 ubuntu 上明显,出现问题的次数很少,而在我们的开发环境 window10 上频繁出现,可能winserver 也会好协议,如果有用的欢迎分享。

解决办法:

我们修改了客户端的发送模型,
由原来的 异步并发发送 -> 排队发送

具体实现如下

      1.一个队列接受所有发送请求。

      2.起协程异步发送,从队列获取,一个一个处理,只有前一个处理完,再发送队列的下一个。

      3.如果消息太多可以起多个 协程 抢 队列 中的消息,根据实际的情况,设置协程数。

后期扩展:

由于是短连接,消息丢失很正常,客户端需要支持,消息补发机制 ,保证消息的可靠性,建议,只对重要的消息进行补发,否则可能堆积大量消息(特别是轮训消息)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值