背景:
客户端使用 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.如果消息太多可以起多个 协程 抢 队列 中的消息,根据实际的情况,设置协程数。
后期扩展:
由于是短连接,消息丢失很正常,客户端需要支持,消息补发机制 ,保证消息的可靠性,建议,只对重要的消息进行补发,否则可能堆积大量消息(特别是轮训消息)