3

云开发如何帮助业务扛过大流量活动洪峰丨深度好文

 3 years ago
source link: https://serverlesscloud.cn/best-practice/2021-04-08-tcb
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

云开发如何帮助业务扛过大流量活动洪峰丨深度好文

发布于: 2021-4-8
归档于:

标签:Serverless云函数腾讯云

70ed38a9ed9b93f706d68cc8041f5f01.jpeg

在企业里,做活动是一种十分常见的需求,有面向 C 端用户开展的活动,也有面向公司内部员工的活动。随着互联网技术的不断发展和疫情等方面的原因,线上开展的活动也越来越多,常见的形式有:内容征集、评论弹幕、点赞投票、竞猜答题、抽奖红包、组队分享、PK 排行榜等,无论是单项活动还是多种玩法,其中不乏有会产生大量并发请求的活动。

活动期间,用户在短时间内密集参与,像瓜分红包、秒杀等活动,将 引发用户集中点击,产生高并发请求,对系统产生一定的压力。如果活动期间负载过高或系统崩溃,将会导致用户无法参与活动,引起用户吐槽和投诉。

然而,活动类系统很多时候仅是 “一次性” 的,所以大家在这类系统的开发上投入的人力物力将相对较少,甚至有些活动是研发人员利用空隙时间开发的。所以往往我们发现,如果不是进行细致的开发设计和上线前的压测,一些大活动的系统在上线后出现问题的概率是非常高的。

一个能支撑大流量的活动系统是活动能够成功的关键,接下来我们一起看下大流量的活动系统应该如何设计架构。

01. 大流量活动系统的架构长啥样?

大流量活动系统需要应对大量并发调用,在系统设计上就要求具备水平扩容的能力来满足业务需求。通常会采用如下的分层的系统架构设计,因为活动系统功能通常比较简单,模块较少,所以系统架构不会很复杂。

5d5a27938d5e4f1ee91bba39b3769208.png

通常在系统从 0-1 阶段,为了让系统快速上线,通常是不考虑分层的,但是在面对大流量活动系统时就不得不进行分层设计,分层架构可让系统更容易进行横向扩展,提升系统吞吐量,这也是大流量系统的核心需求。同时,分层架构也增加了系统的复杂度和工作量。

以上架构分为 LB、业务接入层、业务逻辑层、数据存储层等多个层次。

  • LB

用户流量入口,对外屏蔽内部服务架构细节,对内提供反向代理流量转发,提升整个系统的吞吐量。LB 的核心作用是通过流量分发提升整个系统的吞吐量。

  • 业务接入层

这层用来实现一些通用的业务逻辑处理,如数据编解码、用户身份校验、访问频率控制、限流降级、数据缓存、微服务入口等功能。这层通常在业务逻辑层内部通过中间件的形式实现。开发需要实现该层的业务逻辑,还需要和底层资源进行交互。

该层实现的业务功能是很多系统所需要的,多个业务逻辑层服务共用该层服务。值得注意的是,该层通常是无状态的,可以通过水平扩展增加系统吞吐能力。

  • 业务逻辑层

业务逻辑实现的核心层,业务逻辑相关代码基本都集中在这一层。该层需要开发人员花费大量的时间进行设计实现,开发时间的多少将直接影响业务逻辑是否能够进行充分的进行设计和实现。业务性能问题,系统 Bug 常常光顾这一层。

开发者需要实现该层的业务逻辑,还需要和底层资源进行交互。该层通常是无状态的,可以通过水平扩展增加系统吞吐能力。

  • 数据存储层

业务数据存储层,几乎所有的业务数据最终都需要持久化到数据库中,这层通常是系统瓶颈所在。

所有的活动类业务都需要数据库层,正常合理的使用数据库对系统性能将会产生非常大的影响。

数据存储层是有状态的,较难通过水平扩展增加系统的吞吐能力。通常是通过纵向提升数据库实例配置规格来提升数据库性能,但是纵向配置是有物理上限的,不能无限提升的。这就需要开发人员在这一层进行充分的设计,提升这一层的服务能力。

如上的系统架构是最常见最基础的分层系统架构,但在面临大流量活动系统时,即使经验丰富的开发人员,也不敢打保票说一定抗的住的。

02. 实现大流量系统面临的挑战有哪些?

系统各层需要考虑的问题有:

4200457c163e071e91d633e67c3b9122.png

当我们把架构中每一层需要考虑事项展开之后,系统的开发工作量就不会想前面看着少了,原本看着简单的系统就不再简单,需要考虑和解决的问题非常多。

1. 流量入口 LB 层

  • 安全防护:防止各类安全攻击,破坏系统、盗取数据;
  • 接入质量:需要考虑使用各类网络各个地域的用户的接入质量,否则很可能有部分用户因接入质量无法参与活动;
  • LB 配置维护:需要靠性能可靠性,负载均衡策略,RS 更新维护与健康检查、日志监控告警等多个方面的问题;
  • 拨测监控:监控系统是否正常提供服务;
  • 网络带宽:网络带宽是否足够,带宽问题通常比较隐蔽不易发现;

2. 业务核心层

  • 基础资源:涉及计算、网络、存储等资源的创建配置管理,涉及安全扫描、安全防护、监控告警、系统优化等多访问的问题;
  • 业务部署:涉及服务的发布变更、频控限流、容错容灾、性能优化、日志采集等诸多方面的问题;
  • 业务开发:业务逻辑设计实现,容错、容灾能力实现;

3. 数据存储层

  • 数据安全:防止密码泄露数据被盗等问题;
  • 业务设计:数据库分库分表设计,数据库索引设计;
  • 性能优化:提升系统吞吐能力;

    4. 高性能高可用

  • 高性能:系统各层的处理能力及性能瓶颈,如何排除链路中的性能瓶颈及优化,排除链路中的性能瓶颈可能需要进行大量的工作才能发现;
  • 高可用:全链路的容错、容灾设计,如何降低避免诸如网络抖动、可用区故障等故障对系统造成的影响;

除了图中列举的,业务上还需考虑如下问题:

  1. 如何对用户身份进行校验保证用户身份的真实性?
  2. 如何防刷、防止羊毛党薅羊毛?
  3. 如何对业务数据进行统计?
  4. 如何快速搭建开发、生产等多套环境?
  5. 如何快速处理线上问题?
  6. 如何进行活动运营?实现一套运营管理后台系统?
  7. 如何进行活动开关控制?定时轮询 or 活动推送?

当所有这些问题汇集到一起时,对开发人员产生了不小的挑战。为了使活动万无一失,我们都需充分考虑。研发团队具备:

  1. 系统架构:需要进行整体性的技术架构设计规划
  2. 系统运维:能够对全链路业务资源进行运维管控
  3. 业务设计:实现业务逻辑,进行容错、容灾设计
  4. 性能优化:充分考虑系统可能存在性能瓶颈,并针对性的进行设计优化
  5. 容量设计:对系统容量进行评估,如何应对超出预估的大流量调用
  6. 监控告警:主动发现系统当中的各类问题,提早排除隐患
  7. 服务部署:相关业务资源的申请及部署,业务服务的部署

如此一来,开发团队的精力可能会被分散到系统的各个方面,这将导致开发团队没有足够的精力聚焦于业务逻辑,也没有足够的精力解决系统面临的最核心问题:如何应对大量高并发的服务调用?

高性能高可用的架构设计原则和方案目前有很多,但要实现一个高性能高可用的系统却并非易事,其背后有非常多的具体细致的工作要做:如系统容错容灾容量等问题。

基于 Serverless 模式的腾讯云·云开发(以下简称为 “云开发”),可帮助开发者解决上述问题和挑战。

03. Serverless 云开发:解题之法?

业务系统概括起来需要实现两个能力:

  1. 业务逻辑:实现业务业务逻辑,包括前端、后端业务逻辑。部分业务逻辑为通用需求。
  2. 访问链路:搭建高性能大容量的访问链路,连通用户侧和业务逻辑层。这是通用需求。

腾讯云·云开发对通用的 访问链路 以及部分 通用的逻辑抽象 出来进行统一的实现,帮助开发者解决通用问题。云开发提供安全、高可靠、高并发、高性能的通用后端能力基础,为开发者提供 高性能高并发大容量 的访问链路,让开发者无需关心链路搭建涉及的一系列问题,让业务方基于 Serverless 架构实现业务逻辑,为开发者屏蔽底层基础架构,提供高效的弹性扩缩容能力,解决业务容量问题。云开发帮助业务解决通用性问题,让开发者有更多精力专注于解决业务本身,降本增效。

传统模式和云开发模式的对比如图所示:

6f187bdc838101d51ced09806bc440a2.png

在云开发模式下,用户仅需关注前后端的核心业务逻辑设计实现,无需关心底层基础设施和访问链路。

618874115ce8362787d8f9945ea8efb8.png

(云开发服务架构)

3.1 业务资源的弹性伸缩能力

开发者基于腾讯云·云开发提供的业务资源实现其业务逻辑,依托于云开发平台底层资源的弹性扩缩容能力,用户业务具备了弹性伸缩的能力,高效快速,避免了传统模式下扩容所产生了资源和人力成本。业务服务按需使用资源,按量计费,节省项目成本。

  • 云函数
1b6da87b693d2f976bd72c36a429c378.png

(云函数平台架构)

用户请求经云函数接入层 Invoker 进入到用户云函数运行时,触发用户逻辑逻辑,云函数是一种弹性的计算资源,能够自动跟随用户的并发量进行弹性伸缩,如下图所示:

cda2f0afc5ce4718cb41610f2a87cad1.png

每个并发的用户请求都会对应一个云函数实例,当用户请求上涨时,云函数实例自动进行扩容,当用户请求量下降时,云函数实例逐步进行缩容。弹性伸缩的过程是系统自动进行的,方便快速,为用户提供了强大的弹性伸缩能力,进而为用户业务的高并发提供了强有力的能力支持。

云开发目前为开发者提供单个云函数上限 1000 并发的能力支持,如果云函数的平均执行时间为 100ms,那么单个云函数可以达到 10000 QPS,可满足大部分用户场景的需求,50 个云函数的总QPS 将可以达到 50W QPS。

  • 云数据库

腾讯云·云开发为用户原生提供数据库实例,用户不需要购买维护数据库实例,通过云开发 SDK,开发者可以快速开始进行业务开发,节省时间。

云数据库在接入层和数据库底层也做了非常多的专项优化,同时也在部署方面进行了诸多方面的设计。

e1c4bb44f6465e07f8f1779ae5b4195a.png

(云开发数据库架构)

云数据库接入层进行了分层设计并支持大规模的水平横向扩容,用户请求可在集群间进行灵活调度,应对可能出现的服务故障,提供更高的可用性和更短的恢复时间。用户请求经数据接入层服务进入到数据库引擎层,数据库接入层部署多个跨 AZ 的集群进行。数据库接入层帮助用户实现了数据库连接的维护与优化,用户无需关心数据库如何连接访问,维护数据库账密,提升了数据库的安全性。

腾讯云·云开发数据库为用户提供:

  1. 自动加索引:对用户慢查询请求进行分析,并针对性的进行自动索引优化,能够在用户无感知的情况下优化数据库性能,提升系统吞吐量,提升并发能力。
  2. 自动弹性 Cgroups 按需提供计算资源:根据用户数据库负载按需调整数据库运行所需要的计算资源。
  3. 自动进行在线热迁移:当主机负载过较高时,自动在线热迁移用户实例到负载低的主机,此过程用户几乎是无感知的。热迁移同时也能够支持全局的数据库主机间的负载均衡。

云开发通过以上措施,在降低用户数据库成本的同时,为用户提供数据库弹性能力,借助这些能力,开发者较少的关注数据库。

云开发数据库还为开发者提供实时数据库推送能力,用户基于此实现实时推送类业务,降低搭建推动服务的成本。

如前文所述,数据库层是有状态的,较难进行横向扩缩容,云开发为用户提供一定的纵向扩缩容能力与优化,提升数据库性能。用户自身也需要对数据进行一定的设计优化。

3.2 访问链路的弹性伸缩能力及可靠性设计

云开发平台为用户搭建了直达业务逻辑的高性能大容量的访问链路。用户不需要搭建和维护访问链上的一系列资源服务,降低了资源和人力成本。

云开发平台的性能和可用性将直接影响到用户业务的性能可用性。云开发作为一个公有云服务,在给开发者提供各类能力支持同时,更重要的是能为客户业务提高性能高可靠的服务,为此,云开发服务对系统的可用性容量等方面进行大量的设计优化。

  • 容错:云开发服务通过链路优化、异常重试、多级缓存、缓存续期、失败降级、故障剔除等多方面的优化,提升系统系统的容错能力。
  • 容量:云开发通过容器化的服务部署方式,实现访问链路的弹性伸缩能力,具备了容器化所带来的优势,当用户流量上涨时,访问链路可随着用户流量自动的进行弹性扩缩容,避免了因访问链路瓶颈导致等用户业务受限的问题。
  • 容灾:基于容器化的部署方式,数据流接入层服务进行了多集群的服务部署,每个集群都进行了跨可用区部署,具备跨可用区的容灾能力。当单机、单可用区出现故障时,能够快速的通过集群切换进行容灾。同时,数据流服务依赖的其他服务,都具备多集群的跨 AZ 的容灾能力。

在腾讯云·云开发模式下,云开发搭建好从客户端到业务逻辑的访问链路,开发者无需关注用户端到业务逻辑之间的链路搭建以及涉及的一系列问题。同时,云开发为用户提供当前流行的 Serverless 架构能力,开发者基于轻量云函数、云托管来实现业务逻辑,无需关心基础设施,具备 Serverless 所带来的极简运维、按量计费、弹性伸缩等方面的优势。帮助开发者真正的做到了仅需关注业务逻辑层的实现,解放了开发者的生产力,让开发者有更多的时间专注于业务设计。

除了,云开发在帮助用户解决以上问题的同时,还为开发者提供了很多其他方面的能力,让开发者可以获得额外的服务能力支持。

  1. 降本增效,极简运维,降低沟通成本,免去了很多繁琐的事项,节省开发时间,在有限的开发时间中能够有更充分的时间进行业务逻辑设计。

    1. 免架构设计,对大部分场景来说,可以直接进行业务开发,不需要太多架构设计
    2. 免除服务器搭建及运维
    3. 资源按需使用按量计费,降低成本
    4. 日志、监控告警能力支持
  2. 微信原生接入,借助微信原生能力

    1. 私有链路,接入优化,高安全性,防劫持、防攻击、防刷、防薅羊毛
    2. 身份认证,原生免鉴权,可靠的用户身份信息,防冒充,防恶意用户
    3. 开放 API,原生云调用能力,方便的进行微信开发 API、微信支付 API 调用
  3. 实时数据推送,开发者搭建推送服务需要

    1. 活动开关:为开发者提供运营开关等能力支持
    2. 评论弹幕:为开发者提供评论弹幕等能力支持
  4. CMS 内容管理

    1. 活动运营:开发者可以通过 CMS 进行活动运营,如运营短信
    2. 后台管理:为开发者提供免开发的后台管理能力,节省开发成本
  5. 工具支持

    1. 小程序开发者工具
    2. CLI 命令行工具
    3. Cloudbase Framework
    4. VSCode 插件
  6. 低码平台

    1. 高效的拖拽式低代码开发平台,通过行业化模板、拖放式组件和可视化配置快速构建多端应用
    2. 基于云开发底层能力支持,云开发原生能力支持
  7. 云开发团队专家服务,帮助业务解决业务上遇到的各类问题,提供优化建议。

04. 抗住 5 亿访问,腾讯云·云开发为你保驾护航

当一种新的技术形态出现在人们面前,有人选择先观望,再决定是否尝试接纳,而有人则大胆尝试。Serverless 和腾讯云·云开发虽诞生仅两年,不妨碍云开发受到一大批开发者的追捧。目前,云开发注册账户数超过 65万,服务超过 100万开发者,云开发日均调用量近 10亿次,2021 春节期间,日服务调用量超过了 16 亿次。

云开发在腾讯游戏、微信支付、微信读书、猫眼电影、深圳机场等多样化活动上有较好的应用,帮助业务快速实现需求,平稳支持大流量洪峰。

如去年《创造营2020》决赛成团之夜,云开发保障业务稳定运行,实现了 100% 安全无死角的同时,还在投票 “秒杀” 场景下高性能地 hold 住全场,为节目的顺利进行保驾护航。

上线两周、访问次数即破 5 亿的四川省官方健康码“四川天府健康通”小程序就是基于云开发底座完成开发的。前端采用 WeApps 云开发低码的可视化、组件化、低码化等能力,后端采用了云函数、云数据库、云托管等云原生能力,充分发挥了云端低码可视化开发的优势及便利。在十余天内就高质量地完成了定制化开发工作。同时与传统开发模式相比,交付效率提升一倍,人力成本却能缩减一半。

今年春节,微信红包封面再次引爆社交网络,限时开放的个人红包封面制作活动更是直接拉低门槛,让更多人能够便捷享受到定制红包封面带来的乐趣,这活动便是搭载在云开发上,在整个活动期间平台抗住了上亿流量洪峰,资源成本仅花费几千元,有效地提高研发效率,极大降低人力成本。

c05e99fd32e8f33063f5de3aadfdead5.png

05. 总结

一个简单的系统需充分的设计才能迎接大流量活动的挑战,各种类型的系统都有一些通用的基础性的工作,腾讯云·云开发将这类通用的工作从系统中抽象出来,以服务的方式提供给用户,让开发者无需关心这些基础工作。

大流量的活动系统往往需要线上扩容的需求,云开发通过提供 Serverless 架构承载用户业务,让业务无需关系底层基础设施的同时,具备自动化的弹性扩缩容能力,帮助系统抗住大流量访问。

如此一来,云开发可帮助开发者从基础性工作中解放出来,有更多时间做业务设计、数据库设计、压力测试等工作,让系统更好地迎接大流量活动调用。

作者:刘艳杰,腾讯云·云开发高级研发工程师

Serverless 极速部署,只需三步

Serverless Framework 是构建和运维 Serverless 应用的框架。简单三步,即可通过 Serverless Framework 快速实现服务部署。

1. 安装 Serverless

macOS/Linux 系统:推荐使用二进制安装

$ curl -o- -L https://slss.io/install | bash

Windows 系统:可通过 npm 安装

$ npm install -g serverless

2. 创建云上应用

在空文件夹下输入 serverless 命令

$ serverless

访问命令行中输出的链接,即可访问成功部署后的应用。

3. 查看部署信息

进入到部署成功的文件夹,运行如下命令,查看部署状态和资源信息:

$ sls info

传送门:

欢迎访问:Serverless 中文网,您可以在 最佳实践 里体验更多关于 Serverless 应用的开发!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK