【CSDN 编者按】随着互联网的发展,各项软件客户量日益增多,当客户量达到一定峰值时,当数亿的流量来临时,程序的顺利进行以及及时响应尤为重要。那么,如何设计架构才能够抗住这亿级流量?

责编 | 欧阳姝黎

出品 | CSDN(ID:CSDNnews)

在业务的日常运营中,做活动是一种十分常见的需求,有面向C端用户开展的活动,也有面向公司内部员工的活动。随着互联网技术的不断发展和疫情等方面的原因,线上开展的活动也越来越多,常见的形式有:内容征集、评论弹幕、点赞投票、竞猜答题、抽奖红包、组队分享、PK排行榜等,这其中不乏有会产生大量并发请求的活动,有些活动会同时采用多种玩法形式,聚集在一起后也会产生很大量的并发请求。活动类需求通常持续时间短,用户在短时间内密集参与,像瓜分红包这种活动类似秒杀一样,会引发参与用户集中点击,产生高并发请求,对系统产生了一定的压力。如果活动期间负载过高或系统崩溃,将会导致用户无法参与活动,影响活动效果,进而导致活动失败,引起大量用户吐槽和投诉。

活动类系统,很多都是一次性的,因为花费很大精力做的再好也仅用一次,使得在对这类系统的开发上投入的人力物力可能会相对较少,甚至有些活动是研发人员利用空隙时间开发的。

具有大量并发请求的系统,如果不是进行了细致的开发设计和上线前的压测,在活动上线后出现问题的概率是非常高的。

一个能支撑大流量的活动系统是活动能够成功的关键,接下来看一下大流量的活动系统应该具备怎样的架构。

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

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

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

在这个架构中,涉及到了LB、业务接入层、业务逻辑层、数据存储层等多个层次。

LB

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

业务接入层

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

该层实现的业务功能也是很多系统所需要的,多个业务逻辑层服务共用该层服务。

该层通常是无状态的,可以通过水平扩展增加系统吞吐能力。

业务逻辑层

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

开发者需要实现该层的业务逻辑,还需要和底层资源进行交互。

该层通常是无状态的,可以通过水平扩展增加系统吞吐能力。

数据存储层

业务数据存储层,几乎所有的业务数据最终都需要持久化到数据库中。

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

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

这一层通常是系统瓶颈所在。

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

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

如图,系统各层需要考虑的问题

这个比较基本的分层系统架构,当我们把整个架构中每一层需要考虑事项展开之后,整个系统的开发部署的工作量就不会想前面的感知到的那么少了,原本看着比较简单的系统就不再简单了,需要考虑和解决的问题非常多。

流量入口LB层

  1. 安全防:防止各类安全攻击,破坏系统、盗取数据

  2. 接入质量:需要考虑使用各类网络各个地域的用户的接入质量,否则很可能有部分用户因接入质量无法参与活动

  3. LB配置维护:需要靠性能可靠性,负载均衡策略,RS更新维护与健康检查、日志监控告警等多个方面的问题

  4. 拨测监控:监控系统是否正常提供服务

  5. 网络带宽:网络带宽是否足够,带宽问题通常比较隐蔽不易发现

业务核心层

  1. 基础资源:涉及计算、网络、存储等资源的创建配置管理,涉及安全扫描、安全防护、监控告警、系统优化等多访问的问题

  2. 业务部署:涉及服务的发布变更、频控限流、容错容灾、性能优化、日志采集等诸多方面的问题

  3. 业务开发:业务逻辑设计实现,容错、容灾能力实现

数据存储层

  1. 数据安全:防止密码泄露数据被盗等问题

  2. 业务设计:数据库分库分表设计,数据库索引设计

  3. 性能优化:提升系统吞吐能力

高性能高可用

  1. 高性能:系统各层的处理能力及性能瓶颈,如何排除链路中的性能瓶颈及优化,排除链路中的性能瓶颈可能需要进行大量的工作才能发现

  2. 高可用:全链路的容错、容灾设计,如何降低避免诸如网络抖动、可用区故障等故障对系统造成的影响

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

  1. 如何对用户身份进行校验保证用户身份的真实性?

  2. 如何防刷、防止羊毛党薅羊毛?

  3. 如何对业务数据进行统计?

  4. 如何快速搭建开发、生产等多套环境?

  5. 如何快速处理线上问题?

  6. 如何进行活动运营?实现一套运营管理后台系统?

  7. 如何进行活动开关控制?定时轮询 or 活动推送?

为了使活动万无一失,以上各方面问题都是需要充分考虑的。

以上,整理出了系统可能需要考虑的各项问题,当所有这些问题汇集到一起的时候,就对开发人员产生了不小的挑战。

为了应对以上挑战,研发团队需要付出不小的努力。研发团队需要全面考虑并解决相关问题。需要研发团队具备:

  1. 系统架构:需要进行整体性的技术架构设计规划

  2. 系统运维:能够对全链路业务资源进行运维管控

  3. 业务设计:实现业务逻辑,进行容错、容灾设计

  4. 性能优化:充分考虑系统可能存在性能瓶颈,并针对性的进行设计优化

  5. 容量设计:对系统容量进行评估,如何应对超出预估的大流量调用

  6. 监控告警:主动发现系统当中的各类问题,提早排除隐患

  7. 服务部署:相关业务资源的申请及部署,业务服务的部署

当开发团队需要考虑如上各个方面的问题并进行实现时,开发团队的精力被分散到系统的各个方面了。这将会导致开发团队没有足够的精力聚焦于业务逻辑,也没有足够的精力解决系统面临的最核心的问题:如何应对大量高并发的服务调用。

高性能高可用的架构的设计原则和方案目前已经非常丰富了,但是要实现一个高性能高可用的系统却并非易事,其背后有非常多的具体细致的工作要做:例如,系统往往需要考虑容错容灾容量等非常多的问题。基于Serverless模式的云开发模式便可以帮助开发者解决上述问题和挑战。

Serverless 云开发:解题之法?

如上文所提到的开发者面临的各项问题,云开发可能是目前最系统化的解决方案之一。

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

  1. 业务逻辑:实现业务业务逻辑,包括前端、后端业务逻辑。部分业务逻辑为通用需求。

  2. 访问链路:搭建高性能大容量的访问链路,连通用户侧和业务逻辑层。这是通用需求。

云开发服务对通用的访问链路以及部分通用的逻辑抽象出来进行统一的实现,帮助开发者解决通用问题。

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

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

从图中可以看到,在云开发模式下,用户仅需关注前后端的核心业务逻辑设计实现,而无需关心底层基础设施访问链路

云开发服务架构

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

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

云函数

云函数平台架构如图所示:

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

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

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

云数据库

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

云数据库在接入层和数据库底层也做了非常多的专项优化,同时也在部署方面进行了诸多方面的设计。云开发数据库架构如图所示:

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

云开发数据库为用户提供以下方面的能力支持:

  1. 自动加索引:对用户慢查询请求进行分析,并针对性的进行自动索引优化,能够在用户无感知的情况下优化数据库性能,提升系统吞吐量,提升并发能力。

  2. 自动弹性Cgroups按需提供计算资源:根据用户数据库负载按需调整数据库运行所需要的计算资源。

  3. 自动进行在线热迁移,当主机负载过较高时,自动在线热迁移用户实例到负载低的主机,此过程用户几乎是无感知的。热迁移同时也能够支持全局的数据库主机间的负载均衡。

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

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

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

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

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

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

容错方面:云开发服务通过链路优化、异常重试、多级缓存、缓存续期、失败降级、故障剔除等多方面的优化,提升系统系统的容错能力。

容量方面:云开发通过容器化的服务部署方式,实现访问链路的弹性伸缩能力,具备了容器化所带来的优势,当用户流量上涨时,访问链路可随着用户流量自动的进行弹性扩缩容,避免了因访问链路瓶颈导致等用户业务受限的问题。

容灾方面:基于容器化的部署方式,数据流接入层服务进行了多集群的服务部署,每个集群都进行了跨可用区部署,具备跨可用区的容灾能力。当单机、单可用区出现故障时,能够快速的通过集群切换进行容灾。同时,数据流服务依赖的其他服务,都具备多集群的跨AZ的容灾能力。

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

总的来说,除了上述的降本增效、微信原生之外,云开发还提供了CMS内容管理、开源工具插件和低代码开发平台等能力和服务支持,帮助用户更快更好地进行开发。

有点前卫,但已有不少人尝到甜头

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

除了帮开发者排忧解难,云开发也帮助过腾讯游戏、微信支付、微信读书、猫眼电影、深圳机场等腾讯内外部客户完成了多样化的活动类需求,帮助业务快速实现需求,平稳支持大流量洪峰。

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

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

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

 

总结

即使一个非常简单的系统也需要进行充分的设计才能迎接大流量活动的挑战,各种类型的系统都有一些通用的基础性的工作,云开发将这类通用的基础性的从整个系统当中抽象出来,以服务的方式提供给用户,让开发者无需关系这些通用的基础性的部分的开发部署工作。同时,所有大流量的活动系统,都需要线上扩容的需求,云开发通过提供Serverless架构承载用户业务,让业务无需关系底层基础设施的同时,具备自动化的弹性扩缩容能力。这样,用户基本上什么都没做,就已经具备了一定的面对大量并发的能力。

当然,云开发服务并不可能帮助开发者解决全部的问题,开发者业务服务内部的性能问题还是需要开发者自己来解决。但是当开发者从通用的基础性功能的开发工作中解放出来的时候,将会有更多的时间进行业务设计、数据库设计、压力测试等方面的工作,让整个系统有更充分的准备迎接大流量活动调用。

《大咖来了》直播今晚 20 点正式开始:揭晓开源软件融资 3 个亿的秘密。点击阅读原文直达大咖来了直播间!



☞拼多多超越阿里,成中国电商第一平台 ;爱奇艺起诉 B 站;华为收取 5G 专利费为最低 | 极客头条☞不如安卓?iPhone 12 5G 速度上演“滑铁卢”
☞谷歌苹果齐降税,却没能拯救开发者的“钱包”!
☞Flutter 不是真正的跨平台框架
Logo

20年前,《新程序员》创刊时,我们的心愿是全面关注程序员成长,中国将拥有新一代世界级的程序员。20年后的今天,我们有了新的使命:助力中国IT技术人成长,成就一亿技术人!

更多推荐