▌前言
关于小程序使用云开发很多小伙伴有不少疑问,大多数疑问其实在官方文档能够得到答案。但是今天小助手还是汇总了几个比较常见的问题,在这里一一为大家解答一下。
▌常见问题
Q:可以通过哪些方式管理小程序云开发的资源?
A:管理小程序云开发资源如数据库、存储、云函数的方式有很多,并不局限于微信开发者工具自带的云开发控制台。
1.通过腾讯云网页后台管理云开发资源
我们还可以登录腾讯云官网的云开发后台管理,使用微信公众号登录,然后用该小程序管理员的微信扫描二维码,就可以在网页控制台里看到我们使用微信开发者工具创建的小程序云开发资源。
腾讯云官网的云开发资源管理界面△
在这里可以管理小程序云开发的数据库、文件(存储)、云函数、监控告警、日志检索以及环境设置,也可以对云开发资源的服务进行续费,是一个可以替代云开发控制台的可视化管理工具。
2.使用HTTP API来管理云开发资源
有不少朋友反馈,我们应该如何让市场、运营、产品等来管理云开发的资源(如添加商品、发表文章等),通常我们需要搭建一个后台,便于不懂代码的人员来进行可视化管理,尽管我们可以把这个后台直接搭建在小程序里面,但是PC端的后台可能更加方便一些,开发人员可以用到HTTP API搭建一个网页后台。
云开发官方技术文档有非常详细的 HTTP API技术文档 ,通过HTTP API我们可以实现对数据库的集合、记录、文件等的增删改查以及触发云函数。
3.跨小程序进行资源管理
如果你有多个小程序都开通了云开发,也就有了多个云开发资源环境,那我们是否可以在A小程序的云函数里调用B小程序的云开发资源呢?当然可以,通过tcb-admin-node这个依赖就能很方便的实现。
tcb-admin-node在我们安装wx-server-sdk时就已经同时安装了该依赖,该依赖更多信息可以通过阅读在Github上的技术文档来了解。
代码语言:javascript复制 // 初始化示例
const tcb = require('tcb-admin-node');
// 初始化资源,云函数下不需要secretId和secretKey。env如果不指定将使用默认环境
tcb.init({
secretId: 'xxxxx',
secretKey: 'xxxx',
env: 'xxx'
});
//云函数下使用默认环境
tcb.init()
//云函数下指定环境
tcb.init({
env: 'xxx'
})
4.通过CLI工具来管理云开发资源
CloudBase CLI 是一个开源的命令行界面交互工具,用于帮助用户快速、方便的部署项目,管理云开发资源。对于开发人员来说,我们还可以通过cloudbase-cliCLI工具使用命令行对云开发资源进行管理。在云开发博客网站里,有该工具相当详细的使用教程。
除了以上几种方式,我们还可以使用cloudbase-manager-node,它支持开发者通过接口形式对云开发提供的云函数、数据库、文件存储等资源进行创建、管理、配置等操作,它的功能更在tcb-admin-node之上;如果你是小程序服务商,会给很多商家开通并管理小程序的云开发资源,可以使用云开发的代开发的接口;
如果你想将云开发这种免服务器免运维的开发理念和方式贯彻到web端,也可以直接把小程序云开发的资源用作web端,实现一云多端,详细可见云开发的代开发的接口。关于这方面的内容,以后会深入介绍。
Q:云开发是怎么计费的?相比于传统服务器,贵吗?
A:云开发的基础版是免费的(免费版虽然有有效期,但是到期会自动免费续期)。云开发资源也提供的是一套完整的综合性服务,也就是完全可以只依赖云开发提供的服务独立开发出可以落地的技术产品,这是传统云服务(暂且这么说吧)所不具备的。云开发相当于直接提供了传统云服务所包含的Nodejs环境云服务器、云存储、CDN、文档数据库等(省掉了域名与运维服务),所以云开发服务也是综合性服务的计费方案。
云开发既然开发起来这么方便,服务也都打包好了,那用云开发划算吗?云开发计费相比传统云服务,贵吗?就微信读书这种获客数千万,日均PV过千万的大型应用来说,云开发的开发效率是APP的4倍,网页H5的2倍,这是开发成本;而使用云开发整个服务的成本也比自建Node服务器要低。当然综合性的服务会有一个弊端,就是资源搭配的不合理会造成一定的浪费,因此云开发针对不同的业务类型所需要服务侧重点不同推出了多套方案,有资源均衡型、CDN资源消耗型、云函数资源消耗型、数据库资源消耗型,未来也会有单独服务包购买的方案,通过购买符合自身业务的资源类型,云开发也没有比传统云服务贵。
那不同类型的云开发资源大致可以支撑多少人访问呢?比如69元/月的数据库资源消耗型,每天支持读50万次,写30万次,平均一个uv大约会有5次左右的pv,大约会读取数据库10次,写会比较少一些,也就可以支持日均1万的访问;390元/月的云函数资源消耗型,每月支持400万GBs资源使用量,这里资源使用量GBS = 函数配置内存 X 运行计费时长,其中配置内存目前为256M,而单次云函数的执行时间大约300ms左右,平均来说执行一次云函数的资源使用量大约是0.06GBs,相当于每个月可以调用6700万次云函数,用于云调用群发订阅消息、处理内容安全、业务数据的增删改查都是比较足够的。云函数在未执行时是不产生任何费用的,对一些不需要常驻的业务进程来说,开销会大大降低。
Q:云开发的并发是多少?云开发是否支持几十万、几百万PV的业务
A:由于用云开发可以一站式简单的开发业务,简化了开发难度,让不少人开始怀疑云开发处理高并发和复杂业务的能力。相比于购买传统云服务,云开发可能在处理过于复杂的业务上优势不算特别明显,但是处理高并发、海量用户却十分方便。
云开发的云存储自带CDN,CDN通过将云存储的内容发布至遍布全国的加速节点,使用户能就近获取所需内容,避免网络拥堵、地域、运营商等因素带来的访问延迟问题,有效提升下载速度、降低响应时间。CDN通常是没有带宽限制的,保证了静态资源在海量用户且地域分布广泛的加载速度。
而数据库的并发取决于数据库的同时连接数和数据库的请求耗时,同时连接数会根据付费类型的不同而有所差异,比如590元/月的数据库资源消耗型,支持的同时连接数为400,而数据库查询的请求耗时影响的因素很多,超过100ms则称之为慢查询需要检查,通常单次查询耗时在10~20ms,也就是连接数为400的数据库,它的并发大致在400(1000/10)到400(1000/20),即支持2万~4万的qps,这个qps足以支持每日亿级的PV。
云函数支持毫秒级别的实时弹性伸缩,完全根据请求量扩容或缩容,动态负载均衡将请求分发至后端近乎无限的函数实例上,完全无需任何手动配置和操作,满足并发量从 0 到成千上万的不同场景。就单个云函数而言,它的同时连接数为1000,并发量比较高的云函数则需要做好性能优化,降低执行耗时,通常可以75ms左右,也可以满足每日近亿的pv。
Q:云开发在处理大量数据时需要注意哪些问题?
A:云开发的数据库是通用性的非关系型数据库,稳定可靠、性能卓越、易于拓展,支持二级索引、范围查询、聚合、地理空间索引等丰富的功能。关系型数据库在处理互联网业务的诸多领域比如游戏、物流、社交、物联网IoT、视频直播、地图导览等。
和关系型数据库(如MySQL)以行和列、多表关系来设计表结构不同的是,云开发的数据库是基于文档的。我们可以在一个记录里嵌套多层数组和对象,可以把每个文档所需要的数据嵌入到一个文档里,而不是分散到多个不同的集合(反范式化设计)。这种处理方式便于快速查询。不过单个Doc不能超过16M,Doc嵌套的层数不能超过100层。在我们进行数据查询和聚合时,数据库单词出包的大小也不能超过16M。
我们都知道云开发有两套API,分为小程序端和服务端,在我们处理大量数据的时候,通常建议在小程序端进行数据的增删改查,一是可以节约云函数的资源,二是调用大量数据时,小程序端比云函数端要快,云函数调用数据库除了会有增删改查数据库的耗时,还有云函数的启动时间、以及将数据返回给小程序端的时间,因此云函数端调用数据库通常会比小程序端调用数据库慢几百毫秒。值得一提的是,云函数返回给小程序端的数据大小也是有限制的,不能超过1M,因此也不建议大家把图片做成base64返回给小程序端,建议使用云存储来过渡。
小程序端查询数据库时会默认查询结果集数量上限limit为20,取更多数据建议结合skip分页分批次获取,云函数端limit的数量限制为1000条。如果你需要一次处理几十万条业务数据,比如给数十万人群发订阅消息,可以在结合云调用在云函数端进行,云函数的默认超时时间为3s,可以在配置里修改为60s。
Q:云开发的环境初始化问题总结
A:很多人在导入云开发项目或新建一个云开发项目时,会遇到环境相关的问题。除了需要在微信开发者工具扫码登录具备开发者权限的微信账号外,还需要注意:
- 项目配置文件project.config.json里注意配置小程序的appid为自己的appid。
- 项目配置文件还可以配置云函数根目录如: "cloudfunctionRoot": "cloudfunctions/",这时在开发者工具的资源管理器该目录cloudfunctions还会显示当前环境的环境名,如果没有,可以右键菜单更多设置里进行设置。
- 小程序端环境初始化为需要填入相应的云开发的环境ID。
wx.cloud.init({
env: 'xly-xrlur',//结果通常为环境名称 ‘-’ 一个后缀
traceUser: true,
})
一个appid可以创建两个免费的云开发资源,用于生产环境和测试环境,在小程序端可以通过修改wx.cloud.init的env属性来切换,而在云函数端也是可以通过环境的初始化在两个环境进行切换的。小程序端和一个云函数里只能初始化一次环境,初始化多次也只有第一次会生效。
代码语言:javascript复制 const cloud = require('wx-server-sdk')
cloud.init({
env: 'test-x1dzi'
})
//还可以给env参数传入对象,指定数据库、存储、云函数的默认环境
// cloud.init({
// env: {
// database:'test-x1dzi',
// storage:'xly-xrlur',
// functions:'test-x1dzi',
// }
// })
建议每个云函数都配置初始化环境,如果你没有跨环境调资源的开发需求,可以统一把所有的云函数的环境初始化写为如下,cloud.DYNAMIC_CURRENT_ENV,标志当前云开发资源所在的环境。
代码语言:javascript复制cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV,
})
有时我们希望小程序上线之后,在不修改提交代码的情况下将测试版环境改成小程序的生成环境(当然小程序上线也是可以修改云函数的,只是不能用于测试),这时我们可以配置云函数的环境变量,如上图所示,然后将云函数初始化的env设置为env: process.env.env即可(值即为上图的xly-xrlur)。
▌最后
为了可以更好地与云开发者交流,小助手会在「腾讯云云开发」公众号定期推送Q&A专题。欢迎大家在留言处提出疑惑或反馈问题,小助手会选比较典型的问题,为大家解答~