前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >转--golang服务端, 游戏公测时遇到的socket写超时的问题, 也是游戏框架的设计问题

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

作者头像
李海彬
发布2018-03-20 16:23:13
9240
发布2018-03-20 16:23:13
举报
文章被收录于专栏:Golang语言社区

问题描述:

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

查问题过程:

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

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

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

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

解决过程:

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

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

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2016-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档