分布式系统

文章目录

什么是后端中的分布式系统

分布式系统 是一组位于网络上的计算机,为了共同完成一个任务而协同工作的系统。对于用户来说,它就像一个单一、连贯的系统。

在后端开发中,分布式系统意味着将原本运行在一台强大服务器(单体架构)上的应用程序,拆分成多个服务,这些服务可以部署在不同的服务器(节点)上,通过网络进行通信和协作。

核心目标:通过协作获得更高的性能(吞吐量)、可扩展性(水平扩展)、可用性(容错)和可维护性。

为什么需要分布式系统?

1、突破单机性能瓶颈 :单台服务器的计算能力、内存、磁盘I/O和网络带宽总是有限的。分布式系统可以通过增加普通机器来提升整体能力。
2、高可用性与容错 :单台服务器故障会导致整个服务不可用。分布式系统中,部分节点宕机,其他节点可以接管工作,保证服务不中断。
3、可扩展性 :当用户量和数据增长时,可以通过简单地增加机器(水平扩展)来应对,而不是不断升级单台服务器的硬件(垂直扩展,成本高且有限)。
4、低延迟:可以将服务部署在全球各地的数据中心,让用户就近访问,减少网络延迟。

核心技术、知识

通过一些核心概念和图表来深入理解。

1. 服务发现与注册

在动态的分布式环境中,服务的实例可能会因为扩容、故障或更新而频繁地改变IP地址和端口。服务发现机制允许服务自动找到并与其他服务通信。

工作流程:
Service A (实例) 服务注册中心 (e.g., Nacos, Consul, Eureka) Service B (消费者) 1. 注册 / 心跳 注册元数据:服务名、IP、端口等 2. 查询:Service A的地址列表 3. 返回可用实例列表 4. 直接向选择的实例发起请求 Service A (实例) 服务注册中心 (e.g., Nacos, Consul, Eureka) Service B (消费者)

涉及技术:Nacos, Consul, ZooKeeper, Eureka

2. API 网关

它是系统的唯一入口,所有外部请求首先经过网关。它负责路由、认证、限流、监控等跨切面关注点。

架构图:
分布式系统集群 注册 注册 注册 API Gateway Service 1 Service 2 Service 3 服务注册中心 客户端请求

涉及技术:Spring Cloud Gateway, Kong, Zuul, Nginx

3. 配置中心

将应用程序的配置(如数据库连接、第三方API密钥、功能开关)从代码中分离出来,集中管理。动态修改配置后,所有服务实例可以自动获取最新配置,无需重启。

工作流程:
多个服务实例 配置中心 (e.g., Nacos, Apollo) 管理员 1. 在界面上修改配置并发布 2. 推送更新通知 (Push) 或由服务拉取 (Pull) 3. 获取最新配置 服务应用新配置 多个服务实例 配置中心 (e.g., Nacos, Apollo) 管理员

涉及技术:Nacos, Apollo, Spring Cloud Config

4. 分布式缓存

将高频访问的数据存储在内存中,减少对后端数据库的访问,极大提升读取性能和降低数据库负载。通常是分布式的键值存储。

架构图:
分布式缓存集群 e.g., Redis Cluster 节点 1 节点 2 节点 3 应用程序集群 后端数据库

涉及技术:Redis (Cluster/Sentinel模式), Memcached

5. 消息队列

用于实现服务之间的异步通信和解耦。生产者将消息发送到队列,消费者从队列中取出消息进行处理。它还提供了流量削峰和保证最终一致性的能力。

工作流程:
生产者服务 消息队列 (e.g., Kafka, RabbitMQ) 消费者服务 1. 发送消息 发送后即刻返回,无需等待处理 2. 推送消息 (或C主动拉取) 3. 处理成功,发送确认ACK 4. 消息处理完毕,从队列移除 生产者服务 消息队列 (e.g., Kafka, RabbitMQ) 消费者服务

涉及技术:Kafka (高吞吐), RabbitMQ (功能丰富), RocketMQ

6. 分布式数据存储

数据量巨大,单机数据库无法存储和处理。需要将数据分片存储到多台机器上。

  • CAP定理:一个分布式系统不可能同时满足一致性(C)、可用性(A)和分区容错性(P),只能三者取其二。
  • 数据库分片:将一张大表的数据按某种规则(如用户ID哈希)拆分到不同的数据库节点中。
  • 复制:为主数据库创建多个从库副本,用于读写分离和故障转移。

分片与复制示意图:
分片 3 分片 2 分片 1 主库 Master 从库 Slave 主库 Master 从库 Slave 主库 Master 从库 Slave 应用程序

涉及技术:

  • NoSQL : MongoDB (文档), Cassandra (宽列)
  • NewSQL : TiDB, CockroachDB
  • 中间件 : MyCat, ShardingSphere

深入与拓展

第一阶段:基础

1、语言与网络:熟练掌握一门后端语言(如 Java/Go)。深刻理解 HTTP/1.1/2/3、TCP/IP 协议。

2、数据库与缓存 :精通一种关系型数据库(如 MySQL )和一种 NoSQL 数据库(如 Redis)。理解事务、索引、锁、主从复制等概念。

第二阶段:理论学习

1、阅读经典:精读《数据密集型应用系统设计》,这是分布式领域的圣经。

2、理解核心理论:弄懂 CAPBASE、一致性协议(如 Raft/Paxos)。不必深究数学证明,但要理解其思想和工作流程。

第三阶段:实践

1、选择一个生态:建议从 Spring Cloud Alibaba 开始,因为它集成了很多优秀组件,文档丰富,社区活跃。

2、动手搭建:

  • Nacos 搭建一个服务注册和配置中心。
  • Spring Cloud Gateway 搭建一个 API 网关。
  • 搭建一个 Redis 哨兵或集群,并在代码中集成它。
  • 搭建 KafkaRabbitMQ,写一个生产者和消费者的 Demo。

3、做一个综合项目:设计一个简单的电商系统,包含用户、商品、订单、支付等服务。将上述所有技术都用上去:

  • 服务注册到 Nacos。
  • 通过网关暴露 API。
  • 用 Redis 缓存商品信息。
  • 下单后,通过 MQ 通知库存服务和积分服务。

第四阶段:深入与拓展

1、容器化与编排 :学习 DockerKubernetes 。K8s 本身就是一个极其复杂的分布式系统,它提供了服务发现、负载均衡、自愈等能力,是现代分布式应用的基石。

2、观察与监控 :学习使用 Prometheus (收集指标)、Grafana (展示仪表盘)、ELK (日志收集分析)来监控你的分布式系统。

3、读源码:选择一两个你常用的组件(如 Redis、Nacos),开始尝试阅读其源码,理解其核心实现。

相关推荐
poemyang3 天前
“凭什么说你比我先?”——没有上帝时钟,如何判断“谁先谁后”?
分布式系统
poemyang7 天前
海量数据如何“安家”?一文读懂哈希、范围和一致性哈希三大分片策略
分布式系统
poemyang10 天前
“卧槽,系统又崩了!”——别慌,这也许是你看过最通俗易懂的分布式入门
分布式系统·拜占庭问题
在未来等你1 个月前
RabbitMQ面试精讲 Day 11:RabbitMQ集群架构与节点类型
消息队列·rabbitmq·面试题·高可用·分布式系统·集群架构·节点类型
在未来等你1 个月前
RabbitMQ面试精讲 Day 8:死信队列与延迟队列实现
消息队列·rabbitmq·死信队列·延迟队列·分布式系统·面试技巧
在未来等你1 个月前
RabbitMQ面试精讲 Day 10:消息追踪与幂等性保证
消息队列·rabbitmq·幂等性·分布式系统·面试技巧·消息追踪
在未来等你1 个月前
RabbitMQ面试精讲 Day 6:消息确认与事务机制
消息队列·rabbitmq·面试题·事务机制·分布式系统·消息确认
卷心菜不卷Iris1 个月前
第4章唯一ID生成器——4.5 美团点评开源方案Leaf
雪花算法·美团·分布式系统·leaf·分布式唯一id·点评
夜影风2 个月前
分布式系统中的缓存设计与应用
缓存·系统架构·分布式系统