您所在的位置: &
谈谈陌陌争霸在数据库方面踩过的坑(前篇)
谈谈陌陌争霸在数据库方面踩过的坑(前篇)
陌陌争霸是一个手游项目,最开始的目标很明确,将COC其中最核心的部分剥离出来,很快可以做出一个简单的却不同于以往 MMO 的游戏,然后就可以着手在此基础上发展。研发工程师云风将在开发过程中的数据库方面的一些经验和教训分享出来,希望大家喜欢。
这个项目一开始不叫这个名字,它在 2013 年中的时候,还只是一个
用来试水移动游戏的试验项目。
最开始的目标很明确,COC 是打动我的第一款基于移动平台网络游戏,让我看到了和传统 MMO
不同的网络游戏设计方向。我觉得只需要把其中最核心的部分剥离出来,我们很快可以做出一个简单的却不同于以往 MMO
的游戏,然后就可以着手在此基础上发展。
至于后来找到陌陌合作,是个机缘巧合的故事。
我们的试验项目完成,却没想好怎么推给玩家去玩(而这类游戏没有一定的玩家群体基本玩不起来),而陌陌 游戏平台刚上线,仅有的一款产品(类似泡泡龙的游戏)成绩不佳。因为我们公司和陌陌的创始人都曾经在网易工作,非常熟悉。这款游戏也就只花了一个月时间就 在陌陌游戏平台发布了。
一开始我们只把刚完成 启动器项目的阿楠调过来换掉我来做这个项目,我在做完了初期的图形引擎工作后,就把游戏的实现交给了他。我们只打算做客户端,因为只有这部分需要重新积累技术经验;而服务器不会和传统 MMO 有太大的不同。而我们公司已经围绕
这套服务器框架开发有很长一段时间了,随时都可以快速把这个手游项目的服务器快速搭建起来。
到 2013 年夏天,感觉应该开始动手做服务器部分了。晓靖在斗罗大陆的端游项目中积累了不少服务器开发的经验,也是除我之外,对 skynet 最为熟悉的人;如果这个试验项目只配备一个程序来开发服务器的话,没有更好的人选了。
从那个时候起,我们开始考虑服务器的结构,其中也包括了数据库的选型和构架。
skynet 有自己的 IO 模型,如果要足够高效,最好是能用 skynet 提供的 socket 库自己写 DB 的 driver
。因为 redis 的协议最简洁,所以最先我只给 skynet 制作了 redis 的 driver 。而我们代理的游戏狂刃的开发方使用的是
MongoDB ,为了运营方便,我们的平台也使用它做了不少东西,我便制作给 skynet 制作了初步的 mongodb driver
。到服务器开始开发时,我们有了两个选择。
十多年的游戏行业从业经验告诉我,数据库在实时交互性较强的在线游戏中,主要起的是一个数据备份容灾的作用。很少会将其用于数据交换。而在其它领域,很多开发者则选择把数据库作为业务模块间的数据交换,带着这个思路来做游戏,往往会带来很严重的性能问题。
简单说,理论上,由于游戏服务器往往 7 * 24
小时持续工作,且玩家具有强交互性,大部分游戏世界里的数据都一直存在于内存中。当服务器启动后,一旦数据加载完毕,大部分不再需要退出内存。服务器只是 在不断的创造新数据并让这些数据在内存中流通而已,它没有任何需要从外部读取数据。如果内存无限大,且服务器永远不会当机,数据库这个设施没有存在的必要。
当然这两个前提条件都不可能成立。
对于内存无限大这个条件,传统 MMORPG 游戏需要消耗的内存是 O(n) 的,n 和总用户数相关。虽然同时玩游戏的用户数(活跃用户数)有限,很难持续增长;但总用户数的确是随时间增长的。我们只要把 n 从总用户数变成活跃用户数后,基本就能维持内存的需求。
最简单的做法是,当一个用户不活跃后,就把这部分数据落地(写入磁盘),当他有一天又变得活跃后,再从磁盘加载回来。在端游早期,用户活跃的标准就 是他是否在线。我们在用户上线的时候加载他的数据,离线的时候将数据落地即可。从开发角度看,数据如何保存,最简单的方法不是使用数据库,而是以用户
id 为文件名,把用户数据序列化成文本写入文件系统即可。这也就是网易早期游戏的通用做法。
对于服务器稳定性的要求,我们不可能作到 100% 不当机,所以数据还是要定期存盘的。可以是按时间为周期保存,也可以是在关键操作发生时保存。这样在灾难发生的时候可以恢复回来。
btw, 一个系统所需要管理的数据总量小于系统总的内存量这一点,不仅仅在游戏领域,其实很多别的系统也存在。所以 redis 这种纯内存数据库才有了广泛的应用空间。redis 的 BGS***E 以及 BGS***E 的两种模式,也对应了上面所指的数据落地策略。
至于,如何操作这些数据的问题,既然数据都在你系统的内存中,总可以写出对应的算法去处理它们吧?明白了这一点,就能明白为什么在大多数在线游戏系统中,选用怎样的数据库就不是什么重要的问题了。
当然,一个在线游戏的运营还是需要大量的游戏内数据分析的。本着不同的业务逻辑尽量分离的原则,我们还是需要把游戏内的数据输出出来,交给专业的系统,专业的人来处理。这一部分的数据量远大于游戏系统为玩家服务时所需要的量。我认为它的空间复杂度是 O(n * m)
的。其中有两个维度,一是玩家的总数,二是运营的时间。游戏服务器需要把运营过程中的数据吐出,保存到可以处理这么大数据量的数据库中去。我们把这部分数 据称为运营 log ,这个名称我觉得不太合适,因为它容易和程序输出的供调试分析的错误 log
相混淆,不过历史上在网易工作时大家都这么叫,我也不打算起个新名词了。
陌陌争霸在服务器方面的选型和构架按着这个思路做出来:
我们用 redis 保存玩家的数据,考虑到玩家数量可能很多,一个 redis 仓库可能不够,我们使用了 32 个 redis 仓库,按玩家
id 分开存放。在部署方面,可以在用户数量较少的时候,把多个 redis 仓库部署在同一台物理机上,再随着用户规模扩大而分开部署。如果 32
个仓库不够的话,进一步细分也不会是难事。
在前三个月,我们不用太考虑冷热数据的问题,这个期间还谈不上流失玩家,所有玩家数据都是热数据。由于开发时间紧迫,我们把冷数据处理留到后期再处理。
至于数据落地的问题,redis 已有 bgsave 的能力,我们只需要细调就好了。
而运营 log 和一些随时间自然增长的数据,比如战斗录像,我们选择了不受内存限制,且易于做数据分析的 mongodb 。由于担心数据量过大,使用了 mongos 分片。
初期的设计就是这样了,只到今天,也没有在结构上做什么调整。但是在操作过程中踩了许多坑,都是值得好好记录下来的经验。
预告:陌陌游戏平台的第二款游戏:陌陌劲舞团先于陌陌争霸半个月上线。上线后不到两天就宣布停服,停服时间一再延长,一直拖了一周。传言说问题就出在数据库这块。下篇打算八卦一下这个事情。
。51CTO经作者授权转载。
【编辑推荐】
【责任编辑: TEL:(010)】
关于&&的更多文章
MongoDB的转变也正是10gen的转变,Dwight Merriman在一份声明中
中秋已过,圆圆的月亮似乎是一个害羞的姑娘,带上了一
对于设计师来说,扁平化设计是一种实打实的设计风格,
BYOD(Bring Your Own Device)指携带自己的设备办公
本书深刻揭示了Spring的技术内幕,对IoC、AOP、事务管理等根基性的技术进行了深度的挖掘。读者阅读本书后,不但可以熟练使用Spri
Windows Phone专家
Android开发专家
51CTO旗下网站陌陌争霸九本心得 教你过9本毫无压力_魔方网陌陌争霸专区
你正在访问:
陌陌争霸九本心得 教你过9本毫无压力
陌陌争霸九本心得 教你过9本毫无压力!怎么样,是不是因为过九本而压力很大啊,魔方网教你怎么过九本,高手心得教你如何过,怎么样,快来看下吧!
陌陌争霸九本心得 教你过9本毫无压力!怎么样,是不是因为过九本而压力很大啊,魔方网教你怎么过九本,高手心得教你如何过,怎么样,快来看下吧!
以下的技巧属于我在实战中的经验总结,有不少结论还不成熟,权当是我自己做的笔记。近期我已经不再特别关注声望,我会花更多的时间进行各种进攻方式和阵型的尝试,然后不断修改内容,升级本攻略。有错误的地方,请大家指正,我也会不断修改。为了节省解释的笔墨,我尽量假定阅读此内容的读者已经有较为丰富的游戏经验。
假定攻防实力全部满级。
进攻方:24个6星胖子,4-8炸弹人,21-23个5星道士,盟军:6个5星道士,30级鹰眼,30级霸姬,1个5星落雷,1-2个5星补给,1-2个5星鼓舞
防守方:9本满级91级,内墙10级,外墙9-10级,30级鹰眼,30级霸姬,公会守军:6个5星道士
补充说明:这是目前满级的主流的配置。非主流配置包括了神女和英雄的配合,或是加入用于引兵的神射或血鹰,少数情况下还有天灾和少量凤凰。凤凰和天灾的纯空军阵容已经不属于目前的主流。
在双方满级时,进攻方的目标是获得2星,而防守方的目标是只令对方得1星。这是以下所有探讨的根本假设。这就意味着:进攻方必须攻破大营,防守方必须守住大营。
在以进攻方的角度来思考攻破一个阵型并获得2星时,我会着重思考以下几个点的问题,我一个一个分开解释:
1. 阵型的形状
2. 公会与英雄
3. 进攻点和进攻通道
4. 送兵、英雄和丹药的使用
顺便,应一位女神的要求,在这里让我帮她打广告。她的原话大概是说:急需大神庇护。。附照片和公会。
1. 阵型的形状 以目前来看,主流阵型分为两类,矩形阵和网格阵。 根据围墙的块数,不论什么形状的主流阵型,大体分为三层,外墙,中墙和内墙。 矩形阵的优势是空间较大,中墙的通道设置的选择性多,可以做出较好的引导阵型。此阵型的目标就是让进攻方的部队不断被防御建筑引导,困在中墙里被两个***和防守的道士干掉。此阵型的主要弱点有两个:1. 进攻方向比较好选,一般情况下会从两个***不能同时打得方向进攻。
2. 层次过于简单。炸弹人可以很容易贯穿内墙(三层)。操作到位的情况下,第二批的胖子和道士可以直接进入内墙里。 网格阵的优势是进攻点的选择一般不太容易立刻发现,往往选错了进攻方向会输掉比赛,其次炸弹人想要一次洞穿到内墙的可能性不大。一般会被侧面的墙干扰。此阵型的目标就是让进攻方的部队需要破坏更多的墙,浪费更多的时间才能进入到大本营内。
但网格阵型有以下的弱点:
1. 由于分隔的墙使用过多,导致网格型的阵型面积相对较小。最后,大本营可能只被一圈墙围着。这个墙是没有作用的,因为道士是远程攻击,大本营可以轻松打掉,所以防御大本营的墙一定要距大本营有一定的距离。(因此有现在内墙为矩形,而外墙用网格型的阵型)
2. 网格阵不利用引导进攻方的行进。因为胖子在行进时会优先攻击最近的(一定距离内)没有被隔墙的防御建筑,这种倾向在设置阵型时是很有用来引导胖子在中墙内平行移动和绕圈,以及将胖子和道士分开的方法(道士会优先攻击垂直距离较近的建筑物)。但被很多墙分隔后,胖子只会攻击最近的防御建筑,胖子的攻击道路实际上会更加&直线&。 侧面隔墙过多所造成的这个问题较为严重。所以相对而言,我更倾向于矩形阵。矩形阵的一些问题可以用雷电法珠和陷阱来弥补。后面我会来分析。
2. 公会与英雄 公会越靠内越好。夸张的情况下,有人会将大本营从中央挪开,将公会建筑放在最中央。从而外围无法直接引出。另外,一般会将公会放在两个***的另一侧,这样不让进攻点和引兵点重合。正常情况下,派出一个胖子,即可以将公会的道士全部引出,没有什么难度。
在道士静止后,使用落雷,可以全灭道士。如果没有提前引兵,而在进攻中遇到道士,则需要注意落雷有延迟,并且不一定能全灭。 目前道士防守最大的价值就是迫使对方必须带落雷。如果不带落雷,还有其他的方法引兵。可以带8个神射,一个一个放,可逐步将兵和英雄引导外围的拐角。但是这样的打法并不是好。不推荐使用。
就算引出来了道士,也基本上是1:1的伤亡比例才能灭掉道士,损失太大。 关于防守英雄,是否需要单独引出灭掉,再发动进攻呢? 在天灾和凤凰组合的攻击方式中,我习惯先引英雄。再放凤凰瞬秒英雄。这样是因为凤凰本来就用需要先放出来吸引***和烟火筒的火力,再释放天灾的,并且凤凰和天灾基本不需要考虑墙的问题。但是在胖子和道士组合的进攻方式中,最重要的要点是让胖子、道士和英雄进入内墙。
所以我不建议为了秒杀英雄而提前将过多的胖子道士和英雄提前放出来,这会让进攻的士兵走很多的弯路,并且浪费英雄。第一个进攻点的选择,我认为非常重要。所以,对于防守的英雄,我认为基本可以不必太在意。完全可以再发动进攻后再次灭掉。因为英雄的移动速度较快,只要再进攻时注意不要一次放完所有的兵即可,即使满级的英雄在战斗中很容易被干掉。
游戏类型:策略游戏运营商:广州简悦信息科技游戏版本:1.0.3
陌陌争霸魔方助手
我们精心制作为广大玩家们准备的魔方攻略for是为陌陌争霸量身定制的全攻略。
集合有游戏攻略,游戏资讯多种内容可随时随地方便查阅。
手握魔方攻略助手,争霸天下!
魔方游戏宝
跨服交友 实时语音边玩边聊
定制工具 PK辅助解放双手
独家福利 超值礼包元宝道具
已领&1000个
已领&1000个
已领&498个
已领&999个
已领&712个
已领&911个
天龙八部手游
突破经典的飞行射击类精品手机游戏。继承了经典飞机大战简单爽快的操作体验,玩法更多样。这么好玩的游戏,确定不玩吗?----《陌陌争霸》巅峰十本战火重燃----
●400万全球玩家同服爽快抢夺,陌陌社交手游!
●巅峰十本全面升级,新内容不容错过……
●ios游戏榜第二,畅销榜前十,最火爆的战争手游。
●第三季公会战全面打响,谁能登顶荣耀?