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