golang服务端, 游戏公测时遇到的socket写超时的问题, 也是游戏框架的设计问题

问题描述:

游戏公测,玩家大概有几百个.运行一小段时间,大概是20分钟左右或最多半个小时,服务端就卡住了. 卡住较长时间,之后又会变正常一小会儿

查问题过程:

经过对运行日志的分析,程序执行到给客户端socket写数据的时候会一直卡住,然后报错,具体错误已忘记, 大概是写超时之类的.

百度查询,认为是, 服务端在给一个已经关闭的socket写数据才导致的错误, 而这个"关闭"在服务端其实认为没有关闭的. 是客户端主动发起了close的请求, 但是服务端没有正确处理该请求, 导致服务端一直认为该socket是正常,直到超时.

那么框架设计是这样的: 一个玩家的操作会同步给其它玩家,这时是直接给其它玩家的socket发送数据, 此时如果有一个玩家客户端写超时了, 那么其后所有的玩家都会在等待该异常的写超时. 导致全服都卡住了. 即一个玩家的socket异常导致所有玩家的异常.

问题产生原因: 对socket机制了解应用不够彻底. 框架设计不合理.不能因为一个玩家的异常导致全服卡住.

解决过程:

socket机制问题暂时不处理. 应该是socket异常则直接断开链接, 不进行重连之类的处理.虽然客户体验不够友好.

框架设计为: 如果要给每个玩家发送数据, 那么则由该玩家的socket自行负责数据通信, 因为每个玩家的socket处理都是一个 go程, 如果一个玩家卡住, 那么也只是卡住该玩家,将损失减少到最小.

由此,可以总结出框架设计时. 每个玩家都是只处理自己的问题,如果有影响到其它玩家的数据, 那么也只能是交给所影响的玩家自行处理数据.


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。