【转】弱网络下的游戏服务器设计

原文:https://blog.csdn.net/u011686361/article/details/49121205

1、背景

随着手游市场的到来,越来越多的手机游戏通过移动网络和游戏后台通信。移动网络相对传统有线网络存在网速低、不稳定的特点,而且目前是没有技术可以规避这个问题。因此发生在手机游戏上最常见的问题就是网络延迟高、频繁的掉线,为了提升游戏的玩家体验,目前客户端的主要做法有:

(1) 网络超时机制:当网络回包超过一定时间后,客户端不会一直等待,当做超时处理;

(2) 消息重发机制:如果有消息发送,但是一直没有收到回包,会尝试重发几次;

(3) 掉线重连机制:信号不好,网络掉线导致和后台服务失去连接时,客户端会默默的在后台尝试登陆,重新和服务器建立连接。

服务器在这方面也会做一些优化,应对存在的频繁掉线问题:

(1) 会话保持机制:在服务器缓存玩家的会话信息,如果玩家掉线了,不马上清除会话,保留一段时间,以备下次玩家重新登陆可以复用这个会话;

(2) 登陆简化:因为存在频繁的掉线,所有登陆流程要细分,区分完整登陆和断线重连,保证断线重连每次只需要和客户端传递少量的数据,节省流量,提高断线重连的速度;

(3) TGW优化:优化TGW,保证一段时间内,玩家的tcp连接会较高概率的被转发到同一个服务器上,提升重用会话的机率。

以上这些优化可以很好的提升玩家的体验,但是主要是针对网速低、不稳定带来的直接影响做的努力。然而这些机制的使用,也会带来新的问题:客户端的重发机制,可能导致服务器重复的收到同一个包,从而带来一些逻辑上的问题。

2、 问题说明

出现重复发包问题,主要存在下面几种场景:

(2.1) 玩家的误操作:因为延迟较高,客户端给玩家的反馈较慢,玩家以为游戏卡死,可能在客户端重发的点击某个操作,比如:购买商品,服务器收到多个请求,如果没有做特殊处理,就会处理购买同个物品多次,但实际上玩家只想购买一个,给玩家带来损失,体验也不好。


这里写图片描述

(2.2) 网络延时:网络延时太大,客户端发送后,等待回包超时,认为消息没有发送成功,故再次尝试重发同个消息。服务可能已经收到了前一个包,并且处理了。这个时候重发的包过来,就会再处理一次,会导致一些逻辑问题,比如是战斗请求消息,如果重发,后面的消息肯定会处理不成功,那么客户端就可能认为战斗失败。


这里写图片描述

(2.3) 网络异常断开:网络断开,会导致客户端没有收到回包,故而重发,出现和(2)一样的问题.

(2.4) 服务器异常:如果服务器的异常,没有给客户端回报,也会导致和(2)一样的问题。

(2.5) 客户端和服务器数据不一致:客户端可能因为少收了服务器的包,导致数据和服务不一致,致使玩家看到错误的信息做了错误的决定。

3、服务器设计

针对上面存在的问题,我们引入了下面几个机制来解决

(3.1) 基于请求-应答响应模型的消息同步机制

在CS协议中增加序列号机制:

Ø 序列号初始化

服务器在每次玩家登录时初始化全局消息的序列号(默认从0开始),并在登录完成时下发给客户端,断线重连登录序列号不重置

Ø 序列号递增

服务器在收到客户端注册的消息命令字并且携带的序列号合法时,将下行发送的序列号加一

Ø 序列号检查

客户端注册命令字上行消息中的序列号需要跟当前服务器一致,若不一致下发统一的错误码及当前最新的序列号.

Ø 序列号存档

由于断线重连可能登录到不同的Gamesvr,上一个会话的序列号需要存档,并在重连的时候恢复继续计数。

对于一些关键性的消息(如购买、战斗、抽奖等),客户端同步等待服务器回包,客户端在CS协议中填写序列号,服务处理前检查序列号,处理后递增序列号,随回包协议下发给客户端;

通过序列号检查,服务器可以发现那些消息时重发消息(重发消息的序列号不变),能够知道是否已经处理过该消息,并返回序列号过期错误。

为了能更好的给玩家体验,服务可以缓存最近几条回包消息,当客户端重发消息时,根据序列号,确定是否可以直接用缓存包回给客户端,给玩家更好的体验;

(3.2) 客户端消息频率控制

根据不同客户端消息类型控制不同消息发送的频率,可以减少玩家的误操作,也可以减轻服务器的负载;

(3.3) 服务器错误处理机制

对于每一个CS请求,不管服务器是要同步或异步处理,过程中发生的任何异常,都要能够给客户端一个反馈。

这要求在服务设计时,能够有个很好的错误兜底机制,在处理请求的任何一步异常时,都能捕获到错误并处理。服务器同步处理的请求,比较简单,可以马上发现异常;对于异步处理,会涉及到和其它组件服务器的交互,之间的通信机制要加上超时机制。

我们在设计服务时,所有的异步处理逻辑,都统一放到了一个Transaction中,当发现某个异步请求一段时间没返回时,Transaction会自己触发超时,在自己的销毁函数中发现错误,给客户端回报。

(3.4) 临界资源保护

游戏中一些关键性的资源(如钻石、道具),玩家在消耗时,最好可以由客户端带当前的状态信息(如数量),这样服务器可以操作前校验,保证玩家是在看到正确的数据下作的决定。


Golang语言社区
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,634评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,951评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,427评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,770评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,835评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,799评论 1 294
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,768评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,544评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,979评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,271评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,427评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,121评论 5 340
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,756评论 3 324
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,375评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,579评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,410评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,315评论 2 352