大家好,我是砸锅。一个摸鱼八年的后端开发。熟悉 Go、Lua。今天和大家一起学习分布式技术😊
开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 13 天,点击查看活动详情
分布式系统的背景
分布式系统出现的原因是因为单体系统的不足,最主要解决了这些问题:
- 分布式系统解决了单机性能瓶颈导致的成本问题
- 用户量和数据量爆炸性地增大导致的成本问题
- 业务高可用的要求
- 单体大规模软件系统的迭代效率和成本问题
分布式系统面临单体系统的成本、效率和高可用的问题,采取将一些计算机通过网络连接起来共同工作,并且在系统中提供冗余来解决高可用的问题
在采用分布式系统的同时,也会带来一些新的挑战:
- 分布式系统内部会有很多不同的服务,如何找到这些服务? 通常的方案是服务注册与发现机制,并选择是做 AP 系统还是 CP 系统更合适(CAP)
- 找到服务之后,当前的请求如何找到是发往服务的哪一个实例? 如果同一个服务的实例是无状态的,那么按照负载均衡的策略(轮询、权重、Hash、一致性 Hash、FAIR)来处理就可以了 如果同一个服务的实例有状态,则需要通过路由服务先确定当前访问的请求是哪个实例,然后再进行访问
- 分布式系统内部会有不同的服务,每个服务有多个实例,该如何管理配置? 通常不会选择配置文件的方式,因为容易出错。常用的方式是通过一个中心化的存储来统一管理系统的配置,也就是配置中心
- 各个功能模块如何进行协同? 单体系统里全部功能模块都在一个进程,内部协同直接系统加锁就可以了。分布式系统里不同功能模块拆分为不同的服务,并且一般都运行在不同的机器里,这时候就需要用分布式锁来解决
- 出现重试时,如何确保请求只执行了一次? 因为在分布式系统里,各个模块之间都是网络进行连接的,如果出现网络抖动等情况而导致服务调用失败了,这时就会触发重试策略。分布式系统里重试加幂等是确保请求只执行一次的方法
- 如果某个部分出现故障,如何避免出现雪崩? 因为某个部分出现故障,会导致其他服务也出现故障从而影响全部服务。避免雪崩的策略主要有两个:一个是快速失败和降级机制(熔断、降级、限流),通过快速减少系统负载来避免雪崩发生;另一个是弹性扩容机制,快速增加系统的服务能力来避免雪崩;快速失败容易带来系统数据不一致的问题,弹性扩容实现成本较大且响应时间更长
- 分布式系统如何监控告警和故障恢复? 分布式系统发生故障时,需要快速处理必须要完善分布式系统的监控(比如接口的时延和可用性等信息)、分布式追踪 Trace,模拟故障的混沌工程以及相关的告警机制,同时也要做好故障恢复预案,确保故障发生时可以快速恢复故障
此文章为2月Day8学习笔记,内容来源于极客时间《深入浅出分布式技术原理》