一个典型的大型互联网应用系统使用了哪些技术方案和手段,主要解决什么问题?请列举描述。
面临的问题
既然我们要分析的是大型互联网应用,那么我们就从“大型”和“互联网”这两个限定描述来进行分析。首先,从应用本身来看,“大型”意味着应用的功能应当是全面的,业务是复杂的、内容和结构是丰富的,而从规模上看“大型”表明该应用的总用户数、活跃用户数、同时在线人数都应当达到相当大的量级,例如百万级、千万级甚至亿级。“互联网”意味着这个应用是通过互联网来访问和使用的,面向的是互联网用户,运用的是互联网应用相关的技术栈,其特点、优势、 瓶颈以及发展方向也与互联网的发展息息相关。
高并发、大流量
应用需要面对海量的用户访问请求,需要快速对请求作出响应。正是由于用户数量的庞大,因此任何有损用户体验的操作,例如卡顿、阻塞、网络连接失败,都有可能流失大批用户,从而造成严重的损失。由于同时在线人数众多,因此传输的内容总量也十分巨大,需要耗费非常大的流量和带宽资源,对于计算型的业务,也需要消耗大量的计算资源。
高可用
上一段说到,大型互联网应用任何的请求失效都有可能覆盖到海量的用户,严重的时候会带来巨大的损失,例如淘宝在双11秒杀活动期间如果突然无法访问,将会损失上百亿的交易额。因此大型互联网应用必须做到业务随时可用、可靠,即便是部署的物理设备出现故障、需要升级或更换,也不能影响到服务和业务的持续性。
海量数据
上面提到,大型互联网应用的规模庞大,为了满足海量用户的需求,需要为不同的用户提供不同的内容,因此整个应用的数据量非常巨大。如何对海量的数据进行存储、管理、检索也成为了难点所在。
异构
由于互联网应用需要服务五湖四海的互联网用户,各个用户所处的网络环境、使用的终端可能各不相同,为了让身处各地的用户都能享受到一致的使用体验,互联网应用需要针对不同地区的网络环境进行优化,并适配不同的访问设备。另一方面,应用本身的部署也很难做到全部使用同一型号的设备,因此在部署上同样存在着设备的异构,但却要使用这些异构的设备提供一致的服务。
安全性
大型互联网应用面对着互联网上各类用户,必须要考虑数据的安全性和应用本身的健壮性,避免被恶意用户攻击,避免泄露用户数据。
业务变化
大型互联网应用一方面要满足各种用户的个性化需求,另一方面巨大的规模决定了应用必须跟随市场需求不断变化、占据优势,才能得到可持续性的发展。因此,大型互联网应用的业务需求总是处在不断变化中,应用本身的设计应当支持业务的快速变更、迭代。另外,互联网应用很难做到从一开始就拥有巨大的规模,因此应用本身的规模发展也是渐进式的,需要支持从小型应用像大型应用演进,并在这个过程中持续优化业务。
解决方案
针对以上列出的种种问题,互联网领域在数十年的发展过程中积累了一系列通用、可靠的解决方案,正如之前的文章对“模式”的定义一样,这些可复用的方案便被称为“架构模式”。
分层、分离
前面讲代码的设计模式时提到,分层是为了解耦,在架构模式中,分层同样具有解耦的作用,但更大程度上是为了以化整为零的方式来应对高性能和高可用问题。早期将各类服务部署在一台机器中,这台机器的性能和可用性就决定着整个应用的性能和可用性,一旦机器出现故障,整个应用都将无法使用。对服务进行分解、划分不同的层次和调用关系,根据性能要求选择不同的服务器来部署,这样的分层方案可以有效提升整个应用的性能和可用性,也有助于分解出来的各个层级独立演进和更换。
除了分层,互联网应用根据不同请求响应的操作特性不同,还可以对这些请求进行分离。例如动静分离是将读操作中对静态资源的请求和对动态资源的请求分离开,静态资源可以使用缓存等技术实现快速响应,动态资源则需要请求后端服务或数据库。数据库本身也可以将读请求和写请求分离开,将读库操作和写库操作指向到不同的数据库实例上,从而解决读写请求之间的量级差异。
缓存
上面提到,在对读操作进行加速的时候可以使用缓存技术。缓存是将请求结果暂存起来,当再次请求的时候就可以直接从缓存拿取结果,而无需反复消耗后端服务资源。缓存服务常使用内存作为存储,从而最大程度提升读操作的响应速度,对于互联网应用来说,缓存极大减轻了后端服务响应海量读操作的压力,并显著提升了用户获取读操作结果的速度。CDN是一种更大规模的缓存服务,它是将互联网应用的静态资源副本存储到各地区不同的机房中,解决的是跨地域、跨网络读请求带来的延时和不稳定,能够为用户提供近端的快速读取响应。
集群
随着互联网应用规模的不断扩大,每种服务仅使用一台机器显然是无法满足高并发、高性能、高可用要求的,因此针对不同的服务可以使用集群化的部署方案,使用一批服务器同时提供服务。集群需要与路由配合使用,路由是将不同用户的请求分配到集群中不同的服务器上,确保不同用户都能够获得一致性的使用体验,并且对于集群这一物理结构本身是无感知的。路由的实现方式包括DNS、反向代理、负载均衡等。
分布式
集群一定程度上解决了各种服务的瓶颈,但其本身的作用只是将请求进行分组,因此每台服务器部署的都是完整的服务副本,对于服务本身来说,随着其数据量越来越大,单台服务器显然无法承受,这时候就需要将服务进行分布式改造,使得同一个服务能够在多台服务器甚至多个网络之间进行部署,从而实现服务的无限扩容。这其中包括了分布式文件系统、分布式数据库、分布式缓存、分布式对象存储等具体的技术实现方案。在对数据库实现分布式改造时,包含分区、分库、分表、分片等技术,这些技术从物理和逻辑两个层面对数据库进行拆分并部署到不同的服务器上。此前多个服务共用数据库的,可以通过分库方式为各个服务单独提供数据库,减少不同服务之间的数据耦合。一张表的数据过多时,可以使用分表方式将数据表拆分成多个部分,并通过特定的算法将读写请求路由到指定的部分上。分区和分片技术则是在物理层面对数据库的存储进行拆分,使数据库不受服务器存储容量的限制。
异步
随着业务和系统架构越来越复杂,即便是采用了上述手段对请求进行了分流,但还是难以应对例如秒杀场景这样突然暴增的请求数量,另一方面,海量请求如果都使用同步处理,会极大增加服务的压力,增加响应时间,从而影响用户体验。因此,互联网应用大量使用异步调用的方式,无论是前端还是后端,都可以对请求先行响应,再异步地进行处理。异步操作的引入导致了对数据一致性的要求从强一致性变为最终一致性,因此在业务设计上也应当采取适当的手段来适配最终一致性这一特点。消息队列是在异步操作中官方使用的技术手段,除了可以对请求进行排队、异步处理之外,消息队列还实现了削峰填谷的功能,对突然暴涨的流量进行缓冲,减少后端服务的压力,以合适的量级将队列中的请求逐步推送给后端进行处理。
非关系型数据库、大数据平台
随着数据库存储数据的不断增加,数据结构随着业务发展而变得越来越复杂,查询请求的处理难度也越来越大。因此,互联网应用引入非关系型数据库、全文搜索引擎、大数据平台等技术来实现海量数据尤其是非结构化、非关系型数据的快速查询。这一方案可以与缓存方案相结合使用,即将后端查询的结果以非关系型的结构重组后存储在缓存中,进一步加快前端业务获取所需数据的速度。
安全
在安全性方面,互联网应用可以借助目前市面上已经完善的各类云服务,减轻自行部署、运维的压力,提升应用的整体安全性和防御能力。另一方面,硬件和软件防御措施的不断增强也是互联网应用发展过程中所必不可少的。采用一些现代化的安全手段,例如非对称加密、两步验证、扫码登录、加密通信等,能够很大程度上防止关键数据被非法窃取。网关、反向代理、CDN等设施中的安全路由设计也能很大程度上减少恶意攻击请求直接到达后端服务的概率。
业务拆分
随着业务的发展,业务规则和模式的不断复杂化也给架构带来了挑战。如何快速应对业务的变化,如何满足新业务的快速上线和更迭,这是互联网应用达到多业务并行规模后必须考虑的事情。近年来微服务架构、中台战略思想正是用来解决这方面的问题,借助DDD等有效的业务建模手段对复杂的业务线进行重新的梳理、拆分、建模,能够更好地指导架构为业务服务。这些方法和思想的关键就在于将业务的通用部分和特性部分进行分解,提升通用部分的可复用性,并为不同业务线的特性部分服务,同时通过合理的边界划分和建模,提升不同部分演进的效率,减轻彼此之间协作对接的难度。