最后更新于 .

一. 前言

2016年6月17日凌晨5点钟,我们完成了服务器端V3版本的重构,切换的过程十分平滑且没有对线上用户产生任何影响。

这也正式标志着,我们的游戏服务器进入了一个全新的阶段。

我们上一次的重构是在 2014年12月23日,现在看看,时间过的真快啊。

而熟悉我的人应该知道,我特意为上一次重构写过一篇《游戏服务器端架构升级之路》,其中详细的讲述了我们游戏服务器从农业时代跨越到工业时代的历程。

而这次V3版本的重构,我将其定义为第二次工业革命。也许它没有那么的强大和完美,但是他切实的解决了现存的大部分问题。

二. 背景

之前的文章已经说过,V2版本的服务器的几个优点:

  1. 支持服务器代码热更新而不影响外网服务
  2. 架构模式足够简单:push-pull

但是,其简单的架构也存在一些缺点:

  1. 业务模块之间容易互相影响

    比如两个游戏玩法 A 和 B,内部使用的逻辑、存储服务器都完全不同,但是在worker层却是共用的。

    所以一旦玩法A的服务器出现问题导致处理变慢,那么worker就会被堵住,而玩法B也会跟着遭殃。

    同时,即时在一个业务模块内,也存在请求处理优先级的问题,比如拉取牌局记录和跟注,要尽量避免跟注这种核心逻辑受到影响。

  2. 限制了游戏逻辑的实现方式

    V2的多worker的模式,导致worker必须限制为无状态的,因为worker可能处理任何一个请求,而一个请求也可能被分配到任何一个worker上。

    这一点是之前解决服务器热重启的关键,但同时也限制了我们代码逻辑多样性的实现。

    比如我们的游戏桌子数据是存储在redis中,所有人对桌子的写操作可能同时分配到多个worker上,而为了避免写冲突,我们不得不通过redis来实现分布式锁 ...

最后更新于 .

一. 部署自己的git服务器

之前一直是在用bitbucket来做代码托管,因为它的服务器在国外,所以客户端提交大文件的时候慢的跟蜗牛一样。而我们服务器是直接使用tag来进行部署,有时候代码拉不下来也非常痛苦。

正好这次bitbucket提示我们客户端代码已经超过1G,一旦超过2G就无法再push新代码,所以就狠心自己来搭建了。

代码肯定是用的gitlab,版本是7.9。一开始用的7.8,好像对中文支持有bug,后来又升级的。
8.x系列好像部署起来更简单些,也尝试了一下,感觉太傻瓜了导致各种配置路径都不知道在哪,所以还是决定使用7.9。

因为git本身的特性,迁移代码也没费多少力气。

小伙伴们用了新的git服务器之后,普遍反馈速度快的都不习惯了,哈哈。

其实之所以把这件事情单独拿出来说,是因为我觉得这个事情是有着超过其本身的意义的。
那就是:公司已经成长到可以投入一些成本到一些原本第三方能够解决的服务上了。

这其实是一个很大的进步,当公司处于生死边缘挣扎时,是不会去理会这种事情的。

同样的,我们的统计服务也越来越完善,而之前常用的友盟基本已经抛弃不看了。

二. 支持IPv6

我昨天在朋友圈发了个状态:

苹果说:要有光,于是世界有了光。

说实话,也只有苹果敢这么强势了。说是6月1号之后必须支持IPv6,我们版本6月2号就因为这个原因被打回。

而因为我们的网络底层是直接操作的原生socket,所以没法直接使用ios提供的封装库。不过这个最后还好,https://tools.ietf.org ...

最后更新于 .

之前在文章里面有提到过,很多事情,并没有绝对的对错,只是度的问题。而度的衡量又取决于时、势二字。所以当形势逼人的时候,基本就是这件事情非做不可的时候了。

先说下背景,公司的服务器一直用的阿里云,包括mysql、redis也都是买了ECS自己搭建的。这里面有几个原因:

  1. 创业的时候,阿里云只提供mysql的存储,redis的存储还没提供。
  2. 没钱,即时现在去看redis的存储价格也是贵的吓人。

这样自己来搞存储有好处也有坏处。 好处:

  1. 完全可控,比如连接数限制,内存限制,存储限制。还有数据备份的灵活性等等。
  2. 强迫团队服务器研发要有存储运维能力。
  3. 省钱

坏处:

  1. 冷备、热备方案不完善。
  2. 存储运维的成本较高,需要长时间积累。

ok,问题就是这样,接下来再来说一下我们之前的冷备和热备方案。 可以说极其简陋:

  1. mysql、redis每天10点冷备,备份到本地磁盘和阿里云OSS
  2. redis使用rdb落地,每60秒至少有1次写就会触发落地。

这样做的问题其实挺多的,主要几个:

  1. mysql dump的时候会导致游戏卡顿,即使加了 --single-transaction 参数 也仅仅是缓解
  2. 冷备频率过低,真出现问题数据已经太久
  3. 没有热备,风险较大

针对这些问题,我们先做了mysql备份的优化 ...

最后更新于 .

前段时间招聘服务器端研发,面到了一个人,忽然感想挺多,所以就写在这里。

这个同学怎么说呢?他自己可能感觉自己很有想法,很与众不同。
举几个例子:
比如,觉得他所在公司的一个框架的版本太低,官网都更新到v13了,他们还在用v7。想要推动公司内升级,他们技术老大又不肯。所以他觉得公司没有创新精神,死气沉沉。
又比如,研究过redis、mongodb或者其他一些开源框架,就觉得想要应用到公司内部来。但是推了半天又推不动。所以又开始觉得公司不够开放。
又比如,炫耀自己喜欢逛github、stackoverflow,还用rabbitmq写了一个分布式消息处理框架,但是问到承载量,性能瓶颈等等,又完全回答不上来。
又比如,我问了几个网络编程的细节问题,比如 epoll的水平和边缘触发、TIME_WAIT的原因与处理,结果一问三不知。

类似种种。

我之所以拿这个事情,单独写一篇文章来讨论,就是因为我知道,有一批人,一定会走到这个阶段。
因为现在的他,就是当年在腾讯时的自己。

当年的自己也是学了点python,用django写了个网站,逛了github,结果就像发现了新大陆一般,觉得自己牛逼了,别的同学都太out了,连python脚本都不会用,看,同样的功能,用python开发速度比c++快十倍!

所以当时公司很多的工具我都尝试用python来写 ...

最后更新于 .

其实一直想着写一篇2015年的总结,结果从过年回来就一直忙忙忙,拖到了现在。
本来今晚还想着继续做代码优化,突然听到外面下起雨来,就想着不如趁着今晚把文章给写了吧。

之于公司

15年对我、我的合伙人、乃至我们整个团队来说,都是充满意义的一年。

我记得在很久之前,别人是这样给我形容一家公司从不赚钱到赚钱的过程:

就是突然有一天,你看了看报表,发现,咦,我们盈利啦?!

而这一天,发生在了我们身上的时候,是2015年的10月的某一天。

那是我们奋斗近两年来,第一次看到曙光。

虽然其实盈亏也仅仅是基本打平,但是15年底,我们把我们能动用的所有钱,都拿出来给员工发了年终奖。

我和我的合伙人们,极其的感激这些在最困难的时候陪着我们,并且愿意跟我们一起继续走下去的战友们。

而同时,我也十分的想要告诉那些曾经因为各种原因离开了我们团队的人,感谢你们,让我们坚强并成长。

我最开心的是,技术团队目前还没有一个人在年后提出辞职,我也希望这些优秀的同学们能够一直陪着公司一起走下去。

2016年,已经过去了3个月了。
新的一年,我们得比以前更快!更拼!
2016,继续加油!!!

之于个人

15年对于我个人最大的喜事,应该就是媳妇怀孕啦! 今天3月9日,马上就到预产期了,现在还有点忐忑自己会不会是一个好爸爸,哈哈。

其实我始终相信,肚子里的宝宝是个贵子,公司运营状况的好转,很大部分功劳都归功于他啦 ...

最后更新于 .

其实打算做游戏内热更新也是几个月之前的事情了,在方案经历了数次变迁之后,最近才终于应用到了外网的bugfix中。
但是就目前数据来看,热更新由于要下载资源,会使新用户的进入门槛变高,所以留存收到了一定影响,基本降低了10个点。
当然,也可能是热更新的功能存在bug。

好了,我们还是进入正题吧!

方案一

最早的时候,我们想用一种类似打patch的方式来更新。
即将lua代码和资源打成一个zip包,而每个zip包只要代码或者资源发生变化,都会有一个自增的小版本号(大版本号为打在apk或者ipa里的版本号)。
不同的zip包之间diff就可以生成一个patch文件,而为了开发的简单,这个patch列表只会将文件路径列出来,之后客户端要去完整的下载新的文件覆盖。

然而这个方案有很多的问题。

  1. 小版本号不好维护 因为代码和资源会不停的修改,而如果人工来维护小版本号,会极其复杂。如果通过机器来维护也是个很麻烦的工程

  2. patch包太多 如果我们将小版本号的patch包先生成好放到服务器上,那么如果我们有100个小版本,就会有非常多 1->100, 2->100, 3->100 ... 这种格式的patch包。 并且如果小版本号继续增长,patch包的增长基本会失控。

  3. 消耗大量流量,速度缓慢 也许有同学会说,不如只有 1->2, 2->3, 3->4 这样的单个小版本之间的升级patch,客户端自己挨个下载就好。

    但是这样客户端如果是个很小的版本号,就不会不停的重复下载,导致迟迟进入不了游戏,并且流量也大量消耗。

综上所述,方案一有太多的弊端。
这也是为什么我们做完了之后迟迟不敢上线的原因 ...

最后更新于 .

一. 发现问题

最近新版本上线,公司内部的几台iphone测试机测试都一切正常,但是外网用户却频频反馈崩溃。

在友盟上看了错误率统计,曲线如下:

可以看出,错误率确实有了很大的上浮。基本可以确认一定是出问题了。

二. 还原崩溃现场

我们游戏用得cocos2dx-lua,既然是崩溃,那就一定是到了c++端了,我们点击友盟上数量最多的那个看一下:

到了这里,遇到了第一个难点,因为按照友盟文档,使用他的错误dump工具是无效的,一旦看不到具体的错误内容,基本就无法继续了。

(而因为这个问题,发现有人推荐bugly,打算在下一个版本里面试用一下,再给大家反馈)

既然友盟提供的工具不行,我们就得像别的办法,起码现在错误的原始内容是有了,只是要想办法还原出来而已。

仔细研究了一下,友盟其实也是使用了mac原本就提供的工具来做了二次封装,那不如直接用原生的工具了。

具体方法如下:

  1. 找到当时出包得那个archive文件,显示包文件,在其中找到如下两个文件放到同一目录:

    xxx.app
    xxx.app.dSYM

    其中 xxx.app.dSYM 即为符号表文件。

  2. 查看其对应的UUID,一定要与crash log的UUID一致

    $ dwarfdump --uuid xxx.app ...

最后更新于 .

发现我这博客虽然叫vimer,但是已经很久没写vim相关的文章了,甚至连技术相关的文章都写的少了。

我自己也分析过原因,竟然是和鲁迅弃一从文的原因是一样的。

这世上的技术千千万万,且每天都在发展变化,在我这小小的博客上根本不可能覆盖到多少。

而要把我所知道的技术重点都记录下来,感觉又要花掉无数的时间。

所以索性就多谈谈思想,创业上面的吧,不一定对,但是可以参考。

这次之所以在国庆这个本应出游欢庆的日子写文章,是因为自己实在没事干啊。

当然了,出不去也是开心着的,媳妇怀孕刚满三月,不宜到处活动,所以老老实实陪在家里啦。而我那朋友们,一队朋友去了西藏修行,一队朋友去了云南休闲。

好了,还是赶紧切入正题吧。

我这次想聊的是人际关系。

其实之前,我一直有个问题想不明白:为什么,有的人对人际关系看得特别的淡?

之前在腾讯工作的时候,周围都是长期相处的同事。因为长久,因为认识的人就那么多,所以每一段人际关系都显得弥足珍贵。

然而,当我开始开始创业,开始在1年内入职离职十几甚至几十个人,甚至到最后以前离职的人我都记不住他们的名字。

我才发现,我已经没有那么多精力顾及到每个人了。

其实不是别人把人际关系看得淡,而只是对你看得淡而已。

所以说到底,还是得努力提高自己的可利用价值,起码让对方愿意花点精力在你身上,才有进一步发展的可能。

最后更新于 .

之前有句很火的话:

梦想还是要有的,万一实现了呢?

听起来梦想确实是一件很重要的事,对啊,万一中头奖实现了呢?

然而我想说的是:

梦想,一文不值。

其实,之前也一直有类似的想法,只是一直没有想到合适的话总结出来。

正好今晚和媳妇没事看一起看了《我是路人甲》这部电影,思路也有渐渐清晰了一点。

在这部电影里,几乎所有人都有梦想,然而正因为所有人都有梦想,所以梦想才变成了一个极其廉价,一文不值的东西。

老人会告诉你,年轻人,一定要有梦想。

于是这个年轻人就如醍醐灌顶般拥有了梦想,之后就要出任CEO,迎娶白富美,走向人生巅峰了?

听起来就好像,上帝说要有光,这个世界便有了光一样简单?

然而这显然是没用的,我们从小就知道:

太容易拥有的东西,每个人都可以轻易拥有的东西,基本都是不值钱的。

而那些集中在少数人手里的,才真正有价值,比如财富,比如真爱,比如自由。

正因为梦想的来的轻易,所以,我才说它廉价。

而更进一步,我想说。

不只是梦想没有价值,为梦想而奋斗这件事同样没有价值。

大部分人,听一趟励志课,看几篇心灵鸡汤,都足以刺激他去为自己的梦想奋斗个几天,几周,或者长一点,几个月 ...

最后更新于 .

《创业这件小事》这个系列也是很久没写了,一是确实没有时间,二是如果不是真正的干货,写出来也没什么意思。

我刚特意去看了一下《创业这件小事(六)》的写作时间,1月26日。

而在这7个月里,确实自己很多的东西都已经改变了。

一. 管理风格

其实在整个创业过程中,我一直在摸索,自己的管理风格到底应该是偏向“严”还是偏向“慈”。

过去我一直把握不准,所以很多事情上也能看得出来。

比如基本不辞人,都是员工炒老板鱿鱼。

比如有时候却会在晨会上责骂人。

很纠结,很矛盾。

只是渐渐的,在经历过这么多的人和事之后,我开始反思自己这种情况的原因。

而结论就是:

我太在乎小弟们说我是个好老板,还是差老板了。

只是最近,我终于想明白了:

我根本不需要你喜欢我。

我需要我的合作方喜欢我,我需要我的投资方喜欢我,可我为什么需要一个我给发着工资的人喜欢我?

想想当年没创业的时候,都以为创业是古惑仔混黑社会,讲兄弟义气。

但实际上是,有钱赚的时候别人才跟你讲兄弟情义;辛苦的时候别人只会催你每月要发的薪水。

 

所以事情就变得特别简单了:

我想在晨会上拍桌子,那是我乐意。

我想跟大家吃饭唱K,那也是我乐意。

我不需要跟你解释什么,你愿意跟着干,苦点累点,我可以承诺万一公司成了,绝不会少你的。

但是你要是不愿意干,我也不留 ...