- 如何计算并优化应用的高并发性能指标?|微信压测指南
一、高并发性能指标计算与优化为了让初学者能够更好理解,我们从一个例子来引出。假设你的小程序在同一时间点有 100 个人访问,每人访问时发送 2 个请求,每个请求平均耗时 50ms。你的服务器能在一秒之内能够完全处理这 100人的 200 次请求访问。 通过以上假设,可以得出每秒处理访问请求数(QPS)为 200。那么你的服务器最小并发处理数为 200 * 0.05s = 10。 对应公式如下: 并发处理数 = 每秒处理访问请求数(QPS) * 单个请求的平均耗时[秒]这里的并发处理数只是最小,因为案例中已经验证能处理 200 次访问了,如果要计算最大,则需要继续加量测试。 如果服务器在同一时间只能处理 1 个请求,那么其并发处理数是 1,如果还是上述假设,每个请求是 50ms,那么服务器 1 秒内最多处理 20 个请求,也就是说100 个人同时访问200次请求,最少需要 10 秒钟才能全部处理完毕。 并发处理数是指系统能同时处理的请求数量,一般由请求时消耗的资源和服务器资源来共同决定。比如请求是 CPU 密集的,每次请求都需要占用 CPU 50ms,那么单核服务器并发数就只有 1,如果服务开多线程并且部署多核服务器,并发数会相应的增加。 在做性能优化的时候,可以向两个方向工作: 提升服务器并发数:可以通过增加服务器数量和质量,或者降低请求的资源消耗。降低单个请求的平均耗时:优化请求里的处理逻辑,缩减占用吞吐资源的时间。通常情况下,影响并发数的资源主要是CPU、内存、存储IO、带宽。 初入行的开发者,最先遇到的资源瓶颈大多是CPU。请求的处理中包含大量的计算会严重占用 CPU 的使用,一般在开发自测阶段不容易发现这种问题(用户只有 1 个或几个),一到上线就会出现大量的请求超时。 在遇到资源瓶颈问题时,解决思路就优化代码和添加配置: 优化代码:这个因程序而异,而且比较看开发者自身的技术水平,就不展开讲了。添加配置:这里照顾一下个人和初创团队,提供一些有用的经验。 ○ CPU和内存:买多核多内存的服务器或者用弹性伸缩来动态增删服务器来解决;更有性价比的思路是用云函数(公有云的云函数都可以,也可以用微信云开发的云函数来),遇到高消耗的任务就直接放到云函数中,处理时直接调用计算,服务器只等待结果,不消耗服务器的 CPU 和内存资源。 ○ 存储 IO:更换好一点的服务器硬盘,如果是海量的用户面存储,可以直接用对象存储,性价比很高,不绑定云硬盘,迁移还方便。 ○ 带宽:购买高带宽但价格感人,可以开启按流量计费,把阈值开高就可以。 二、 通过微信安全网关压测来测试自己的极限关于微信安全网关的作用和特点,我在之前有写过2 篇文章,感兴趣可以去看看。 「微信开发平台Donut」入门指南|安全网关篇Donut安全网关一键接入体验指南这里主要介绍一下压测的部分。 在网关内的控制台左侧点击「扩展能力-压测工具」,可以看到压测的页面。 [图片] 我们先创建一个压测任务,相应的操作步骤如图演示: [图片] 压测任务的信息构成主要由以下几方面: 压测任务名称:可以自由定义,用于方便你分辨压测任务。压测小程序:以哪个小程序的角色进行压测,压测时默认小程序接入安全网关,不影响现网的接入配置。请求列表:分为业务请求和微信请求,业务请求可以是任意的 URL,支持多种请求形式。微信请求,目前包含登录和支付接口,后面会支持更多接口。调试能力:模拟压测链路执行所有列表请求,并显示请求耗时和返回信息,用于确认配置是否正确。确认信息无误后,点击“保存”按钮。 创建压测任务后就可以预约时间段来进行实际压测了,由于资源有限,所以压测预约是按时间段来的,并且预约时需要自己确认并发用户数和压测时间。 预约到时间段压测后,等到预约的时间就可以开始执行了。如果超过时间段则就无法执行,需要重新预约。 [图片] 压测完成后,就可以在同一页面下方看到详细的数据,如图: [图片] 根据压测的数据信息,就可以估算出相关的性能指标了。 我们以上图举例子: 100 个用户,压测 600 秒,每个用户完成一轮请求后紧接着进行下一轮。如果列表中有请求调用错误,则不会进行列表中其后的 其他请求,直接重新从列表开始请求。 QPS = 阶段请求数/阶段请求时间[秒]并发处理数 = QPS * 单个请求的平均耗时[秒] 基准测试接口QPS为 178587 / 600 = 298.645,并发数为 298.645 * 0.030774 = 9.19登录测试接口 QPS 为 178328 / 600 = 297.213,并发数为 297.213 * 0.133554 = 39.69 QPS 和并发处理数指标需要结合你的应用场景合理设定,并不需要设置很高的性能指标,满足产品所需并留有部分buff就可以了。 最直观的就是直接上压测任务,模拟一些真实的用户来在时间限制内持续请求你的服务器,来看最终的结果如何,并根据结果来指导你做指标设定和优化方向。 以下是腾讯云关于服务器实例的压测结果,当然这只是参考,实际上跟应用类型和服务架构也有关系的,还是自己真实上业务测试比较准。 [图片] 关于压测工具的体验,可以访问Donut-安全网关控制台,有疑问可以在控制台点击「技术支持」寻求帮助~
2023-12-14 - Donut安全网关一键接入体验指南
本文已经改版重发,请直接访问新链接: https://developers.weixin.qq.com/community/develop/article/doc/000a8cfb3a85f8e57bc026f2a66013 一、写到前面 上周Donut安全网关推出一键接入的新功能,当你之前有使用过安全网关,再体验这个新功能,就会发现其严格意义上是重塑了整个产品形态。 去年我写过一篇关于安全网关的指南文章,其中有讲过安全网关的作用和特点,在这里重新提一下: Donut安全网关提供了一个安全的接入链路,从调用端(小程序、公众号H5、APP、WEB)发起的请求直接进入微信环境接入层,微信接入层通过中转域名将请求转发至后端服务网络的「网关实例」中,在「网关实例」中通过路由配置将请求转发到开发者自己的上游业务服务,完成整个请求。 [图片] 上面这个图是去年的时候的网关的架构图,初始形态下我们必须要自己部署一个网关实例,在部署的网关实例中包含对上游业务和路由转发的配置。 在2023年年中时候,又推出了「极简直连模式」。在安全网关看来,针对业务端的网关实例可以由安全网关自己接管,不需要开发者介入安装。直连模式下开发者只需要配置源站域名或IP地址,微信会自己分配相对应的微信接入域名。 比如源站域名https://weixin.qq.com,分配接入域名https://a1a48fdaf-wxa174c2e9b3e2ec50.preview.wxcloudrun.com/。只需要访问接入域名就可以经过安全网关直达源站业务端。 [图片] 但接入域名需要配置在前端应用(小程序、WEB、APP)中才可以正常接入。整个架构图中,从调用端到业务后台,每个链路都需要完成改造,安全网关才算正常接入完成。 即使到极简直连模式下,在调用端方面仍然需要开发者进行改造。那么如何才可以让开发者不用对调用端进行改造呢? 这就引出了史诗级新功能:一键接入。 二、功能介绍 在微信小程序中,如果要向外发送请求,必须要用wx.request,这是微信小程序在网络请求中的封装。 一旦封装就可以做很多事情,比如微信小程序提供的请求缓存管理器,就是在封装下的其中一种功能体现。另外wx.request还会拉取开发者的服务端配置,来判断经过其的请求域名符不符合要求… 那么安全网关的使用中,在wx.request中直接转发需要安全接入的源站域名请求,让它们直接走网关链路就可以了,其余的还是正常走源站链路。 当这个能力实现支持之后,开发者接入安全网关的所有改造工作都已经消失,开发者只需要一系列配置就可以完成小程序端的安全链路改造。 接下来详细介绍一下使用细节。需要注意,之前使用原来形态的安全网关的开发者,需要新建一个空间才会有这个能力。 三、使用过程 需要微信扫码登录 Donut 安全网关控制台,同意安全网关服务协议并同意即完成开通。 [图片] 如果账号没有创建过任何空间,会自动引导开通空间;根据自己的情况选择个人或企业主体,并给空间起一个名字。一般建议一个空间对应一个业务集群。 [图片] 在空间里创建安全网关,如果没有任何网关,则会直接进入一键接入页面 [图片] [代码]在一键接入这里选择小程序,将会拉取此空间下授权的小程序,如果空间里没有任何小程序授权,则可以根据指引新增授权,需要小程序管理员(注意不是开发者和运营者之类的)扫码确认。 [代码] [图片] 选择小程序并点击「开始接入」按钮后,将会直接默认转发该小程序所有服务端配置域名,并且只在该小程序体验版生效,不会影响线上。 [图片] [图片] 后续可以在控制台随时更改链路接入覆盖范围,包括小程序的范围和域名范围。 这里主要解释一下接入域名,接入域名其实对应的是一个个的网关域名(在前期安全网关产品功能中有直观体现),在后面的接入多端中会应用到。小程序一键接入可以直接忽略掉。你可以将其理解成一个链路方案,该方案下可以有多个小程序或者一个小程序不同版本的不同域名配置。(比如我希望开发者版A域名走安全链路,体验版B域名走安全链路) [图片] 点击接入域名中的修改按钮,可以针对该接入情况做修改,详情如下图 [图片] [代码]接下来介绍一下每一个配置项作用: [代码] 选择小程序:该接入域名所应用到的小程序。 接入版本:小程序的哪个版本要安全链路接管。全部版本就是线上版、体验版、开发版均接管。 小程序URL:从小程序管理后台开发配置中读取服务端配置,可以选择所有或者针对部分链路做匹配。 比如/api/,则匹配/api/前缀下所有的路径,如果下面又有同域名的/test/,则同时匹配/api/前缀和/test/前缀的所有域名请求。 如果填空,则匹配所有域名请求。 添加小程序:你可以最多添加两个小程序(小程序可以相同) 你可以新增接入域名,选择不同的小程序。(需要注意的是一个小程序只能被一个网关的一个接入域名绑定) [图片] 在监控视图中可以查看网关下的小程序端链路调用情况,可以通过观察请求成功率来验证安全链路的兼容稳定与否,结合自己的测试来判断是否应该继续接入。 [图片] 如果你发现一键接入后,有异常请求且持续发生,则可以直接操作一键断联。 [图片] 四、常见情况 1. 一键接入后,是否还需要小程序改造发版? 不需要,微信小程序底层将直接根据你的接入配置在网络层完成安全链路转换。 2. 如何判断是否经过了网关链路? 网关链路的errmsg值为gateway.call:ok, 另外在返回体根级会有callid,建议在小程序端记录并上报该callid,链路出现问题可以凭此callid反馈给安全网关团队精确定位。 服务端会收到安全链路的特定header: x-request-id:请求ID, x-wx-call-id:链路请求ID,和前端响应的一致,可以通过其来联系前后端日志。反馈问题也首选这个。 x-wx-route-tag:接入域名标记,可以根据此判断不同的接入域名转发的流量,用来区别对待 x-wx-source:请求客户端,比如微信客户端是wx_client,开发者工具是wx_devtools x-wx-appid:请求小程序,标记请求的小程序appid x-envoy-expected-rq-timeout-ms:网关参数,响应超时时间,一般是15秒 根据自身安全要求,可以通过x-wx-appid、x-wx-route-tag来设立一个白名单,只接受来自白名单接入域名或白名单小程序的请求。 3. 在使用过程中出现问题或者不想再使用安全链路,需要怎么操作? 参照上面使用过程最后一条,直接断联就可以,不需要再次接入则可以直接删除接入域名。(需要注意删除之后,接入域名就没法复原了) 4. 为什么接入配置后,小程序对应的版本访问还是原生链路,没有走安全链路? 链路生效一般在1分钟之内,如果用户正在访问该小程序,则需要等待下一次启动打开才可以。如果开发者测试验证,则建议退出微信后台,重新进入再试,如果仍然不可以,则删除掉小程序然后重新加载尝试(删除掉小程序主要是清除缓存) 5. 为什么接入配置后,微信开发者工具没有走安全链路? 开发者工具对应的是「开发版」,需要保证接入配置到「开发版」上,配置之后仍然不可以则等待一分钟再试。一般清除缓存+重启开发者工具都可以搞定。基础库版本需要在3.1.5及以上,开发者工具版本需要在1.06.2310312及以上。 [代码]function test(){ } [代码]
10-11 - 「微信云托管」首篇实战|极简DEMO入门
一、项目介绍 此项目基于微信云托管能力范围编写,构建了一个简单的WEB后端服务,统计WEB网页的访问日志,并保存至serverless形态的mysql数据库中,然后在小程序中调用服务接口,获得访问次数。 项目包含微信云托管在单体运行中的基础能力使用,包含基础容器、mysql、微信小程序调用等。 项目技术栈:后端服务(nodejs + express)、WEB网页(原生js)、微信小程序(原生) 如果你已经体验过微信云托管基础能力,可以继续深入体验微信云托管在腾讯云其他产品的关联使用,日志监控等能力。 二、部署流程 (1) 访问github仓库,将项目下载到本地,打开IDE准备对项目进行改造 (2) 访问微信云托管官网,使用微信扫码,选择自己拟用到的小程序,进入开始创建环节。 [图片] (3) 这里环境名称根据自己用途填写即可,一般小程序项目创建一个环境即可,一个环境里可以包含多个服务,可满足绝大部分企业级需求。 (4) 如果你之前小程序中有使用过云开发,并登录过腾讯云官网配置过腾讯云其他云产品,为了方便使用,可在创建框中「网络类型」选择私人网络,将云托管环境配置到与之前相同的网络环境内(如果你不想这么做或者说你什么也没有过,直接系统默认创建即可) (5) 明确知悉云托管环境的费用,并同意服务条款,开始创建。 (6) 创建成功后,会显示如下效果: [图片] (7) 开始创建mysql数据库,如下图所示: [图片] [图片] (8) 填写密码后,mysql正在进行初始化,请注意这里的费用信息,初始化完成后如下图所示: [图片] (9) 点击右上角「数据库管理」按钮,进入数据库管理后台,开始创建一个库,如下图所示,这里库名叫 online (名称随意,若更改的话注意之后操作相应改变) [图片] [图片] (10) 将项目目录中 database.sql 文件导入到 online 库中,效果如下: [图片] (11) 返回微信云托管控制台,mysql栏中添加一个账户,专门用于编程调用,如下图所示: [图片] (12) 在目录werunserver/db.json中,填写mysql数据库信息,其中host和port信息在控制台中 [图片] { "host": "10.0.224.13",//上图中的冒号之前ip地址 "user": "code", //上一步设置的账户名称 "password": "*****", //上一步设置的密码 "port": "3306", //上图中的冒号之后数字 "database": "online" //之前创建的数据库 online } (13) 将项目保存,将项目目录werunserver作为根目录,上传私人git仓库,在这里已github为例。【注意一定是以werunserver为根目录 (14) 在微信云托管控制台,服务栏中,选择新建服务,如下图所示,记得勾选开启公网访问,名字随意设置(这里示例为aaa) [图片] (15) 创建完成后,进入服务管理,如下图所示,选择新建流水线 [图片] (16) 流水线新建配置如下,代码源第一次使用时需要授权: [图片] (17) 新建完成后,如下图所示,点击开始第一次构建: [图片] (18) 构建完成后,如下状态,此时我们就可以开始发布环节了 [图片] (19) 前往「部署发布」开始全量发布流程 [图片] [图片] (20) 发布后效果如下: [图片] (21) 返回服务列表,在服务详情中找到公网地址,复制到浏览器打开: [图片] (22) 由于配置的是低成本模式,所以首次访问存在容器加载过程,耐心等待即可(不断刷新过程中会出现大概几十秒的请求失败框,正常配置网络中,无伤大雅)访问成功后效果如下,每次刷新都会有记录: [图片] (23) 开始微信小程序的测试,将项目中 miniprogram 做为小程序根目录用微信开发者工具导入打开,填写第一步自己创建服务相同的小程序APPID (24) 在小程序开发者工具中打开 pages/index/index.js 文件,填写如下几处信息: [图片] (25) 重新运行,大功告成! [图片] 三、项目总结 本次部署实践后,你可以继续在此项目基础上进行修改,重新推送更新代码到仓库中,流水线会自动触发构建。 在新版本发布前,可以进行充分测试,云托管提供各种测试白名单配置;测试验证后可以进行灰度发布,最终到100%新版本接单,完成新版本的全量更替;要是嫌麻烦,相信自己的本事,可以全量发布,给个痛快! 后续在控制台中会支持自定义域名等更多功能,还在路途中,记得常看看更新。
2022-06-02