欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由腾讯云数据库 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可以做到,但是数据层的加密是做不到的。

相关阅读
【每日课程推荐】机器学习实战!快速入门在线广告业务及CTR相应知识

此文已由作者授权腾讯云+社区发布,更多原文请点击

搜索关注公众号「云加社区」,第一时间获取技术干货,关注后回复1024 送你一份技术课程大礼包!

海量技术实践经验,尽在云加社区

如何利用MongoDB打造TOP榜小程序的更多相关文章

  1. 利用Bomb打造自己的小程序

    小程序开发 Bomb免费后端云开发 首先,小程序的开发已是热门,一个前段技术人员必备的技术就是开发小程序.在这里推荐一个入门小程序文章(连胜出品). 对于小程序的入门开发就不再做详细介绍,这里针对Bm ...

  2. 利用函数计算构建微信小程序的Server端

    10分钟上线 - 利用函数计算构建微信小程序的Server端-博客-云栖社区-阿里云 https://yq.aliyun.com/articles/435430 函数计算  读写 oss import ...

  3. 《微信小程序项目开发实战:用WePY、mpvue、Taro打造高效的小程序》(笔记1)WePY开发环境的安装

    WePY的安装或更新都通过npm进行,全局安装或更新WePY命令行工具,使用以下命令: npm install wepy-cli -g 稍等片刻,成功安装后,即可创建WePY项目. 注意:如果npm安 ...

  4. 微信小程序项目开发实战:用WePY、mpvue、Taro打造高效的小程序》(笔记4)支持React.js语法的Taro框架

    Taro本身实现的情况类似于mpvue,mpvue的未来展望中也包含了支付宝小程序,现在的版本中,也可以使用不同的构建命令来构建出百度小程序的支持,如第10章所示,但是现在Taro先于mpvue实现了 ...

  5. 打造游戏金融小程序行业测试标准腾讯WeTest携各专家共探品质未来

    在获客成本不断上升的时代里,产品品质愈发是互联网应用的决胜标准.随着用户需求更加多样,开发者不仅要深挖应用功能,更需要面向业务所在领域,建立全面.专业的测试架构,掌控开发进度.提高开发效率,才能在互联 ...

  6. js 利用throw 写的一个小程序

    在下边的小程序中比较特殊的是使用isNaN()函数判断一个参数是不是数字, <!DOCTYPE html> <!DOCTYPE html> <html> <h ...

  7. 利用Python代码编写计算器小程序

    import tkinter import tkinter.messagebox import math class JSQ: def __init__(self): #创建主界面 self.root ...

  8. GitHub Top 微信小程序——在家中憋了几天写点代码吧

    GitHub Top 本项目为 GitHub 热点项目微信小程序客户端,首页仅推荐一个热点项目,这个项目往往是社会热门事件所催生的一个项目,如 996.ICU.wuhan2020,所推荐项目标准为:积 ...

  9. MpVue 致力打造H5与小程序的代码共用

    MpVue是什么 基于 Vue.js 的小程序开发框架 从底层支持 Vue.js 语法和构建工具体系. 使用vue开发小程序 修改了 Vue.js 的 runtime 和 compiler 实现,使其 ...

随机推荐

  1. Python档案袋(线程 )

    Python的进程和线程是使用的操作系统的原生线程和进程,其是去调用操作系统的相应接口实现 进程:之间不可直接共享数据,是资源的集合,进程必须有一个线程 线程:基于进程,之间可直接共享数据,可执行,只 ...

  2. Java核心技术及面试指南:视频列表

    如下是本书相关内容的视频列表,会动态更新 第一章 1 视频1.1  JDK和JRE和JVM的区别,安装Java开发环境    1.1.1  第2页 2 视频1.2  编写第一个HelloWorld程序 ...

  3. 【java设计模式】(3)---代理模式(案例解析)

    设计模式之代理模式 一.概述 1.什么是代理模式? 解释第一遍:代理模式主要由三个元素共同构成: 1)一个接口,接口中的方法是要真正去实现的. 2)被代理类,实现上述接口,这是真正去执行接口中方法的类 ...

  4. AspNetCore 使用NLog日志,NLog是基于.NET平台开的类库!(又一神器)

    NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码. NLog是一个简单灵活的.NET日志记录类库.通过使用NLog,我们可以在任何一种.NET语言中 ...

  5. AngularJS2+调用原有的js脚本(AngularJS脚本跟本地原有脚本之间的关系)

    昨天一个话题说关于AngularJS2以后版本的两个小技巧,不料引出了另外一个话题,话题起始很简单: "很多的前端框架并不复杂,比如JQuery,引入即用,实时看到效果,多好.到了Angul ...

  6. intelliJ idea #region 代码折叠

    在intelliJ idea中不仅可以对类.方法等结构的代码进行折叠(ctrl+-)还可以自定义折叠代码.intelliJ支持两种风格的自定义代码折叠,如下: visual studio style ...

  7. EF架构~mysql数据库无法创建数据模型

    回到目录 主要是通过vs2017+mysql.Data+Mysql.data.Entity+ef 来进行开始,当我们选择数据模型生成实体时,可以会出现以下问题:  http:// 解决办法: 1.安装 ...

  8. NIO 简介

    上文我们描述了五中IO类型.第一种同步阻塞模型我们我们称之为BIO(Blocking IO), 第三种IO复用模型我们称之为NIO(Nonblocking IO). 上图我们可以很容易的发现 BIO会 ...

  9. springboot+mybatis+dubbo+aop日志终结篇

    之前的几篇文章把dubbo服务层都介绍完毕,本篇文章咱们主要写web层如何调用服务层的方法.文章底部附带源码. 启动服务 服务启动时,会向zk注册自己提供的服务,zk则会记录服务提供者的IP地址以及暴 ...

  10. CSS float的相关图文详解(一)

    大家好,作为一个刚入门的小前端,第一次写博客,很是鸡冻.由于涉猎较浅,有些知识可能说的不清楚,或者有什么错误,欢迎留言指正.我的第一篇博客写的关于css的浮动的.想必很多小伙伴特别是刚学的,对浮动有一 ...