当前位置: 首页 > news >正文

系统扩展策略

1、核心指导思想:扩展立方体

在讨论具体策略前,先了解著名的扩展立方体(Scale Cube),它定义了三种扩展维度:

  1. X轴:水平复制(克隆)

    • 策略:通过负载均衡器,在多个完全相同的应用实例之间分发请求。

    • 实现:这是最简单、最常用的方式。例如,将一个单体应用部署到多台服务器,前面用 Nginx 或 AWS ALB 做负载均衡。

    • 优点:实现简单,能快速提升系统的吞吐量和可用性。

    • 缺点:每个实例都包含所有功能和数据,缓存、会话等状态需要外部化处理,无法解决单一数据库的瓶颈。

  2. Y轴:功能拆分(解耦)

    • 策略:基于不同的业务功能、服务或领域进行拆分。这就是我们常说的微服务架构

    • 实现:将单体应用拆分为多个独立的服务,如“用户服务”、“订单服务”、“商品服务”。每个服务负责自己的数据和业务逻辑。

    • 优点

      • 高度解耦,团队可以独立开发、部署和扩展各自的服务。

      • 可以针对特定高负载服务进行精准扩容(比如大促时只扩展商品和订单服务)。

      • 技术栈可选,不同服务可以用不同的 Java 框架甚至语言。

    • 缺点:引入了分布式系统的复杂性(网络延迟、最终一致性、分布式事务、调试困难等)。

  3. Z轴:数据分片(分区)

    • 策略:基于特定的数据属性(如用户ID、地区)对数据进行分区,并将请求路由到对应的分区。

    • 实现:例如,user_id % 10 将用户数据散列到 10 个不同的数据库分片中。每个应用实例只处理特定分片的请求。

    • 优点:非常适合海量数据和高写入负载的场景,能有效扩展数据库的写能力。

    • 缺点:应用逻辑变得复杂,跨分片的查询和聚合操作非常困难。

最佳实践:通常从 X 轴开始,随着业务增长,逐步采用 Y 轴和 Z 轴策略。

2、具体策略与实施方案

架构层面

  • 演进式架构:不要一开始就设计一个庞大的微服务系统。优先采用模块化良好的单体架构(如使用 Spring Boot 的模块),随着业务复杂度的提升,再逐步将成熟、边界清晰的模块拆分为微服务。

  • 微服务架构

    • 服务发现:使用 Consul, Eureka, Nacos 等实现服务的自动注册与发现。

    • API 网关:使用 Spring Cloud Gateway 作为统一入口,处理路由、认证、限流、监控等跨切面关注点。

    • 通信:同步调用使用 REST(OpenFeign)或 gRPC;异步消息使用 RabbitMQ, Kafka, RocketMQ 来解耦服务,实现最终一致性和流量削峰。

    • 配置管理:使用 Nacos进行集中化的外部配置管理。

  • 缓存策略

    • 本地缓存:对于极少变化的数据(如元数据),使用 Caffeine 或 Guava Cache,速度极快。

    • 分布式缓存:对于全局共享的数据(如用户会话、热点商品),使用 Redis 。这是解除应用实例状态依赖、提升性能的关键。

  • 数据库扩展

    • 读写分离:主库负责写,多个从库负责读,缓解读压力。

    • 分库分表:使用 ShardingSphere 等框架对数据库进行水平拆分(Z轴扩展)。

    • 数据库选型:根据场景使用不同类型的数据库(多模数据库)。例如,ES 用于搜索,MongoDB 用于存储非结构化数据,TiDB 用于兼容 MySQL 协议且支持水平扩展的 OLTP 场景。

代码与开发层面

  • 无状态设计这是水平扩展(X轴)的前提。应用实例本身不存储用户会话等状态信息。将会话数据存储到外部缓存(如 Redis)中。

  • 池化资源:使用连接池(HikariCP)、线程池(ThreadPoolExecutor)来管理数据库连接、HTTP 客户端连接等昂贵资源,避免频繁创建和销毁带来的开销。

  • 异步与非阻塞

    • 使用 CompletableFuture 进行异步编程。

    • 采用响应式编程模型(如 WebFlux)构建非阻塞的 I/O 密集型服务,用更少的资源处理更高的并发。

  • 容错

    • 断路器:使用 Resilience4j 或 Hystrix 防止服务雪崩。当下游服务失败时,快速失败并提供降级方案。

    • 重试与限流:对暂时性故障进行智能重试;对上游调用进行限流,保护自身系统。

 基础设施与运维层面(DevOps)

  • 容器化与编排

    • 使用 Docker 将应用及其依赖打包成标准镜像。

    • 使用 Kubernetes (K8s) 进行容器编排,实现服务的自动部署、扩缩容(HPA)、自愈和滚动更新。K8s 是实践微服务和云原生扩展的基石。

  • CI/CD(持续集成/持续部署)

    • 自动化构建、测试和部署流程(Jenkins, GitLab, Nexus)。

    • 实现快速、频繁、可靠地发布,这是微服务能独立扩展的前提。

  • 监控与可观测性

    • 指标(Metrics):Prometheus 收集应用(Micrometer)和系统指标,Grafana 进行可视化。

    • 日志(Logging):集中式日志收集(ELK 栈:Elasticsearch, Logstash, Kibana)。

    • 追踪(Tracing):使用 SkyWalking进行分布式链路追踪,快速定位性能瓶颈和故障点。

  • 云原生:充分利用云平台(AWS, Azure, GCP, 阿里云)的弹性伸缩能力(如 AWS Auto Scaling Group),根据 CPU、内存或自定义指标(如消息队列长度)自动增减实例数量。

3、总结:一个可执行的扩展路径

对于大多数项目,推荐一个循序渐进的扩展路径:

  1. 阶段一:优化与垂直扩展

    • 优化代码和 SQL 查询。

    • 增加缓存(Redis)。

    • 数据库读写分离。

    • (必要时)升级服务器配置(垂直扩展)。

  2. 阶段二:水平扩展应用层(X轴)

    • 改造应用为无状态

    • 将应用部署到多台服务器,使用负载均衡器

    • 会话外部化到 Redis。

  3. 阶段三:拆分与解耦(Y轴)

    • 将单体应用拆分为微服务

    • 引入消息队列(Kafka/RabbitMQ)处理异步流程和削峰填谷。

    • 实施 API 网关和服务治理。

  4. 阶段四:数据层深度扩展(Z轴)

    • 对数据库进行分库分表

    • 引入多种类型的数据库(多模架构)。

  5. 全程贯穿

    • 基础设施自动化:使用 Docker 和 K8s。

    • 完善的监控:建立指标、日志、追踪体系。

    • 成熟的 DevOps 文化:自动化一切,快速反馈。

        记住,没有银弹。最好的扩展策略是基于当前的业务规模、团队能力和未来规划做出的最适合的权衡。过早优化和过度设计都是陷阱。始终以测量(Monitoring)为基础,让数据驱动扩展决策。

参考文档:

微服务架构理论-扩展立方体篇 - zygfengyuwuzu - 博客园


文章转载自:

http://Vbx3Rq9h.mbpzw.cn
http://tBI60ySN.mbpzw.cn
http://isnaaoCn.mbpzw.cn
http://RjF3Dkph.mbpzw.cn
http://bNGP4unF.mbpzw.cn
http://wQ2kVgr7.mbpzw.cn
http://ZSE1QIkh.mbpzw.cn
http://bGTn7w55.mbpzw.cn
http://vMn5tRco.mbpzw.cn
http://w6ZtmF9n.mbpzw.cn
http://u1wO8XlJ.mbpzw.cn
http://lxCfXgap.mbpzw.cn
http://PgluWScY.mbpzw.cn
http://z7fItjuN.mbpzw.cn
http://6EWk9iAT.mbpzw.cn
http://euu9ykKq.mbpzw.cn
http://DvADA5yR.mbpzw.cn
http://iMdFQNeW.mbpzw.cn
http://E2Eqceyi.mbpzw.cn
http://mUqDBeCz.mbpzw.cn
http://J6BfhEfD.mbpzw.cn
http://Xp84E9zk.mbpzw.cn
http://b1c0Dxli.mbpzw.cn
http://EU7cPHGK.mbpzw.cn
http://dZWSatvj.mbpzw.cn
http://kCuAg9dU.mbpzw.cn
http://4un52W7U.mbpzw.cn
http://LGsl5rYe.mbpzw.cn
http://f6hkFTrO.mbpzw.cn
http://cUbAkSNM.mbpzw.cn
http://www.dtcms.com/a/363327.html

相关文章:

  • 【LeetCode_26】删除有序数组中的重复项
  • 小迪web自用笔记24
  • GPT-5论文选题实测:如何从2000篇文献中提炼出3个可快速落地的高命中选题?
  • 从零开始学Vue3:Vue3的生命周期
  • Leetcode二分查找(4)
  • 开悟篇Docker从零到实战一篇文章搞定
  • 洗衣店小程序的设计与实现
  • GDB 调试
  • 深度学习篇---DenseNet网络结构
  • Spring Boot手写10万敏感词检查程序
  • C#----异步编程
  • 基于Django的论坛系统设计与实现(代码+数据库+LW)
  • Qt模型/视图编程详解:QStringListModel与多视图数据同步
  • 链表题类型注解解惑:理解Optional,理解ListNode
  • 前端实现解析【导入】数据后调用批量处理接口
  • GaussDB 等待事件为LockMgrLock处理方法
  • 为什么程序员总是发现不了自己的Bug?
  • flutter踩坑插件:Swift架构不兼容
  • 疯狂星期四文案网第58天运营日记
  • 手撕Redis底层2-网络模型深度剖析
  • 【3D 入门-4】trimesh 极速上手之 3D Mesh 数据结构解析(Vertices / Faces)
  • Valkey vs Redis详解
  • 基于若依框架开发WebSocket接口
  • 计算机Python毕业设计推荐:基于Django+Vue用户评论挖掘旅游系统
  • 【交易系统系列36】揭秘币安(Binance)技术心脏:从公开信息拼凑“MatchBox”撮合引擎架构
  • 海康摄像头开发---标准配置结构体(NET_DVR_STD_CONFIG)
  • End-To-End 之于推荐-kuaishou OneRec2 笔记
  • css中 ,有哪些⽅式可以隐藏页⾯元素? 区别?
  • 03_网关ip和端口映射(路由器转发)操作和原理
  • Telnet 原理与配置