在企业里,做活动是一种十分常见的需求,有面向 C 端用户开展的活动,也有面向公司内部员工的活动。随着互联网技术的不断发展和疫情等方面的原因,线上开展的活动也越来越多,常见的形式有:内容征集、评论弹幕、点赞投票、竞猜答题、抽奖红包、组队分享、PK 排行榜等,无论是单项活动还是多种玩法,其中不乏有会产生大量并发请求的活动。
活动期间,用户在短时间内密集参与,像瓜分红包、秒杀等活动,将引发用户集中点击,产生高并发请求,对系统产生一定的压力。如果活动期间负载过高或系统崩溃,将会导致用户无法参与活动,引起用户吐槽和投诉。
然而,活动类系统很多时候仅是“一次性”的,所以大家在这类系统的开发上投入的人力物力将相对较少,甚至有些活动是研发人员利用空隙时间开发的。所以往往我们发现,如果不是进行细致的开发设计和上线前的压测,一些大活动的系统在上线后出现问题的概率是非常高的。
一个能支撑大流量的活动系统是活动能够成功的关键,接下来我们一起看下大流量的活动系统应该如何设计架构。
大流量活动系统需要应对大量并发调用,在系统设计上就要求具备水平扩容的能力来满足业务需求。通常会采用如下的分层的系统架构设计,因为活动系统功能通常比较简单,模块较少,所以系统架构不会很复杂。
通常在系统从 0~1 阶段,为了让系统快速上线,通常是不考虑分层的,但是在面对大流量活动系统时就不得不进行分层设计,分层架构可让系统更容易进行横向扩展,提升系统吞吐量,这也是大流量系统的核心需求。同时,分层架构也增加了系统的复杂度和工作量。
以上架构分为 LB、业务接入层、业务逻辑层、数据存储层等多个层次。
用户流量入口,对外屏蔽内部服务架构细节,对内提供反向代理流量转发,提升整个系统的吞吐量。LB 的核心作用是通过流量分发提升整个系统的吞吐量。
这层用来实现一些通用的业务逻辑处理,如数据编解码、用户身份校验、访问频率控制、限流降级、数据缓存、微服务入口等功能。这层通常在业务逻辑层内部通过中间件的形式实现。开发需要实现该层的业务逻辑,还需要和底层资源进行交互。
该层实现的业务功能是很多系统所需要的,多个业务逻辑层服务共用该层服务。值得注意的是,该层通常是无状态的,可以通过水平扩展增加系统吞吐能力。
业务逻辑实现的核心层,业务逻辑相关代码基本都集中在这一层。该层需要开发人员花费大量的时间进行设计实现,开发时间的多少将直接影响业务逻辑是否能够进行充分的进行设计和实现。业务性能问题,系统 Bug 常常光顾这一层。
开发者需要实现该层的业务逻辑,还需要和底层资源进行交互。该层通常是无状态的,可以通过水平扩展增加系统吞吐能力。
业务数据存储层,几乎所有的业务数据最终都需要持久化到数据库中,这层通常是系统瓶颈所在。
所有的活动类业务都需要数据库层,正常合理的使用数据库对系统性能将会产生非常大的影响。
数据存储层是有状态的,较难通过水平扩展增加系统的吞吐能力。通常是通过纵向提升数据库实例配置规格来提升数据库性能,但是纵向配置是有物理上限的,不能无限提升的。这就需要开发人员在这一层进行充分的设计,提升这一层的服务能力。
如上的系统架构是最常见最基础的分层系统架构,但在面临大流量活动系统时,即使经验丰富的开发人员,也不敢打保票说一定抗的住的。
系统各层需要考虑的问题有:
当我们把架构中每一层需要考虑事项展开之后,系统的开发工作量就不会想前面看着少了,原本看着简单的系统就不再简单,需要考虑和解决的问题非常多。
1.安全防护:防止各类安全攻击,破坏系统、盗取数据
1.基础资源:涉及计算、网络、存储等资源的创建配置管理,涉及安全扫描、安全防护、监控告警、系统优化等多访问的问题
1.数据安全:防止密码泄露数据被盗等问题
1.高性能:系统各层的处理能力及性能瓶颈,如何排除链路中的性能瓶颈及优化,排除链路中的性能瓶颈可能需要进行大量的工作才能发现
除了图中列举的,业务上还需考虑如下问题:
1.如何对用户身份进行校验保证用户身份的真实性?
当所有这些问题汇集到一起时,对开发人员产生了不小的挑战。为了使活动万无一失,我们都需充分考虑。研发团队具备:
1.系统架构:需要进行整体性的技术架构设计规划
如此一来,开发团队的精力可能会被分散到系统的各个方面,这将导致开发团队没有足够的精力聚焦于业务逻辑,也没有足够的精力解决系统面临的最核心问题:如何应对大量高并发的服务调用。
高性能高可用的架构设计原则和方案目前有很多,但要实现一个高性能高可用的系统却并非易事,其背后有非常多的具体细致的工作要做:如系统容错容灾容量等问题。
基于 Serverless 模式的腾讯云·云开发(以下简称为“云开发”),可帮助开发者解决上述问题和挑战。
业务系统概括起来需要实现两个能力:
1.业务逻辑:实现业务业务逻辑,包括前端、后端业务逻辑。部分业务逻辑为通用需求。
腾讯云·云开发对通用的访问链路以及部分通用的逻辑抽象出来进行统一的实现,帮助开发者解决通用问题。云开发提供安全、高可靠、高并发、高性能的通用后端能力基础,为开发者提供高性能高并发大容量的访问链路,让开发者无需关心链路搭建涉及的一系列问题,让业务方基于 Serverless 架构实现业务逻辑,为开发者屏蔽底层基础架构,提供高效的弹性扩缩容能力,解决业务容量问题。云开发帮助业务解决通用性问题,让开发者有更多精力专注于解决业务本身,降本增效。
传统模式和云开发模式的对比如图所示:
在云开发模式下,用户仅需关注前后端的核心业务逻辑设计实现,无需关心底层基础设施和访问链路。
开发者基于腾讯云·云开发提供的业务资源实现其业务逻辑,依托于云开发平台底层资源的弹性扩缩容能力,用户业务具备了弹性伸缩的能力,高效快速,避免了传统模式下扩容所产生了资源和人力成本。业务服务按需使用资源,按量计费,节省项目成本。
用户请求经云函数接入层 Invoker 进入到用户云函数运行时,触发用户逻辑逻辑,云函数是一种弹性的计算资源,能够自动跟随用户的并发量进行弹性伸缩,如下图所示:
每个并发的用户请求都会对应一个云函数实例,当用户请求上涨时,云函数实例自动进行扩容,当用户请求量下降时,云函数实例逐步进行缩容。弹性伸缩的过程是系统自动进行的,方便快速,为用户提供了强大的弹性伸缩能力,进而为用户业务的高并发提供了强有力的能力支持。
云开发目前为开发者提供单个云函数上限 1000 并发的能力支持,如果云函数的平均执行时间为 100ms,那么单个云函数可以达到 10000 QPS,可满足大部分用户场景的需求,50 个云函数的总 QPS 将可以达到 50W QPS。
腾讯云·云开发为用户原生提供数据库实例,用户不需要购买维护数据库实例,通过云开发 SDK,开发者可以快速开始进行业务开发,节省时间。
云数据库在接入层和数据库底层也做了非常多的专项优化,同时也在部署方面进行了诸多方面的设计。
云数据库接入层进行了分层设计并支持大规模的水平横向扩容,用户请求可在集群间进行灵活调度,应对可能出现的服务故障,提供更高的可用性和更短的恢复时间。用户请求经数据接入层服务进入到数据库引擎层,数据库接入层部署多个跨 AZ 的集群进行。数据库接入层帮助用户实现了数据库连接的维护与优化,用户无需关心数据库如何连接访问,维护数据库账密,提升了数据库的安全性。
腾讯云·云开发数据库为用户提供:
1.自动加索引:对用户慢查询请求进行分析,并针对性的进行自动索引优化,能够在用户无感知的情况下优化数据库性能,提升系统吞吐量,提升并发能力。
云开发通过以上措施,在降低用户数据库成本的同时,为用户提供数据库弹性能力,借助这些能力,开发者较少的关注数据库。
云开发数据库还为开发者提供实时数据库推送能力,用户基于此实现实时推送类业务,降低搭建推动服务的成本。
如前文所述,数据库层是有状态的,较难进行横向扩缩容,云开发为用户提供一定的纵向扩缩容能力与优化,提升数据库性能。用户自身也需要对数据进行一定的设计优化。
云开发平台为用户搭建了直达业务逻辑的高性能大容量的访问链路。用户不需要搭建和维护访问链上的一系列资源服务,降低了资源和人力成本。
云开发平台的性能和可用性将直接影响到用户业务的性能可用性。云开发作为一个公有云服务,在给开发者提供各类能力支持同时,更重要的是能为客户业务提高性能高可靠的服务,为此,云开发服务对系统的可用性容量等方面进行大量的设计优化。
容错:云开发服务通过链路优化、异常重试、多级缓存、缓存续期、失败降级、故障剔除等多方面的优化,提升系统系统的容错能力。
容量:云开发通过容器化的服务部署方式,实现访问链路的弹性伸缩能力,具备了容器化所带来的优势,当用户流量上涨时,访问链路可随着用户流量自动的进行弹性扩缩容,避免了因访问链路瓶颈导致等用户业务受限的问题。
容灾:基于容器化的部署方式,数据流接入层服务进行了多集群的服务部署,每个集群都进行了跨可用区部署,具备跨可用区的容灾能力。当单机、单可用区出现故障时,能够快速的通过集群切换进行容灾。同时,数据流服务依赖的其他服务,都具备多集群的跨 AZ 的容灾能力。
在腾讯云·云开发模式下,云开发搭建好从客户端到业务逻辑的访问链路,开发者无需关注用户端到业务逻辑之间的链路搭建以及涉及的一系列问题。同时,云开发为用户提供当前流行的 Serverless 架构能力,开发者基于轻量云函数、云托管来实现业务逻辑,无需关心基础设施,具备 Serverless 所带来的极简运维、按量计费、弹性伸缩等方面的优势。帮助开发者真正的做到了仅需关注业务逻辑层的实现,解放了开发者的生产力,让开发者有更多的时间专注于业务设计。
除了,云开发在帮助用户解决以上问题的同时,还为开发者提供了很多其他方面的能力,让开发者可以获得额外的服务能力支持。
1.降本增效,极简运维,降低沟通成本,免去了很多繁琐的事项,节省开发时间,在有限的开发时间中能够有更充分的时间进行业务逻辑设计。
当一种新的技术形态出现在人们面前,有人选择先观望,再决定是否尝试接纳,而有人则大胆尝试。Serverless 和腾讯云·云开发虽诞生仅两年,不妨碍云开发受到一大批开发者的追捧。目前,云开发注册账户数超过 65 万,服务超过 100 万开发者,云开发日均调用量近 10 亿次,2021 春节期间,日服务调用量超过了 16 亿次。
云开发在腾讯游戏、微信支付、微信读书、猫眼电影、深圳机场等多样化活动上有较好的应用,帮助业务快速实现需求,平稳支持大流量洪峰。
如去年《创造营 2020》决赛成团之夜,云开发保障业务稳定运行,实现了 100%安全无死角的同时,还在投票“秒杀”场景下高性能地 hold 住全场,为节目的顺利进行保驾护航。
上线两周、访问次数即破 5 亿的四川省官方健康码“四川天府健康通”小程序就是基于云开发底座完成开发的。前端采用 WeApps 云开发低码的可视化、组件化、低码化等能力,后端采用了云函数、云数据库、云托管等云原生能力,充分发挥了云端低码可视化开发的优势及便利。在十余天内就高质量地完成了定制化开发工作。同时与传统开发模式相比,交付效率提升一倍,人力成本却能缩减一半。
今年春节,微信红包封面再次引爆社交网络,限时开放的个人红包封面制作活动更是直接拉低门槛,让更多人能够便捷享受到定制红包封面带来的乐趣,这活动便是搭载在云开发上,在整个活动期间平台抗住了上亿流量洪峰,资源成本仅花费几千元,有效地提高研发效率,极大降低人力成本。
一个简单的系统需充分的设计才能迎接大流量活动的挑战,各种类型的系统都有一些通用的基础性的工作,腾讯云·云开发将这类通用的工作从系统中抽象出来,以服务的方式提供给用户,让开发者无需关心这些基础工作。
大流量的活动系统往往需要线上扩容的需求,云开发通过提供 Serverless 架构承载用户业务,让业务无需关系底层基础设施的同时,具备自动化的弹性扩缩容能力,帮助系统抗住大流量访问。
如此一来,云开发可帮助开发者从基础性工作中解放出来,有更多时间做业务设计、数据库设计、压力测试等工作,让系统更好地迎接大流量活动调用。
云开发(Tencent CloudBase,TCB)是腾讯云提供的云原生一体化开发环境和工具平台,为开发者提供高可用、自动弹性扩缩的后端云服务,包含计算、存储、托管等 serverless 化能力,可用于云端一体化开发多种端应用(小程序,公众号,Web 应用,Flutter 客户端等),帮助开发者统一构建和管理后端服务和云资源,避免了应用开发过程中繁琐的服务器搭建及运维,开发者可以专注于业务逻辑的实现,开发门槛更低,效率更高。
开通云开发:https://console.cloud.tencent.com/tcb?tdl_anchor=techsite
产品文档:https://cloud.tencent.com/product/tcb?from=12763
技术文档:https://cloudbase.net?from=10004
技术交流加 Q 群:601134960
最新资讯关注微信公众号【腾讯云云开发】