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 临界资源,对于关键的游戏资源,如金币等,可以同步上发场景信息,这样服务器可以做校验。

posted @ 2016-09-29 23:00  TNT-boom  阅读(155)  评论(0)    收藏  举报