【总结】服务器模式接口设计总结

1. 缓存数据是维护在服务器还是客户端?

以我游为例,因为我游有三个服务器程序,在设计接口的时候有不同的风格。有的喜欢横向扩展接口,有的喜欢纵向扩展接口。我个人之前是为了开发效率和减少客户端理解成本,一般第一时间去找到一个已存在的最接近的功能,然后copy一下整个流程做一下微调。这样的弊端是可能会复制了屎,让屎越来越多。其实设计接口时还是需要细细思考的。

请求-响应模式 和 通知模式

一个具体功能的数据维护无非就是这两种模式,请求-响应模式比较容易理解,客户端基本不做缓存,要的时候就去直接请求,玩家的显示数据由即时渲染。

请求-响应模式一般由以下接口维护(伪代码):

FuncQuery();   // 请求数据
FuncQueryRet();   // 请求数据返回

FuncOpr(eOprType);  // 其他杂项处理逻辑
FuncOprRet(eOprType);  // 其他杂项处理逻辑返回(仅返回结果状态)

客户端每次打开界面都去请求一次,所以避免了初始化数据失败的情况。即便客户端有初始化的需求(比如登录或者从单局返回时,需要所有的任务完成信息来判断主界面上的任务icon上是否要显示红点)也可以让客户端自由选择请求的时机。

当然这样设计的功能缺点也是显而易见的,就是耗流量。通知模式相比之下就相对节流的多。


通知模式一般由以下接口维护(伪代码):

FuncInit();   // 初始化数据通知(array)
FuncUpdateRet();  // 更新返回通知
FuncDelRet();  // 删除返回通知


FuncOpr(eOprType);  // 杂项处理逻辑
FuncNotice(eOprType);  // 文本通知(配合update和del处理)

此类功能数据初始化时,一般需要客户端做锁,表现也就是所谓的进度条,后续更新的时候也只发对单个元素的变更通知。

缺点也很明显:

  1. 如果网络波动导致某个通知未收到时,可能就导致界面元素异常或者逻辑错误。还有一个问题是如果初始化类数据过多会导致加载过慢

2.一般来说加载项越多bug率越高,测试过程中经常打出的pc包使游戏卡在读进度条的情况(致命bug)

  1. 接口数量占用多,一个小功能就需要占至少Init,Update,Delete三个单独的函数(因为一般要带上对应的结构体),到后面如果某两个服务器间总接口数量有限制的话人就傻了。

  2. 服务器实时性强,可以把变化即时反应到相关玩家,但是同时要考虑到的情况会变得很多很多,极容易遗漏情况。

2. 全量加载还是按需加载?

以我游为例,全量加载的数据典型的是军团(相当于帮派、公会),因为数据少,逻辑简单,有玩家请求过来就直写数据库。因为军团但是单独的一个Server所以不太容易引起其他bug,server宕掉了一般军团功能就直接挂掉,所以不太会引起其他问题。因为没有缓存,所以也不会导致数据错乱。反观如果是关系型的数据,按需加载可能一次查询里,会走很多次SQL,然后各种回调,一来请求速度其实会慢(可见的逐步渲染),二来服务器压力也大,但这其实和架构的缓存设计也有一定的关系。

(题外话:梦三国把登录作为缓存按需加载的凭据,登录队列满或者服务重启作为玩家指针移除的依据,我刚开始也觉得很奇怪。因为这样查询离线玩家的时候就没法把结果缓存起来(没有玩家实体没发存),因此msg就直接禁止掉了很多离线查询的东西,比如战绩之类的,这在别的游戏中是很奇怪的事情。在msg之前,我们作为一个普通的游戏玩家,并没有觉得其他玩家在线和离线有什么区别。现在为了服务器减压不让查,离线的玩家就和消失了一样,很膈应。)

实际上大部分的玩家数据都是按需加载的,包括好友关系,这个就需要用到一些缓存的处理方式,我游里对每一个好友实体都有一个引用计数,比如我是全服登录的第一个玩家,那我的好友实体被加载出来以后都有一个+1的引用。当好友不在引用的时候就可以释放掉。所以好友的sql表对应的c++结构可以映射出两张表:一张表示自己,一张表示其他好友,分别用在线引用和计数引用,如果有好友列表显示自己的需求,也可以把自己也放到其他好友里去。

3. 实时推送还是定时查询?

《代码大全》有一段是这么说的,确定你的项目的数据实时性,比如用户不希望看到15秒之外的数据。比如已知好友的信息有且只有打开好友界面时,一个玩家上线了,服务器需不需要实时告诉他的所有好友?(之前发生过这样的事情,因为好友上下线的排序之类的处理逻辑量其实不小。玩家在单局里被推送了好友信息,导致打团的时候有体感的卡顿,后面才定位到)。如果是打开界面再去查询,那玩家保持在界面的时候如何处理更新?这些问题都是一个一个迭代出来的,没有经历过的话很难一次想到这么多。

这是我的个人经历,之前好友可以选择自己头顶上的称号,可以选择显示天梯分,也可以显示自己的装备分,或者自己的熟练度。但是这个功能被测试抓着追责实时性,我改了称号,但是没有实时显示到好友的列表里,必须重新登录才显示。迫于排期和避免麻烦,我还是改成全时段实时通知。现在想来,一个不涉及任何利益的纯展示,且使用频率极低的功能,被用来强行套上实时功能,后悔不已,当时就应该据力争理,说服测试这个没有问题。实际上扁平化的社交实时要求其实没那么高,10s一刷已经足够满足最大多数的要求了,更不用提一些日刷或者周刷的功能。

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