博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang服务端, 游戏公测时遇到的socket写超时的问题, 也是游戏框架的设计问题
阅读量:7014 次
发布时间:2019-06-28

本文共 728 字,大约阅读时间需要 2 分钟。

hot3.png

问题描述:

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

查问题过程:

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

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

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

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

解决过程:

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

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

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

转载于:https://my.oschina.net/u/1408729/blog/280458

你可能感兴趣的文章
英语形容“漂亮女孩”知多少
查看>>
GridView 获取当前行的索引值
查看>>
PHPCMS V9二次开发:内容模块PC标签调用详解
查看>>
Virtual-Key Codes
查看>>
Azure China (3) 使用Visual Studio 2013证书发布Cloud Service至Azure China
查看>>
xmapp 404设置
查看>>
SQL Server中, DateTime (日期)型操作的 SQL语法
查看>>
iisweb服务器完美解决方案
查看>>
请教SQL Server登录失败的问题
查看>>
对象和流
查看>>
简单的兼容的login页面
查看>>
jquery之超简单的div显示和隐藏特效demo
查看>>
Oracle:PL/SQL 中如何使用Array
查看>>
[js - 算法可视化] 汉诺塔(Hanoi)演示程序
查看>>
Note:JSON
查看>>
分享.NET 3.0的书籍下载(持续更新中)
查看>>
几道有意思的逻辑分析题
查看>>
apache svn下新建一个项目
查看>>
高效 JavaScript 单元测试(转)
查看>>
[Windows Azure] What is a cloud service?
查看>>