Server在弱网络下的设计
一、背景:
做服务端开发也有一段时间,可是一直没有仔细考虑过怎么处理网络不稳定带来的问题。下面我就参考网上的资料,简单整理下。
二、简述:
由于网络弱,那么肯定经常出现超时重传,频繁断线的问题,严重影响用户体验,那么这种情况如何改善呢?
一般可以在客户端与服务端做处理。
2.1 客户端:
1、可以做网络超时处理,即等待一定时间,时间到了则认为超时;
2、消息重发,如果没有收到回复,则重发消息几次。
3、掉线重连,检测到断网,则悄悄重连。
2.2 服务端:
1、会话保持,即客户端掉线后不马上断开,将会话保持一段时间,以便短时间内重连复用。
2、登录简化:区分是重连还是登录,减少发送消息的数量。
3、负载简化,尽量重连同一个GameServer,从而达到复用会话的目的。
三、优化策略引发的问题
主要是消息重发引起的问题:
1、网络延迟引起的玩家重复操作:
例如玩家想购买一件装备,点击,没有反映,再点击,这时候服务器会收到两次请求。如下乳:

2、网络延迟引起的消息重发
例如玩家请求战斗,该请求超时,玩家又请求,服务器可能收到两个请求,第二个请求肯定会返回失败,如下图:

3、网络断开引起的消息重发,与2一样
4、服务器异常,没有给出回复,与2一样
5、客户端少收了服务器的包,导致数据不一致。
四、解决方式
4.1 服务器引入消息序列号
1、连接上来的时候序列号置0,下行的消息序列号+1
2、连接断开需要将序列号存档,万一客户端连到另外一个GameServer,仍然可以用。
3、对于关键的消息,例如交易等,客户端要同步等待回包。
这样服务器就能检查哪些消息是重发的。即序列号不是当前-1的。
服务器可以缓存部分回复的消息状态,保证重连回复的及时性。
4.1 客户端控制发送的频率。
4.3 服务器要做逻辑判断
4.4 临界资源,对于关键的游戏资源,如金币等,可以同步上发场景信息,这样服务器可以做校验。

浙公网安备 33010602011771号