微信小游戏流水过亿的技术揭秘 腾讯云数据库MongoDB攻略篇

2018-08-22 20:44:51 浏览数 (2)

随着微信小游戏的爆发,越来越多开发者关注到MongoDB与小游戏业务的契合度。

腾讯云已为多个爆款微信小游戏提供服务,腾讯云数据库团队在多年MongoDB运营&支持微信小游戏服务经验总结,MongoDB产品经理李晓慧在7月26日在厦门举行的《腾讯云GAME-TECH游戏开发者技术沙龙》上,为广大开发者分享了腾讯云MongoDB在小游戏中的实践应用,帮助刚刚走进小游戏开发的同学们提供干货。

以下为分享内容要点:

一、为什么在小游戏开发场景下,使用MongoDB是比较合适的?

1.需求灵活多变:

如果使用Schema的数据库,那么每次需求变动都可能需要开发者去改数据库。带来得开发成本极大。

使用MongoDB这种no Schema的数据库可以在需求变动时不用更改数据结构,可以灵活增减字段,节约成本并提高效率。

2.附近的玩家:小游戏之所以爆发,很大一个因素是借助微信自带的社交元素,通过调用微信的API推荐好友ID和获取附近的玩家。

MongoDB原生支持GEO地理位置信息存储,同时还提供GeoSearch和GeoNear等API,可以获取用户附近玩家信息,用户可以方便通过API拉取好友ID和获取附近的玩家,使用起来非常方便。

3.海量数据支持&动态不停服升级:

很多开发者在小游戏上线前无法预测数据量,所以最初开始配数据库时都是标配,使用腾讯云数据库的MongoDB的分片集群,可以横向和纵向扩容,能够在不影响服务的前提下,把数据库扩展到很大。

4.运营数据分析支持:

MongoDB原生MapReduce功能,运营分析系统可以直接连过来使用数据进行分析,无论是用户登录数据还是行为数据轻松搞定。

5.nodejs完美支持:

6.nodejs和MongoDB是一起配合成长起来的。在小游戏的开发场景下,一般后面会有一个分布式的gameservice,前面配一个负载均衡,最后配多个MongoDB数据库。

二、腾讯云数据库MongoDB是如何助力TOP3的两款小游戏的?

在17年12月底到18年1月初,随着撒币答题直播兴起的同时,一款小游戏在微信好友圈高速发展,一跃成为TOP3的微信小程序。与此同时,因业务扩张太快,带来的操作响应慢确实让用户抓狂不已。腾讯云MongoDB团队在接收到客户的反馈后,迅速做出响应,通过优化MongoDB连接和创建读快照减少慢查询等操作,消除了小游戏卡顿的现象,助力客户拥有了上亿用户口碑的小游戏。因为靠着腾讯云产品过硬的功能和性能,以及优质的服务,腾讯云数据库MongoDB也为客户的另一款现象级微信小游戏带来峰值日活2kw且流水上亿 。腾讯云数据库MongoDB为微信小游戏提供:

1、 优化MongoDB的连接模型,支持更多的长连接。

由于原生MongoDB的后端连接模型分两部分,第一部分是Mongos对客户端的连接,第二部分是MongoS对Mongod的连接。对客户端的连接,采用的是one-thread-pear-connection,也就是每一个客户端连接打过来的时候,都会去建一个线程,每一个线程都会占用1MB的内存,所以当连接非常多的话,实例就会变得很卡。在后端建立连接的时候,是采用一个线程池的结构。每一个线程池,负责处理一个客户端的连接,然后每一个Worker里面又有N个线程池,每一个线程池又负责每一个Mongod连接。

腾讯云数据库MongoDB针对连接进行优化,优化后较原生的MongoDB可以多支持20%的长连接,让微信小游戏使用起来更顺畅,此优化让客户对腾讯云好感和信任度倍增。

  1. 读写分离,提高QPS,减少慢查询

一般原生MongoDB一主多从,如果不做任何操作,它会把所有的读写请求都打到primary上面,那么流量峰值来了,数据库主的写压力会非常大。客户就这个问题做了一个改善,把读引到了从上面,本以为这样会对主写的压力变小,然而却发生了游戏卡顿的现象。针对卡顿,腾讯云数据库MongoDB团队通过排查,发现当MongoDB主写压力非常大的情况下,从同步数据的压力也很大,此时MongoDB为了不让业务读到脏数据做了一个全局锁,导致业务的读操作就会被锁住,从而导致慢查询增多引起了小游戏卡顿。

腾讯云数据库MongoDB提供优化,从在回放Oplog的过程中,立即创建一个快照,所有的读都是读快照,不会被锁住。这个方案对效果优化是非常明显的。慢查询几乎没有,同时QPS是原来的2倍。这个优化目前已经申请专利。

腾讯云数据库MongoDB同时在只读实例上又做了优化方案:提供只读实例,此时只读实例会从主实例去同步数据,所有的读都打到只读实例上去。实际实现效果和读快照的方案性能差不多,此方案也在其他的小游戏大放异彩。

  1. 提供分片集群,业务量暴增时可灵活扩展

一款小游戏在未上线时候可能根本无法预估数据量,如果申请非常大的数据库会受到运维同事的挑战,但是如果后来量爆起来了,数据库扛不住压力时再进行扩容是非常麻烦的。为了更好的支持这种业务场景,腾讯云数据库MongoDB提供分片集群,在量还不会爆很多的时候,进行纵向扩容就可以满足需求。对于像客户爆款游戏,可以提供横向扩容,这时候使用分片集群,对线上业务几乎是无感知的。

  1. 提供库表回档,细粒度快速处理错误。

通常在业界MongoDB仅提供实例级别的回档,不管因为什么原因需要回档,客户均要通过整实例回档实现。作为目前国内提供MongoDB服务云厂商当中,唯一提供提供库表回档的腾讯云数据库MongoDB,为客户提供更细粒度回档服务。举个例子,例如有一天游戏的某个模块上线之后,发现有用户在刷钱,分析发现因为一个Bug引起的,此时如果直接强制性把用户的钱收回来,是非常不合理的,所以此时仅需要把这个bug引起的库表进行回档就可以。

  1. 提供表级监控,更精准、更细粒度监控业务健康度。

腾讯云数据库MongoDB是国内唯一提供表级监控的云厂商。业界大部分数据库仅提供实例级别的监控,监控实例的各种CRUD的操作,慢查询,延时,聚合操作。而多数微信小游戏在起步之初,通常是将多个小游戏的数据写在同一个实例里面,通过不同的库标管理不同的小游戏,此时表级监控相比实例监控对客户更有用和有效。

  1. 时序数据库CTSDB的应用

存储业务的日志和监控数据,客户使用腾讯云时序数据库产品方便存储业务的日志和监控数据。同时,时序数据库已经在烟草和电力行业实现规模部署。腾讯云数据库提供一系列的界面和日志采集工具方便大家使用。想详细了解这款数据库产品可以访问:https://cloud.tencent.com/product/ctsdb

最后,作为小游戏的开发者,如果你在数据库操作使用上有任何困难和疑问,不妨尝试一下腾讯云数据库产品和团队的服务,让我们携手共同为游戏客户提供更优质体验的娱乐产品服务。

访问以下链接或扫描下方二维码马上体验腾讯云MongoDB

https://cloud.tencent.com/product/mongodb

访问以下链接或扫描下方二维码马上体验更多腾讯云数据库产品

https://cloud.tencent.com/solution/database


0 人点赞