前言
这节我们主要聊聊在分布式环境中,常见的八种扩展系统的最佳策略:无状态服务、水平扩展、负载均衡、自动扩展、缓存、数据库复制、数据库分片、异步处理。
无状态服务?
无状态服务是一种不需要保存任何数据状态的服务,也不需要维护任何会话信息的服务。这种服务通常被设计为可扩展和高可用性的,因为它们可以在任何时间点部署或删除,而不会对应用程序的可用性产生影响。无状态服务的优点包括可扩展性、高可用性和简单性。
如我们在项目中开发的微服务,通过注册中心Nacos注册服务,服务的上线或下线 应该是不影响服务的调用者。对服务的调用者应该是无感的。
水平扩展
是指通过增加更多的服务器或者程序实例来分散负载,从而提升存储能力和计算能力。只要增加服务器数量,就能线性扩充系统性能。水平扩展对系统架构设计是有要求的,如何在架构各层进行可水平扩展的设计,是我们在架构设计阶段需要思考的问题。
在数据量很大的情况下,数据层(缓存,数据库)涉及数据的水平扩展,将原本存储在一台服务器上的数据(缓存,数据库)水平拆分到不同服务器上去,以达到扩充系统性能的目的。
在高并发的场景下,我们可以适当增加服务器数量来达到分摊压力的目的。
负载均衡
SLB(Server Load Balancer)是一种对流量进行按需分发的服务,通过将流量分发到不同的后端服务来扩展应用系统的服务吞吐能力,并且可以消除系统中的单点故障,提升应用系统的可用性。
常用的负载均衡软件有:Nginx、HAProxy、LVS
自动扩展
使用微服务构建应用程序使您可以在高负载期间增加微服务实例的数量,并在负载较少的情况下减少它们。如:以www.taobao.com为例,在双11期间它的负荷非常高,高达正常负荷的很多倍。然而,在春节和重大环境灾难期间,负载量可能会少得多 - 因为每个人都在忙着观看春节联欢晚会或者交通不便导致的商品无法快递。简单理解就是:自动扩容或缩容。
缓存
Mysql是关系型数据库,它是基于严谨的关系表构建,确保数据持久化于磁盘之上。Redis是NOSQL数据库,即非关系型数据库,也是缓存数据库,即数据存储在内存中,缓存的读取速度快,能够大大的提高运行效率。磁盘的数据读取和内存的数据读取速度通常不在一个数量级。
在日常开发中,我们往往使用缓存存储频繁访问的数据,以提高用户体验。
数据库复制
?数据库复制是一种在?企业数据库中广泛应用的技术,旨在通过在不同位置创建数据的多个副本,以提高系统的可用性和可靠性。 数据库复制技术允许数据在多个位置实时同步,确保数据的一致性和完整性,从而增强系统的容错能力和性能。?
常见的数据库复制结构有:一主一从 结构,一主二从结构,多主多从结构
数据库分片
数据分片指按照某个维度将存放在单一数据库中的数据分散地存放至多个数据库或表中以达到提升性能瓶颈以及可用性的效果。 数据分片的有效手段是对关系型数据库进行分库和分表。分库和分表均可以有效的避免由数据量超过可承受阈值而产生的查询瓶颈。 除此之外,分库还能够用于有效的分散对数据库单点的访问量;分表虽然无法缓解数据库压力,但却能够提供尽量将分布式事务转化为本地事务的可能,一旦涉及到跨库的更新操作,分布式事务往往会使问题变得复杂。 使用多主多从的分片方式,可以有效的避免数据单点,从而提升数据架构的可用性。 使用非常 广泛的分库分表组件有:概览 :: ShardingSphere、MyCat2 等。
通过分库和分表进行数据的拆分来使得各个表的数据量保持在阈值以下,以及对流量进行疏导应对高访问量,是应对高并发和海量数据系统的有效手段。 数据分片的拆分方式又分为垂直分片和水平分片。
垂直分片
水平分片
异步处理
异步处理是一种设计理念,它可以解耦业务,降低接口响应时间,提高系统性能和吞吐量,适用于对数据强一致性要求不高的场景。通过创建新线程、线程池、SpringBoot的@Async注解以及Java8的CompletableFuture、和MQ消息 处理业务。