当前位置: 首页 > 科技观察

交通洪峰下云开发高可用架构设计分析

时间:2023-03-12 18:42:31 科技观察

1.前期疫情期间,随着大量人员返岗复工,疫情传播风险巨大,防疫和控制也面临着新的严峻挑战。为更好收集流动人口信息,云南省公安厅推出公共场所“云南抗疫”小程序,对公共场所流动人口信息进行登记。具体措施是:各场所提前申请进出场所二维码。进入公共场所时,人员扫描“进入”二维码进入场所;离开时需扫描“离开”二维码离开。二维码包含本单位及相关负责人的相关信息,人员出入公共场所需扫码。上线不到一个月,截至3月12日,“云南抗疫”扫码小程序公共场所注册量超过103万,扫码注册量3.65亿,扫码用户超过1755万.各类公共场所二维码注册生成请求量超过10w/min,扫码注册请求量超过80w/min。云开发服务的高效性和稳定性,将直接影响到人们进出各地的效率。那么,如何应对短期流量高峰,保证小程序功能的正常使用呢?如何优化小程序的响应速度,保持高并发下的快速响应?2.高并发,不可忽视的业务技术挑战高并发对于任何服务来说都是一个很大的技术挑战。在传统模式下,一方面要求业务研发人员具有一定的业务预见性,能够提前对业务高峰做出相对准确的预测。太多会造成资源浪费,太少会影响经营成果。另一方面,需要研发人员合理设计业务架构,提前部署大量资源,甚至进行大量压力测试以保证可靠性。不仅如此,还有开发运维等人员的参与。可以说在传统开发模式下处理高并发问题需要耗费大量的人力物力,代价高昂。但是,这些高并发问题在云开发模式下相对简单很多。作为支持多端开发的云+端一体化解决方案,云开发采用Serverless架构,足够轻量灵活,可无限自动横向扩展,支持海量并发请求。对于开发人员来说,使用云开发是一种典型的NoOps实践。随着请求量的不断增长,云开发可以自动扩容,保证云开发业务的高性能和高可用,按需使用资源,开发者无需提前部署大量资源来应对具有高并发性。这节省了可观的资源成本。此外,通过各种端侧SDK的云端开发,可以轻松实现包括微信小程序、QQ小程序、WEB端、移动应用等多端开发,只需要专注于开发者自身的业务实现无需关心传统的C/S架构中的服务端基础设施,可以快速开发上线业务,大大提高开发效率,降低研发成本。目前,云开发日均调用量超过7亿次,微信阅读、拼多多等客户的单一环境请求量已达1亿次以上。3.面向云开发的高性能高可用架构设计云开发作为公有云服务,不仅要为开发者提供各种能力,更重要的是为客户提供持续不间断的服务。这里,云开发的高可用包括两个方面:一是保证云开发自身服务的高可用,可以提供不间断的服务;二是为客户提供高并发支持,确保客户业务持续增长。客户业务高可用。另一方面,云开发服务的调用环节上有大量的功能模块,这就要求云开发内部的所有功能模块都是高性能、高可用的。目前,云开发服务的内部依赖模块日均达到99.99%以上。服务可用性和极短的响应时间。那么云开发如何保证高可用和高性能呢?我们来看一下云开发的整体架构:从图中可以看出,一个用户的服务调用需要经过多个中间层服务,最终到达客户资源层。因此,云开发服务的高可用和高性能是从一个大层面上来的。可以分为“数据链”和“底层资源”两个方面。目前,云开发系统的“数据链路”和“底层资源”可用性均超过99.99%。数据链路应用从端侧SDK开始,通过一系列服务模块访问云资源(云函数、数据库、文件存储),最终到达资源层。这个调用链路对开发者来说是透明的、不可感知的。因此,这部分在这里统称为“数据链路”。数据链路为用户提供设备端与云资源端的连接。数据链路不仅是数据的转发和传输,还包括微信登录认证、票据生成和校验、数据Codec、云账号身份认证、集群路由、云资源信息绑定、安全规则等一系列处理逻辑、数据签名与验证、上下文信息注入、访问计数、并发控制等方面的能力支撑模块。云开发服务每一层的服务模块部署在多个集群中,集群中的每一层和每个服务模块也跨多个机房冗余部署,提供足够的冗余度,并自动发现和剔除故障主机,确保它可以在服务出现故障时快速屏蔽,保证云开发服务的高可用。此外,数据管道还为资源部署提供了足够的容量支持,并有一定数量的Buffer,当需要有用容量时可以快速扩展。部分模块也开始尝试容器化部署,实现更快的弹性扩展。链接是用户请求能否成功到达客户端资源的关键,链接耗时也会对用户请求的总耗时产生直接影响。因此,保证链路的高可用和高性能非常重要。云开发团队在性能和可用性方面也做了很多设计优化。以下是一些设计和优化点:尽可能简单,不引入不必要的依赖,尽可能减少依赖;无状态设计,每个模块都是无状态的,便于在系统请求量增大时快速水平扩展;可降级设计,链路中的每个模块都设计成可降级的,当单个模块出现问题时,可以自动或手动降级到备份方案,有自下而上的解决方案;多级缓存设计,系统中有多级缓存设计,提高系统性能;故障自动切换,链路上下游主机能自动发现并淘汰故障主机,快速恢复服务;多集群部署,链路中各模块已跨机房跨多个集群部署,故障可切换;重试策略,针对系统中可重试的场景设计重试机制,保证成功率;网络策略优化,长连接优化,部分模块内部使用更高效的RPC调用;采用更高性能的实现方式,减少耗时;快慢请求分离,快请求是同步的,慢请求是异步的,以提高性能。底层资源的高可用是云开发服务高可用的关键部分。这部分将分别介绍“云函数”和“云数据库”。CloudFunction优化CloudFunction在架构上充分考虑了高可用,在部署上做了充分的冗余。下图展示了CloudFunctions的高可用部署架构。从图中可以看出,从接入层到资源层,云功能在每一层都部署在多个集群中,每个集群跨机房部署。集群内单机或单机房故障系统可自动发现并快速排除。这种部署方式可以应对单机故障、机房网络故障等设施故障。集群故障还可以快速切换用户集群,快速恢复服务,缩短宕机时间,保证高可用。此外,这种部署设计还便于更大范围的横向扩展,提供更大的系统并发能力,以满足客户不断增长的业务需求。在云函数资源的底层,有很多高并发请求。首先,必须有足够的计算资源来承受高并发。云端的云函数开发底层建立了一个超大规模的资源池,也预留了大量的Buffer资源,云函数系统从资源池中分配资源给函数实例。当资源池消耗到一定程度时,系统可以自动申请云端VM资源,快速扩容资源池,实现多级横向弹性伸缩,应对开发者可能出现的需求。海量业务需求。同时,在发布策略上,以集群的方式进行渐进灰度化。如果出现系统错误,它只会影响少量请求。目前,CloudFunction已完成新一轮系统架构升级,以更高的可用性和性能迎接未来更大并发的挑战。云函数在执行性能方面也做了很多优化。熟悉云开发的开发者应该明白,一次函数调用都会涉及到函数的启动,而启动又分为冷启动和热启动。热启动很快,而冷启动相对较慢。冷启动过程如图所示。通过对比可以看出,冷启动需要创建函数实例,创建过程包括多个子任务,如下载函数代码、部署函数等,通常需要数百毫秒。启动时间对云函数的性能非常关键,因此云函数性能优化的重点之一就是降低冷启动率和冷启动时间。CloudFunctions在启动时间方面也做了很多优化:优化代码下载时间,在虚拟机和可用区构建多级缓存,提高云函数代码包的下载速度;优化功能网络部署策略,减少部署成本时间;优化容器启动,减少启动时间;基于用户请求量变化趋势和周期性请求量变化规律,准实时预测云函数并发量,提前扩容;支持版本别名,用户可以将代码更新为RollingUpdate方式,新旧版本替换,保证热启动率;优化函数实例预留时间,保证整体低冷启动率。云函数底层也采用了腾讯云自研的轻量级虚拟化技术。MicroVm启动时间缩短至90毫秒,函数冷启动缩短至200毫秒,支持数万计算节点同时扩展;随着互联网和性能的不断优化,部署云函数实例的各个阶段耗时也在不断减少,云函数的冷启动时间也在不断减少。为客户提供更高的可用性和性能支持。云开发目前为开发者提供了单个云函数1000并发的能力支持,假设一个云函数的执行时间为100ms,单个云函数可以达到10000QPS,已经可以满足大部分用户场景的需求,50个云函数总QPS就能达到50WQPS。云数据库优化云数据库在接入层和数据库底层也做了很多专项优化,在部署方面也进行了很多方面的设计。云数据库的部署架构如图所示。从架构图中可以看出,云数据库访问层采用分层设计,支持水平横向扩展。所有的用户请求都会分配给不同的主机,每个主机独立维护用户数据库连接。这种方式保证了数据库访问层可以大规模水平扩展。此外,部署中还进行了多集群策略部署,可在集群内自动发现并淘汰故障主机。不同的用户分配到不同的接入集群,用户请求可以灵活调度到多个集群,以应对可能出现的服务故障,提供更高的可用性和更短的恢复时间。发布策略也可以更靠谱,灰度按集群进行,影响范围小。数据库引擎实例也是跨主机部署多个数据库实例,当单个数据库实例出现故障时可以自动转移。每天对每个数据实例进行数据全量备份,并保存在对象存储中,确保用户数据安全。当用户数据出现问题时,可以回滚数据,也间接为用户提供了一定的业务可用性支持。数据底层也会支持在线热迁移。当主机负载过高时,用户实例会自动在线迁移到负载低的主机上。用户几乎没有意识到这个过程。实时迁移还可以支持数据库主机之间的全局负载平衡。目前数据库还提供了自动索引能力,可以自动分析用户慢查询请求,并进行有针对性的自动索引优化,可以在用户无感知的情况下优化用户查询性能,让开发者少关心数据库性能优化,你可以有一个卓越的性能体验,减轻客户负担,更专注于自己的业务逻辑。4、如何利用云开发优化高并发业务?云开发虽然为开发者提供了便捷的云服务能力,同时期望能尽可能解决开发者在使用过程中遇到的所有问题,但这显然是一个永无止境的长期追求。其实开发者在这方面也可以有很大的想象空间和发挥空间。开发者在面对高并发需求时,可以通过云开发做哪些优化?一般高并发业务按照并发增长模型来划分,可以分为以下两种形式:业务量增长相对缓慢,并发量逐渐增加,上升速度平缓,系统有充足的热身时间;业务并发量爆发,并发量瞬间上升,上升速度非常快,比如常见的秒杀业务。对于并发增长比较均匀的第一类业务,直接使用云开发就可以轻松搞定。对于正在经历爆发式增长的第二类业务,通过一定的策略和技术优化也可以更轻松应对。云函数处理高并发请求的难点在于弹性。弹性支持服务资源的按需部署,可以为开发者节省大量的资源成本。但这也是因为弹性。在面对瞬时高并发需求时,服务瞬间面临比原来大几十倍甚至上百倍的并发请求。云函数伸缩系统很难预测到这种爆发式增长,因为冷启动时间相对较长,弹性扩容机制难以秒级部署大量云函数实例,跟不上并发增长,热启动率下降,启动时间变长,进而导致部分请求超时,甚至出现超并发。结果,活动参与者因未能参与而放弃,活动效果没有达到预期。如何解决这个问题呢?策略优化方案提前评估活动并发量和QPS等指标;对活动进行充分预热,统计并重新评估活动较热阶段的参与人数和并发人数;功能预热,不通过参数控制执行业务逻辑,也可以采用其他方式或多种方式预热;评估完并发后,别忘了评估包是否能满足业务需求。云开发提供免费和包月两种计费模式。业务方可根据实际情况调整套餐,或转为按量计费,避免因套餐限制影响业务。技术优化方案技术优化的核心是一点:减少时间消耗。云函数可以通过以下方式进行优化:减少对依赖服务的调用次数,例如请求合并;减少依赖服务的响应时间,如耗时的数据查询、耗时的其他接口调用等;并发调用依赖服务;根据业务逻辑将多个功能合并为一个功能,或者将一个云功能拆分为多个云功能;精简代码,减少依赖,减少函数体积,缩短冷启动时间。在数据库方面,虽然云开发已经针对数据库查询自动优化了索引,但是系统对用户业务逻辑和数据的设计与业务方有很大的差距,因此业务方的研发团队可以在查询性能等方面进行优化。针对高并发场景,一些优化建议如下:通过创建高效的索引,提高数据库查询效率;通过优化设计减少数据库查询;使用高效的查询条件;减少返回数据个数和字段个数,减少数据库查询时间和网络数据传输时间;减少事务的使用,尽量使用替代方法;排名等聚合需求,可将中间结果保存到数据库或缓存中,避免每次统计计算;数据量大,集合层次可以拆点,减少单集数据量,提高查询效率。事实上,虽然从云服务的角度来看,云开发数据库资源层是海量的,但单个数据库实例的计算能力是有硬件上限的。当有很多慢查询时,数据库系统会大大降低,从而影响大量的数据库操作,整体上会拖慢开发者自身的业务响应时间,影响业务能力。云开发还计划推出慢查询日志、慢查询告警等能力,为数据库优化提供最佳实践。其他建议:对系统进行一定程度的实际压测,验证设计和实现是否达到预期,提前解决,避免活动上线后达不到效果;实施独立的事件业务,避免事件影响现有业务。5.作者介绍颜杰,腾讯高级前端开发工程师。云开发团队的核心开发专注于中后台系统的开发和系统架构设计。