如何利用MongoDB打造TOP榜小程序
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~
本文由腾讯云数据库 TencentDB发表于云+社区专栏
今天我分享的主题内容大概是两部分,最主要的还是小游戏和小程序,第一部分就是跟大家分享下我们在现网运营中服务小游戏以及爆款小游戏积累的经验。在现网运维中我们做了一些改动,帮助爆款小游戏能够稳定运行。第二部分我们推出了一套新的解决方案,适合小白开发者,适合初创公司,可以在微信开发小程序的同时,能够使用腾讯云的资源,享受腾讯云的各种服务。
先讲第一部分的内容,刚才邹鹏最后讲的一段的时候,一直有一个图片,那个图片就是各种数据库的排名,可能大家没有注意到,MongoDB的排名其实已经是第五名,再说一下MongoDB为什么适合游戏开发场景。我们知道游戏开发中一个最主要的特点是需求变化非常快的,因为在游戏不同的阶段会加入一些新的元素黏住用户,例如道具,在游戏上线的不同阶段加不同道具,这种用传统的关系型数据库不免对表进行结构修改的DDL的操作,可能有些开发者说不需要,之前做的就是把所有的字段打包成一个字段塞进一个库表就可以了。使用MongoDB不需要改变表结构,对开发者是非常Nice的。另外,大多数游戏会添加社交元素增强用户的活跃度,黏住用户。我们提供了地理位置索引以及配套的API,不需要在业务层做操作,数据库层已经原生支持了。海量数据的支持,我们提供了分片的功能,其实数据最开始,在业务上线最开始阶段,并不知道到底将来是什么样的量级。使用关系型数据库的话,后期避免不了进行分库分表,扩容,MongoDB这边提供了分片集群,可以在不影响业务的同时进行水平的扩容,这个对运维来说是非常好的解决方案。
运营分析,现在是大数据时代,每个业务都会根据数据分析的结果支持运营策略,我们是原生支持MapReduce的,开发者可以直接使用。还有一点非常重要,假如你是小程序开发的话,用JS语言写,存在javascript技术栈MEAN和MERN,MongoDB和Nodejs两者是伴随成长起来的。总之,MongoDB特别适合游戏开发场景。
我想问一下现在在座的有没有用我们腾讯云MongoDB的?或者是有没有用MongoDB的?自建也可以。你们用MongoDB存什么数据?(目前搜集用户行为日志)是自建的吗?(对,本来想用云上,后来发现自建会便宜一点)一主两从还是一主一从?(做副本集,三个部分,没有固定说哪个是主)实例多大?(现在几十G的数据量)你们买的CVM是多大?(500G空间,我们前期使用起来,现在一个方向还不太明确,就是一个试探,我在之前用的都是阿里的比较多,腾讯是今年才开始接触)我大概了解了,所以说我觉得今天能站在这分享,跟这么多用户见面,对我个人来说是非常高兴的一件事,至少我知道大家现在怎么使用以及有没有用,不用我一一拜访了。
小游戏的调用栈,很多开发者都非常清楚,我只需要简单的带过,一般会在前面加负载均衡,然后通过虚拟机搭建服务器,后面连数据库。
我刚才跟大家提了我们其实在现网服务过很多爆款小游戏了,最主要的一个目的就是能够让客户的游戏稳定运行,我们在服务他们的过程中,累积了一些运维经验,做了一些连接参数的调优,帮客户实现实例价值的最大化。
首先跟大家简单分享一下MongoDB的连接模型,分两部分,第一部分是Mongos对客户端的连接,第二是Mongos对后端的连接,第一部分连接采用的是非常古老的方式,叫one-Thread-per-connection,每个连接分配一个线程,每个线程栈1MB内存,1000个连接是1G内存,所以,MongoDB对连接是非常敏感的。对后端连接的模型就是每个Mongos会绑定一个Worker池,假如你有三分片,每个分片是一主两从,那就是9个Mongod,每个worker就会有9个连接。
这里有一个参数,如果这个参数设计的不合理,业务体量比较高的情况下,后面连接池子的线程是不够用的,就会进行频繁的线程调度和切换,因为线程的切换和调度的开销是比较大的,所以运维人员比较关心的就是minConnection这个参数,这个参数我们是单独提出来能够给运维人员直接修改的,这个参数的设置有一个公式,这个公式就是你需要根据,比如当前TPS为1000,每个连接要求处理10毫秒,2个分片,minConnection=1000/2/(1000/10)。则第二个参数也是运维人员比较关心的,第二就是refreshRequirement,就是每个业务会有一个估算的连接峰值,那么refreshRequirement设置要超过5分钟才行。以上是我们对MongoDB连接模型的优化。
第二个我们服务现网很多小游戏时遇到的慢查询问题。很多用户比较了解MongoDB的话,因为是一主两从,就会为了减少主的压力,就设置把读请求打到从,从可以同步数据,也可以接收读请求,主就做接收写请求,这是理想的方案,但是我们服务用户过程中发现这个方案也会带来问题,因为从3.2版本,引擎就默认是WT。WT引擎有一个操作就是从在同步数据的时候会加一个全局锁,这个锁会把所有的读请求都锁住,这样的话慢查询就可能会变多,基于这个问题,我们这边是搞了一个专利,这个专利就是基于快照的读的一种方案,就是当你进行从读的时候,此时让你读快照,同步数据完成之后,所有读请求正常,快照被清掉。最左边的图是另外一个解决方案,这种解决方案就是我们提供了一种只读实例,在主实例上挂只读实例,主实例负责接收读写请求,其他业务模块只需要把所有的连接请求打到只读就可以了。这两种解决方案在一般情况下的优势不是非常明显,但是当你的实例Primary写入压力非常大的情况下,效果是非常明显的。最后面有一张图,蓝色部分是源生的Mongo,红色的部分是我们基于读快照的方式的一个性能,X轴是写入大小,Y轴就是从库读请求的延时,我们发现在源生的Mongo中最大的读延时能达到85毫秒左右。用我们的解决方案的话,在10毫秒左右,非常快。以上是我们第二个优化。
业务最开始上线的时候其实并不知道后期量级能达到多少,假设开发人员在最开始的时候申请比较大的实例的话,其实会被运维挑战的。但是假如用分片集群的话,就会避免这个问题。最开始的时候设置很小的,买一个很小的分片,后面你的业务量大起来之后,再水平扩分片。只需要指定分片的Key,就会把数据分到不同的片里面去,自动做均衡,业务无感知。
库表回档,在游戏运维过程中比较痛苦的一件事就需要回档。确实很痛苦,有时候我感觉有些用户回档过程中非常着急,一旦回档应该是发生了比较严重的事,要回档到之前的时间段。因为程序是避免不了有Bug的,或者游戏在上线过程中有一个Leader手抖,发了很多道具,可能造成很多人民币的损失,这个时候就要进行回档。但是仅仅是某个库表进行回档,不需要整实例回档,针对这种情况,我们支持库表回档,对运维人员是非常nice的功能。
我的第二部分内容就是针对小游戏和小程序的一种解决方案。小程序开发和小游戏开发特别是小游戏会遇到一个问题,使用本地缓存30-40M完全不够,如何把小程序赋能到云,我们提供了方案,不需要到腾讯买CVM、数据库、函数,只需要在小程序开发IDE上点击控制台上的按钮,开发者只需要关注业务逻辑的实现,后端的服务器的运维知识都不需要再去了解。小游戏和小程序的特点就是短平快,快速上线,迭代快法,强占市场,通过一些道具和广告迅速变现,生命周期不长。
我们这个解决方案在服务层有数据库的管理、文件的管理、函数的管理,后面还会加一些日志、触发器的服务,底层服务有腾讯云MongoDB、云函数这一套。也就是说刚才我们在服务现网其他游戏中的运维经验的累计都会应用到这个解决方案里面,所以说大家可以放心使用。
开发过程中会有多个环境,开发环境、测试环境、生产环境,在云上开通这套服务之后我们默认会包含多个环境,环境之间是相互隔离的。
这种方案特别适合个人开发者、初创团队,对于成熟团队需要上一些项目的话,可以立即使用。以下是我们的控台,有三个功能,可以创建集合,我们增加了导入和导出功能,可以把其他地方的数据导到这里面让你的小程序直接运行。第二就是索引,我们把索引功能优先开出来了,默认给_id字段加了索引,用户也可以自己增加单列索引和复合索引。另外,权限管理这里也非常精细。
我今天的分享差不多是这样。更多数据库前沿技术可关注 我们公众号:腾讯云数据库CDB
Q&A:
Q:老师,您好,您刚刚讲的关于监控数据,我想问的是关于小程序会让用户看到日志以及监控数据吗?你们有提供报警机制吗?
A:我觉得你应该是深入思考这件事了,确实是,监控和日志很重要,日志很快会包到解决方案里面,用的是ES。现在监控指标跟MongoDB公有云的数据是一样的。告警我们做了策略,会对关键指标的告警系统进行预值自动设定,自动告警,用户自定义告警在短期内还没有提供。
Q: 您好,老师,今天下午辛苦了。我曾经不太了解MongoDB,我听说MongoDB有一个安全的事件,应该在一年以内,但具体时间不清楚,我想了解一下,比如说云上Mongo的安全的这块,你们是怎么做的?
A:安全有两点,第一点是网络,我们会有在前面加了安全组,这样对访问来源IP进行了第一层过滤,安全组,用户可以自己设置。第二我们加了VPC网络,在自己虚拟机同一个网络类的CVM才能访问我们的Mongo,这样就做了网络隔离。第二方面我们有数据加密,我们现在做的是存储型加密,这个加密功能是用户在购买的时候可以选择的,所以说用我们腾讯云MongoDB的安全是完全可以放心的,但是你自建的话可能就没有这么。
Q:您刚说的VBC,如果自建的话,咱们的网络就是独立的。
A:自建的话,VBC可以做到,但是数据层的加密是做不到的。
此文已由作者授权腾讯云+社区发布,更多原文请点击
搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!
海量技术实践经验,尽在云加社区!
如何利用MongoDB打造TOP榜小程序的更多相关文章
- 利用Bomb打造自己的小程序
小程序开发 Bomb免费后端云开发 首先,小程序的开发已是热门,一个前段技术人员必备的技术就是开发小程序.在这里推荐一个入门小程序文章(连胜出品). 对于小程序的入门开发就不再做详细介绍,这里针对Bm ...
- 利用函数计算构建微信小程序的Server端
10分钟上线 - 利用函数计算构建微信小程序的Server端-博客-云栖社区-阿里云 https://yq.aliyun.com/articles/435430 函数计算 读写 oss import ...
- 《微信小程序项目开发实战:用WePY、mpvue、Taro打造高效的小程序》(笔记1)WePY开发环境的安装
WePY的安装或更新都通过npm进行,全局安装或更新WePY命令行工具,使用以下命令: npm install wepy-cli -g 稍等片刻,成功安装后,即可创建WePY项目. 注意:如果npm安 ...
- 微信小程序项目开发实战:用WePY、mpvue、Taro打造高效的小程序》(笔记4)支持React.js语法的Taro框架
Taro本身实现的情况类似于mpvue,mpvue的未来展望中也包含了支付宝小程序,现在的版本中,也可以使用不同的构建命令来构建出百度小程序的支持,如第10章所示,但是现在Taro先于mpvue实现了 ...
- 打造游戏金融小程序行业测试标准腾讯WeTest携各专家共探品质未来
在获客成本不断上升的时代里,产品品质愈发是互联网应用的决胜标准.随着用户需求更加多样,开发者不仅要深挖应用功能,更需要面向业务所在领域,建立全面.专业的测试架构,掌控开发进度.提高开发效率,才能在互联 ...
- js 利用throw 写的一个小程序
在下边的小程序中比较特殊的是使用isNaN()函数判断一个参数是不是数字, <!DOCTYPE html> <!DOCTYPE html> <html> <h ...
- 利用Python代码编写计算器小程序
import tkinter import tkinter.messagebox import math class JSQ: def __init__(self): #创建主界面 self.root ...
- GitHub Top 微信小程序——在家中憋了几天写点代码吧
GitHub Top 本项目为 GitHub 热点项目微信小程序客户端,首页仅推荐一个热点项目,这个项目往往是社会热门事件所催生的一个项目,如 996.ICU.wuhan2020,所推荐项目标准为:积 ...
- MpVue 致力打造H5与小程序的代码共用
MpVue是什么 基于 Vue.js 的小程序开发框架 从底层支持 Vue.js 语法和构建工具体系. 使用vue开发小程序 修改了 Vue.js 的 runtime 和 compiler 实现,使其 ...
随机推荐
- Python Django(WEB电商项目构建)
(坚持每一天,就是成功) Python Django Web框架,Django是一个开放源代码的Web应用框架,由Python写成.采用了MTV的框架模式,即模型M,模板T和视图V组成. 安装Pyth ...
- Python档案袋( 面向对象 )
类即是一个模型,根据模型建立起不同的对象,对象间拥有共同的一些属性 简单的类: class P: #类变量,所有实例共享变量,推荐使用方法是:类名.类变量名 pvarx="ppvar1&qu ...
- 6种字符串数组的java排序 (String array sort)
注意,本文不是字符串排序,是字符串数组的排序. 方法分别是: 1.低位优先键索引排序 2.高位优先建索引排序 3.Java自带排序(经过调优的归并排序) 4.冒泡排序 5.快速排序 6.三向快速排序 ...
- 4.Git基础-查看提交历史
1.查看提交历史 -- git log 使用 git log 可以查看到所有的提交(commit)历史. 1. $ git log 列出所有commit,最新的commit在最上面.会显示每个提交 ...
- 【Spark篇】---Spark中Transformations转换算子
一.前述 Spark中默认有两大类算子,Transformation(转换算子),懒执行.action算子,立即执行,有一个action算子 ,就有一个job. 通俗些来说由RDD变成RDD就是Tra ...
- jupyter-notebook后home页面空白问题
jupyter-notebook后home页面空白问题 解决方案1 更换默认的浏览器,选择谷歌浏览器,很多360打不开的页面,更换谷歌后都能有效解决,并且确保是最新版本的google浏览器. 解决 ...
- Node.js 中的 stream
什么是 stream Stream 借鉴自 Unix 编程哲学中的 pipe. Unix shell 命令中,管道式的操作 | 将上一个命令的输出作为下一个命令的输入.Node.js stream 中 ...
- 【c#】RabbitMQ学习文档(四)Routing(路由)
(使用Net客户端) 在上一个教程中,我们构建了一个简单的日志系统,我们能够向许多消息接受者广播发送日志消息. 在本教程中,我们将为其添加一项功能 ,这个功能是我们将只订阅消息的一个子集成为可能. 例 ...
- -1-7 java 网络编程基本知识点 计算机网络 TCP/IP协议栈 通信必备 tcp udp
计算机网络 是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来, 在网络操作系统,网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统. 网络编程 ...
- 强大的jupyter,python开发者的福音
jupyter是一种交互式计算和开发环境的笔记,ipython命令行比原生的python命令行更加友好和高效,还可以运行web版的界面,支持多语言,输出图形.音频.视频等功能. 一.安装 pip3 i ...