活动运营,是日常高频需求。然而,对于不少开发人员来说,“搞活动”很多时候可能是“被活动搞”。
活动运营难在哪呢?
防薅羊毛。秒杀、抢购、投票等场景下,“防刷”俨然是项目组的必修课。从研发角度来说,必须在链路上设置层层“关卡”,做好安全加固,才能以防万一。常规的方法有Nginx拦截、加防火墙、接口限流等,然后依旧防不胜防。
应对流量洪峰。高并发场景是活动运营里的常见问题。在高并发情况下,访问量往往会瞬间数十倍甚至数百倍数千倍增长。应对高并发,研发人员需要全链路评估并做好快速弹性扩容以及事后缩容。若前期预估过高,则机器持有成本高;预估不足,则面临随时宕机的风险,毕竟在突发情况下临时实现机器扩容和部署并非易事。
快速上线。在前后端开发模式下,哪怕小小的改动,都需要后台协助调整,前后开发加上联调,时间占用不可忽视。而活动运营十分讲求时效性,产品运营和PM往往期望是“这个需求很简单,怎么实现我不管,明天上线!”
有什么办法,可以快速开发上线一个安全且稳定性高的小程序,以满足运营活动需求呢?
零代码成本实现100%防刷
上图是从小程序到云开发的云函数数据流入全链路,和传统的数据链路相比:
- 防刷防攻击:小程序中调用后端云函数时,在公网上的数据传输都采用的微信的私有协议。能保证调用方一定来自于小程序端,防止信息在公网被窃取,而且能有效的防止重放攻击等。
- 链路加密:C端是微信的可信客户端。公网的网络通讯过程走的加密链路,能对敏感信息做到全链路有效保护。
在《创造营2020》活动中,活动涉及抽奖、投票、二维码兑换等营销互动,给研发团队在防刷盗码方面的安全加固带来不小的挑战。研发团队发现,小程序调用云开发接口过程中,公网数据传输都采用微信的私有安全协议,免登录就可以基于用户授权识别小程序用户的身份,基于此,研发团队就可以方便地去做防刷了。
而享有微信私有协议,这是云开发天然具备的特性。所以使用云开发上线运营活动,即可零代码成本接入了100%防刷的安全体系。
低成本轻松应对高并发
高并发问题,在云开发模式下,简单很多。
云开发具有弹性扩缩容的特性。在云开发模式下,不需要为了应对高并发而提前部署大量资源。因为云开发采用Serverless架构,可以无限自动水平扩容,支持海量并发请求;对开发者来说,使用云开发就是典型的 NoOps 实践。随着请求量的不断增长,云开发可以进行自动扩容,确保在云开发上面的业务高性能、高可用。而当流量下来时,资源配置将自动缩减,这大大节约了资源成本。
那么云开发如何保证高可用高性能呢?下面先来看一下云开发整体架构:
图中可以看到用户的一次服务调用需经过多个中间层服务,最终到的客户资源层,所以云开发服务的高可用高性能从大的层面上可分为 “数据链路” 和 “底层资源” 两个方面。目前,云开发系统 “数据链路” 和 “底层资源” 均超过 99.99% 以上的可用性。
以腾讯游戏年度发布会直播小程序为例,这个小程序需要承载50+个发布会环境,且每个环节有自己定制的互动,盘点下来需要实现90+个开关实时控制页面上所有的互动。研发团队在预研多个技术方案后,最终选择使用云开发数据库的实时数据推送服务。原因是开箱即用,无需管理长连,无需编写服务端代码,无需搭建和管理基础设施,自动收到更新推送。正如研发同学所说“使用起来非常简单,记住一个API——watch 就够了。小程序可通过 watch 实时监听数据库变更,收到包含更新内容的推送后,做出实时响应。更重要的是,即使是20万同时在线,服务依旧稳定可靠”。
快速响应活动运营
和传统研发模式不一样,云开发无需管理基础架构和服务器运维,前端工程师就可以快速开始应用开发。
此外,在活动运营场景下,小程序端往往需要配合运营需要,快速的迭代产品形态。但众所周知,微信小程序的发版每次都是需要微信平台审核才可以发版的,短则2小时,长则2天不等。
怎么办呢?这里不妨考虑使用云开发的“数据库”和“存储”两个基础能力,实现小程序端的活动模版化。
以猫眼小程序为例,猫眼创建了一个小程序运营工具的后台管理系统项目,运营可以通过该工具进行活动数据、状态管理。「小程序运营工具」中产生的每个活动数据,都有活动类型与活动id标识,小程序端访问该活动时带上必要参数在小程序端访问云开发的云数据库拿到对应活动配置数据来渲染页面,从而实现了使用一套模板创建不同活动的目的。目前仅需1名前端即可支持单个运营活动的开发,从原来一个活动7-8/人天降到了1-2/人天,全年支持了80多个活动上线。
目前,云开发已经被广泛应用于小程序活动运营,如微信读书“每日一答”、”组队读书”等日常运营活动,以及微信支付扫码领券等等。对于现在应用比较多的电商和教育类直播场景,也可以使用云开发实现实时弹幕,快速实现和用户的互动,同时保障高并发流量下服务稳定。
最佳实践示例 :使用实时数据推送实现活动弹幕
const watcher = bulletCollection
.orderBy('createTime', 'desc')
.limit(100)
.watch({
onChange: function(snapshot) {
// onRealtimeBulletMessage
}
});
关于小程序云开发数据库能力,你还有哪些疑问或建议?