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

984195889 · · 5753 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

问题描述:

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

查问题过程:

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

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

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

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

解决过程:

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

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

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



有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

5753 次点击  
加入收藏 微博
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传