序言

趁着锤子科技宣布要把门票收入捐给 OpenResty 社区建设的大事件的热潮还在。 我也想写写我和 OpenResty 的前世今生。

2012初识 OpenResty,开发第一个游戏项目。 2015结识 OpenResty 社区发起者,并以第3名的好成绩率先加入 Openresty 技术交流 QQ群。

还记得360公司小伙伴在 GoogleGroups 说发起了一本叫 OpenResty最佳实践 的书。https://github.com/moonbingbing/openresty-best-practices 当时我的心情是复杂的,孤独在路上奋斗了3年,突然找了组织,那种心情无以言表。

楼下的让一让,我要开始装逼了!

缘起

想起那还是在2012年,新项目要求必须达到同时在线30W的硬性标准才能立项。 我们当时的技术方案想要达成该目标需要耗费比较高的运营成本,不得以需要寻找新的技术方向。 当时我们团队的技术栈为 golangphp,前者团队转型困难,后者性能和成本超出预计。

开始选型

通过努力我们找到两个待选方案,一个是 Netty,一个是 OpenRestyNetty 由当时的负责 golang 的同学继续做技术储备。 OpenResty 由我继续做技术储备。

在综合考虑公司成员技术栈构成、学习成本、开发效率、执行效率、运营成本后。 最终选定了 OpenResty 为今后的开发主力。

那些年我们趟过的坑

由于大多数同学是从 php 转型,所以第一件事就是大量的写了很多公共库。 如:string,table,time,file

我艹为什么我从 table 取不到数据了,哦因为索引是 int 结果传入了一个 string 的数字啊。

为什么 json.encode 报错啊,因为传入了一个松散结构的数据。

1
2
3
local cjson = require "cjson"
local t = {[10000] = 1,[33333] = 1}
ngx.say(cjson.encode(t))

记得最搞笑的一次,当初用了一个第三方的 mongodb 的库,在存一个 [int]=[int]hash 结构的时候。 假设索引是从1W开始的,他存储在 mongodb 里前面居然有 9999个 nil,你能想像当时我心里1W只艹尼码的心情么? 后来不得以特意在获取数据的底层把所有的索引转为 string 捂脸。

以至于到现在我都不敢轻易直视我们客户端同学的双眼。 因为我无法再像 php 一样很方便 json 给他一个以数字当索引的 object 对象。臣妾真的做不到啊。

我们的使用场景

相比于社区内其他的同学大多奋斗在 CDN 事业上,而我们在 游戏圈 摸爬滚打。 还是在2012年,当时新项目研发过半,我把 OpenResty 安利给我上家公司的领导。 结果由于我们项目难产,公司解散再辗转到现在这家公司,已经是2015年。(创业是条不归路啊!) 老领导所在的公司已经使用 OpenResty 成功上线3款产品了,真是汗颜。

待替换方案

游戏嘛少不了推送,之前也找了不找代替方案。目前在用的是老领导安利给我的 nginx-push-stream-module https://github.com/wandenberg/nginx-push-stream-module

所以我无比期待 nginx_stream_lua_module 的发布到来,那个时候能玩的花样就更多了。