问题描述:
游戏公测,玩家大概有几百个.运行一小段时间,大概是20分钟左右或最多半个小时,服务端就卡住了. 卡住较长时间,之后又会变正常一小会儿
查问题过程:
经过对运行日志的分析,程序执行到给客户端socket写数据的时候会一直卡住,然后报错,具体错误已忘记, 大概是写超时之类的.
百度查询,认为是, 服务端在给一个已经关闭的socket写数据才导致的错误, 而这个"关闭"在服务端其实认为没有关闭的. 是客户端主动发起了close的请求, 但是服务端没有正确处理该请求, 导致服务端一直认为该socket是正常,直到超时.
那么框架设计是这样的: 一个玩家的操作会同步给其它玩家,这时是直接给其它玩家的socket发送数据, 此时如果有一个玩家客户端写超时了, 那么其后所有的玩家都会在等待该异常的写超时. 导致全服都卡住了. 即一个玩家的socket异常导致所有玩家的异常.
问题产生原因: 对socket机制了解应用不够彻底. 框架设计不合理.不能因为一个玩家的异常导致全服卡住.
解决过程:
socket机制问题暂时不处理. 应该是socket异常则直接断开链接, 不进行重连之类的处理.虽然客户体验不够友好.
框架设计为: 如果要给每个玩家发送数据, 那么则由该玩家的socket自行负责数据通信, 因为每个玩家的socket处理都是一个 go程, 如果一个玩家卡住, 那么也只是卡住该玩家,将损失减少到最小.
由此,可以总结出框架设计时. 每个玩家都是只处理自己的问题,如果有影响到其它玩家的数据, 那么也只能是交给所影响的玩家自行处理数据.
有疑问加站长微信联系(非本文作者)