我是在腾讯做游戏后台的,从2018年底开始,我们项目从零开始逐渐使用scala,到现在占据半壁江山。怎么做到的呢?简单一句话:找到一个语言最适合的场景去应用它,用好它,用出花来;立住脚后,再慢慢向外围扩展。
最初的应用是什么呢?大数据,spark开发。游戏用户规模庞大,行为也很复杂,我们游戏用户行为日志单日在TB级别。为了更好地了解用户(咳咳,更好地赚钱),我们需要对数据有更深刻的理解。开始我们试过sql,试过pyspark。但sql用于统计还差不多,复杂的机器学习就不用考虑了。pyspark倒是简单,但我们基于trueskill做大规模用户竞技实力划分时非常慢,不得不申请大批量的计算资源。痛定思痛,还是直接选择spark的原生语言吧:Java和scala。两个我们都不懂,一群搞c++的,会Python就不错了。
本来是要选java的,毕竟江湖地位在那里,生态也很完善。但scala调研完毕后,被它超强的语言表现力吸引了:简洁,强大,丰富,特别适合数据流处理。现在回过头来,当时的决断还是有些武断,但阴差阳错也算是缘分吧。
这一开始就一发不可收拾,由于目标非常明确,就是数据处理,其它杂七杂八的特性不考虑。开始就是data frame;看不懂语法,倒逼着学val,var的差异;学fp理念;学trait和类型;学collection。这种方式也许缺少系统性,但效率非常高,成长特别快。三四位同事一起搞,遇到问题相互讨论,相互敲打。结果不到一个月就上线服务了,直接着手交易市场的行为分析和预测。
离线数据处理完之后,我们又想能不能搞个可视化网站,不要每次统计半天结果导出个Excel,然后做图多累。这样产生了新需求:
- 处理结果导出到sql数据库
- 从sql拉数据二次统计,并通过web展示。
web我们也是一窍不通,网上一大堆技术栈都是JAVA,Python。转念想了想不要太多语言了,看看scala行不行。结果还真有,play framework。那就照着官网搞起来,文档理解,Demo搭建,业务逻辑开发,压测,一个月过去了,又搞定了。这次对scala的认识又深了一步:发现了play背后的大靠山akka。对actor编程理念非常着迷,但现实中基本用不到。play已经提供rest服务,还有slick访问数据库,WSClient访问其它网络服务,异步通信全部用future,要actor干啥呢?的确不需要,但机会总是会有的。
2019年中,我们游戏开始搞多前端,语言差异很大,为了解决通信协议问题,选择提供restful接口,那么play framework正好派上用场,从数据可视化真正走上了业务应用。此外数据的处理和应用也越来越广范,和游戏的结合也越来越紧密。那scala的触手也就越来越长,不断挤压原本属于c++的领地。
一个念头冒出来了,scala的应用已经复杂到这种程度了,不搞分布式不行了。那就开始吧。从服务发现到治理,从消息队列到缓存,从离线到实时计算,从数据统计到推荐,全部搞起。这就犯了造轮子的老毛病,无论什么东西不自己捯饬下总感觉不放心。
经过多重调研,对akka和lagom做了深入了解。我们发现lagom封装太深,而akka做为基础库,生态完善可扩展性强,所以充分利用play和akka做了定制化的二次开发。现在,我们自研一套框架和服务,结合腾讯自己的环境实现了:
- 进程框架:含消息序列化,缓存,metrics与日志。
- 基于akka stream的数据采集和处理。
- 基于zookeeper的服务发现与治理。不要问我为啥用zk,问就是c++的历史包袱。
- 异构分布式集群的通信和同步框架。
现在越来越觉得scala强大。之前还担心人才后继不足,结果2019年下半年招了几位新人,不是搞c++就是搞JAVA的,上手很快,现在都是开发主力了。真得赞叹下C++真的是九阳神功,一旦学会就是一通百通。
最后,我的体会是,求精不求多,善于发现机会找到结合点。做透,然后慢慢的就自然向外部扩展了。当然scala杀手锏级别的利器还是建议要抓牢哦。
作者:小虫飞飞