首页 > 数据库 > 数据库开发技术 > 一个好的分布式架构设计都应该考虑什么
分布式架构设计指南

无论当前处于数字化时代还是数智化时代,我们都面临着越来越多复杂的软件系统需求。而为了应对这些挑战,分布式架构已经成为了一种关键的设计方式。今天我就来和大家分享一下,如何设计一个好的分布式系统,都应该注意什么,包含哪些部分,也欢迎大家在评论区一起探讨。话不多说,直接上干货:
1、网关
大家可能想不到,我第一个要说的,竟然是网关。因为在我看来,网关是系统安全的第一道屏障,重要性不言而喻。网关也分多个种类,比如:
安全网关:这些网关专注于网络安全,包括防火墙、虚拟专用网(VPN)网关等。
网络层网关:这些网关在网络层协议中工作,如IP网关,用于路由和转发数据包。
应用层网关:这些网关在应用层协议中工作,如HTTP网关、SMTP网关等,用于协议转换和过滤应用层数据。
数据链路层网关:这些网关在数据链路层协议中工作,如以太网网关,用于处理数据帧。
我们大多数时候,会在应用层网关做很多处理,常见的有:请求鉴权、数据完整性检查、路由转发、服务治理(限流、降级、熔断等)、热切换开关等
常用的网关组件对比,参照下图:

2、高可用设计
什么是高可用?为什么需要高可用设计?简单来说就是服务端需要7*24小时运行;而客户端需要任何人在任何时间、任何地点、访问任何服务,都可以得到正确的结果。否则可能会因为短时间内流量突发,引起系统不可用或者说得不到期待结果的状态。而常见的解决方案,我总结后,主要是下面这几类:
服务冗余(备份机)
负载均衡
幂等设计
超时机制
异步化设计
服务限流降级熔断
数据缓存/分库分表
数据一致性
架构拆分
实时监控
服务分级
后面会重点对幂等设计、服务限流降级熔断、服务分级这几个进行说明。
3、高并发设计
高并发设计和高可用设计的关注点不一样,但是二者又有密切的联系。评估高并发一般有两个重要指标,分别是吞吐量(Throughput)和响应延迟(Response Delay)。
对系统进行优化,高并发设计的目标主要是这三点:1、提高并发数(增加吞吐量) 2、缩短响应时间 3、让系统处于合理状态
优化手段本质上:是空间和时间的一个平衡。下面来具体解释下:
场景一:系统时间是瓶颈。解决方案:空间换时间。
比如:缓存复用计算的结果,降低时间开销,因为CPU时间比内存容量更加昂贵。
场景二:数据大小是瓶颈。解决方案:时间换空间。
比如:网络传输是瓶颈,使用系统时间换取传输空间,使用http的gzip压缩算法。
再比如:app请求分类接口,使用版本号判断哪些数据更新,只下载更新的数据。
其实最关键的是找到系统瓶颈。需要分析现有系统业务流程,找到关键路径并分解优化。
4、幂等设计
幂等主要是对接口而言的,接口的幂等性实际上就是接口可重复调用,在调用方多次调用的情况下,接口最终得到的结果是一致的。一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。
幂等分析(本质上是数据的CRUD):
Create/Insert:如果有自增主键,肯定是不幂等设计的,但是如果拿业务主键去判断,肯定幂等。因为同样的数据只能插入一条。
Read/Select:天生幂等。
Update:
Update xxx set age=19 where uid=11-----修改的是绝对值,幂等
Update xxx set age++ where uid=11------修改的是相对值,不幂等
Delete:
Delete xxx where uid=11-----删除的是绝对值,幂等
Delete xxx where uid in bottom 10------删除的是相对值,不幂等
解决方案:简单的见招拆招,db层面解决,复杂的就是分布式事务问题。业务层面的幂等,本质上是分布式锁问题。
5、熔断降级
首先,我们先来理解下什么是服务降级,当服务整体负载超出预设的上限阀值或即将到来的流量预计将会超出预设阀值时,为了保证重要或基本的服务能正常运行,拒绝部分请求或将一些不重要的服务进行延迟使用或暂停使用。
目标:保证核心服务可用。
策略:服务层降级、数据层降级、柔性可用策略。
服务降级的手段主要是:拒绝部分请求和关闭部分服务。
拒绝部分请求:
拒绝部分老请求:比如在队列中,超过1s时间的请求直接抛弃。
优先请求方式:非核心请求直接抛弃。
随机拒绝方式:随机丢弃一定比例请求,网站时而可用,时而不可用。
关闭部分服务:主要是关闭部分业务逻辑层和数据访问层。
下面再来说说服务熔断,服务熔断,主要是微服务化,分布式部署之后,随着系统规模的增长,整个系统发生故障的概率也会增加,而我们希望非关键路径上发生服务质量下降的情况下,可以尽可能屏蔽所造成的影响。
服务熔断的主要手段有下面三种:
规定熔断后统一返回默认值(null),统一处理。
打印熔断日志,同时返回Exception(业务方定制了熔断方法),进行报警处理(比如发钉钉)。
服务治理平台监控服务状态,实时下发阀值配置。
6、服务分级
系统功能复杂的时候,我们需要对系统的服务进行分级,以便更好的评估和管理整个系统,下面来介绍下如何对系统进行分级,一般都需要做什么。
首先,我们应该先明确,服务分级的定义标准是什么?

其次,我们要对系统的服务进行划分

最后,我们要对事故定级,定义影响程度大小


7、灰度发布
系统的部署策略往往容易被人所忽视,但也是非常重要一环,而最常用的部署策略就是灰度发布。那什么是灰度发布?
灰度发布是系统发布者根据某种规则,让一部分用户继续用原来系统功能,另一部分用户逐渐启用新功能,过渡的工程中可能还会对产品做进一步完善,也叫金丝雀发布,简单来说,就是一套A/B Test系统。
其他常用的部署策略还有蓝绿发布(需要两个集群去替换发布)和滚动发布(类似于蓝绿部署,但只需一个集群,更细粒度下完成升级)。
灰度发布的协议设计主要要遵循下面两点:
定长Header + 变长Body
设计灰度发布字段,比如可根据Header中Token、IP、Uid等设置策略
这里推荐一个Springcloud的灰度发布神器:Nepxion Discovery
8、压力测试
系统发布之后,我们需要对其进行压力测试。
压测之前,我们一般先会定义压测的标准,比如下面常用的:
服务器的Load Average不超过CPU核数 * 0.6
服务器CPU占用率不超过(CPU核数 * 0.6)*100 / 服务器部署的服务进程数
网卡流量不超过网卡容量的60%
请求超时不超过十万分之一
QPS不低于预估的85%
而压测的工具,我们常用的比如:Jmeter、TCPCopy、Apache AB、Locust、LoadRunner等。
-------------------
还有一些文章中没有讲,比如如何保持数据的一致性,异步通信应该如何设计,后续文章都会进行详细讲解。
分布式架构设计是现代软件开发中的关键一环,它允许我们构建可伸缩、可靠且高性能的系统。通过遵循设计原则,我们可以更好地应对复杂性和挑战,以满足不断增长的用户需求。无论你是开发者、架构师还是系统管理员,了解分布式架构的原理和实践都是非常有价值的,因为它将在未来的技术世界中继续扮演重要角色。

原文作者:极客e家;如有侵权,请联系管理员删除。