这个 618,小程序优化速记 “6-1-8”
每时每刻,都有许多商家在小程序中做各种形式的促销活动,随着商家活动越办越多,微信小程序团队也收到很多风险案例,触目惊心的安全问题层出不穷,严重影响了活动的正常开展。
微信开发者团队在分析了大量反馈案例后,为开发者总结了以下小程序优化要点,涉及客户端、服务端、安全等多个方向。
6 项优化原则
活动形式多种多样,我们无法具体的给出建议,所以给开发者总结出 6 条必要的优化原则,开发者可以逐条对照,根据自身情况做出合理的方案。
1. 请求精简
活动期间,用户访问量较平常会有很夸张的增长,甚至在一些关键活动节点,QPS 会达到平峰的几十倍和几百倍。在这种情况下,小程序端任何不必要的请求在服务端中都会达到一个夸张的程度。开发者可根据情况采取以下几点:
简化请求: 应只保留业务核心的请求,如果多个请求的数据都应用在一个业务节点中,应考虑将其合并。(比如更新请求后可直接返回更新后数据,前端不需要再另外发送请求到服务端拉最新数据)
谨慎重试: 活动期间,服务端的压力会非常大,网络出错时有发生,建议不要在小程序端主动发起失败重试,而是提示「活动火爆」tips,让用户去触发。
抑制请求: 非活动相关的请求,如无法移除则直接采取抑制的策略(可以通过注释代码和去掉函数入口来完成)。
2. 数据缓存
在活动的整个业务流程中,基本只有用户相关的接口需要读取数据库做动态的逻辑判断。如果接口返回的数据,对于整个活动的所有用户都是一致的,那么就可以将这部分数据直接缓存起来,避免读数据库造成压力。
端存储: 小程序端在取到活动数据后,应将其缓存到本地存储中,下次再次打开活动页面直接用本地存储的数据,不必要向服务端发送请求。
预加载数据: 开发者可以在活动开始的前几天就开始下发数据,活动开始时,打开过小程序的用户可以直接展示本地数据,无需发送请求。
多级缓存策略: 服务端可根据数据情况,使用 CDN、对象存储做多级的缓存,并根据活动策略做合适的缓存过期时间配置。
注意:数据缓存应协商好过期时间(过期时间可随数据下发由前端判断),另外需要做强制刷新机制(可随动态请求发送一些版本号,前端做判断是否需要拉取新数据)
3. 流量控制
在活动中,用户会有很高频次的重复刷新或疯狂点击行为,因此开发者应限制请求流量,避免正常的活动参与演变成大型的「CC 攻击」。流量控制主要有两个方面:
前端限频: 在关键的操作路径上做节流,比如用户点击按钮后,需要隔一段时间才能点击,即使点击也可以不发送请求,直接响应上次请求的返回。
后端限频:“用户中必有技术”,技术流用户可能会绕过前端直接向后端发送请求,因此服务端应在 CLB 层或者网关层,根据 IP、用户 ID 做严格的限制策略,逻辑服务只处理过滤后的请求。
4. 用户体验
活动中发生拥挤在所难免,但开发者应该给出更友好的提示,避免用户出现错误的判断。
加载状态: 在用户操作后,如有请求等耗时操作,应及时做加载状态,给用户预期。有时候用户的设备性能较差,可能无法及时在页面中展示加载态,在前端逻辑层中也要有防抖设计。
失败提示: 活动期间,除了后端业务错误,还会出现各种网络层面的报错,比如超时、DNS 解析失败等,开发者应该做全面细致的兜底提示。(小 tips,活动期间流量压力大,前端请求时遇到 Time out 报错,并不是用户网络问题,可能是服务端的限流策略,可以提示为“活动太火爆”等字样)
5. 容错降级
在活动中,服务端收到海量的请求,极易出现故障,轻则短暂不可用,重则直接宕机。因此开发者应做降级预案,应对当主服务不可用时,应如何安排线上的用户,常见的有以下几个方案:
备份架构:如果有条件,开发者可以对核心服务做冗余配置,整个服务链路里的数据库和服务器都做完善的主备方案,当主要节点不可用时,立刻切换为备用节点(大部分云服务的 PAAS 产品都具备此种架构);最重要的是,整个架构尽量做到节点的快速扩缩容,以应对突发的流量。
灾备域名:小程序端可以预埋灾备域名,当主域名的服务发生雪崩时,小程序端探测连续的请求报错,就立刻尝试灾备域名来提供服务。灾备域名的后端服务应该与主域名部署在不同的地域或者云厂商中(鸡蛋不能放在一个篮子里)。另外灾备域名默认不服务(入口网关应直接拒绝),只有主域名发生问题时,开发者手动启用灾备域名(开发者也可以把握时机开启,使用灾备域名缓解主域名的请求压力)。
注意:容错降级方案的制定应与自己的业务契合,并且在设计时应保证底层数据层面可同步性。
6. 监控告警
监控是开发者判断活动情况的有效手段,在上报时应注意以下几点:
独立上报:小程序端的监控上报,不要和活动核心请求放在一起,应该采用独立的上报路径,可使用市面上稳定且口碑好的监控平台来接入上报。
告警机制:在活动前和产品同学一起做指标告警配置,并搭配预案;当告警发生时,立刻按照预案动作。告警包含活动业务层面和技术层面,比如请求失败数达到阈值,应该扩容;或比如礼物已发超过红线,业务应该立刻补货或者调整策略。
安全第 "1"
小程序在做业务活动的过程中,因为有利可图,受到网络攻击的可能性显著增加,因此更应该关注整个活动链路的安全性。
常见的攻击类型如下:
黑灰产攻击(BHG Attack)
利用网络技术进行非法盈利的活动,包括但不限于网络诈骗、数据窃取、恶意软件传播等。
例子:黑灰产人员包装正常的商家活动页面,使用二维码、口令、链接等形式散布恶意地址,诱使用户输入个人信息或产生下单,而后通过客服联系退款等形式实施后续诈骗。
羊毛党行为(Deal-hunter)
利用平台的漏洞或政策缺陷,通过各种手段领取占用大量活动优惠进行套利的行为。
例子:刷单团伙使用设备农场手段注册大量的茶饮活动账号,并通过技术手段领取大量优惠券,再通过群聊、团购等手段优惠代下单,赚取利润。
中间人攻击(MITM)
在数据传输过程中,攻击者截取、监听或篡改正在通信双方之间传输的数据。
例子:攻击者在活动的聚集场所,对公共的未加密的 Wi-Fi 网络设置伪造接入点,当用户连接到该网络参与活动时,攻击者可以替换相关的活动页面为恶意的信息,造成活动声誉损失。
身份盗用(Identity Theft)
攻击者通过盗取身份凭证,冒充用户或管理员参与线上活动。
例子:门店开业首充活动,攻击者通过技术手段扫描活动的后台管理地址,并爆破了账号密码,给账号进行虚假充值。
我们在之前,已经针对各种安全问题做了详细的防护指南,如需要可前往文章
8 种小程序能力
小程序团队秉承着“简单、好用”的理念,持续为开发者提供各场景的能力,正确使用会节省你的很多成本和精力。我们针对活动大促场景,精选 8 种能力,看看自己有没有用上。
1. 小程序加密网络通道
为避免小程序与开发者后台通信时数据被截取和篡改,微信平台维护了一个用户维度的可靠 Key,用于小程序和后台通信时进行加密和签名,解决了无法在微信中维护可信 key 的问题。
开发者可以基于此 key,对请求进行二次加密,有效防止中间人攻击。具体使用可参考微信官方文档
2. 小程序私密消息
当分享者分享小程序卡片给其他用户或者微信群后,其他用户点击此小程序卡片时,开发者可以鉴别出点击卡片的用户是否被分享者分享过小程序卡片。
这个能力除了可以判断分享者,还可以自己埋一些参数,做一些流量限制的能力。具体使用可参考微信官方文档
3. 移动解析 HTTPDNS
开发者调用 wx.request 时,可以开启移动解析 HttpDNS 服务。该服务基于 Http 协议向服务商的 DNS 服务器发送域名解析请求,替代了基于 DNS 协议向运营商 Local DNS 发起解析请求的传统方式,可以避免 Local DNS 造成的域名劫持和跨网访问问题,解决移动互联网服务中域名解析异常带来的困扰。
此能力可支持多家移动解析服务,可参考微信官方文档使用
4. 小程序分享签名
为保障微信自定义分享功能链路安全,小程序团队提供了分享安全校验功能。开启后,小程序的分享接口需要带上开发者签名字段,平台会校验分享数据的签名,签名验证失败的分享请求会被降级。
此能力可有效防止黑灰产篡改,具体使用可参考微信官方文档
5. 周期性更新
此能力可以在用户未打开小程序的情况下,也能从服务器提前拉取数据,当用户打开小程序时可以更快地渲染页面,减少用户等待时间,增强在弱网条件下的可用性。
这个能力也可以用来做活动的资源预下发,具体使用可参考微信官方文档
6. 性能诊断工具
很多商家在做活动时,覆盖的用户群体比较广泛,会出现相当大比例低端性能设备,如果开发者没有对低端性能设备做相关测试诊断,很有可能会造成活动体验下降。
诊断工具会从启动性能、跳页性能、最佳实践、操作体验和网络性能等方面对小程序进行检测,并给出针对性的优化建议,部分指标会尝试给出预估的优化空间。具体使用可参考微信官方文档
7. 产品体验分析
活动时,用户是否按照产品预期的路径去参与活动?是否出现一些卡顿点造成用户体验问题?
产品体验分析是一款帮助小程序提升拉新、留存、付费转化率的数据分析工具。能够可视化还原用户操作现场,能够精准定位产品交互体验缺陷或者功能 bug。具体参考微信官方文档
8. 微信网关
小程序团队推出的面向微信小程序、企业微信小程序、WEB、公众号 H5、APP 等多端应用的安全服务,微信网关自带微信私有链路,提供安全防护、网络性能优化、网络加速等能力,全方位保障业务安全高效稳定运行。
微信网关设计成可一键接入,开发者可以直接接入已有服务端就可以使用安全链路,具体使用可参考微信官方文档
欢迎补充
由于篇幅原因,一些要点没有详细展开,我们会在后续单独对每个要点展开介绍。
作为开发者,你在做活动的过程中,有什么有用的经验或者踩过的坑想要给大家分享吗?
欢迎在本文留言区写下你的经验,你的经验对其他开发者很有帮助!