欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > 10. 软件设计架构-经典架构问题

10. 软件设计架构-经典架构问题

2025/2/23 7:00:27 来源:https://blog.csdn.net/princemilo/article/details/145730024  浏览:    关键词:10. 软件设计架构-经典架构问题

文章目录

  • 前言
  • 一、高并发场景下的系统崩溃
    • 1. 问题描述
    • 2. 解决方案:
    • 3. 案例分析:电商秒杀系统
  • 二、单体架构到微服务的拆分陷阱
    • 1. 问题描述
    • 2. 解决方案:
    • 3. 案例分析:在线教育平台拆分
  • 三、分布式系统中的数据一致性难题
    • 1. 问题描述
    • 2. 解决方案:
    • 3. 案例分析:订单与库存最终一致性
  • 四、缓存穿透、雪崩与击穿
    • 1. 问题描述
    • 2. 解决方案:
    • 3. 案例分析:社交平台热点帖子
  • 五、技术选型的权衡与落地
    • 1. 问题描述
    • 2. 决策框架:
    • 3. 案例分析:日志采集系统选型
  • 六、系统扩展性与弹性设计
    • 1. 关键设计模式
    • 2. 案例:视频转码服务
  • 七、总结


前言

架构思维

  从程序员成长为架构师,技术视野需要从局部代码设计扩展到系统级架构设计,以下是转型过程中必然遇到的常见经典架构问题,结合解决方案和案例解析,帮助构建系统性架构思维


一、高并发场景下的系统崩溃

1. 问题描述

突发流量(如秒杀、抢购)导致服务不可用,数据库崩溃。

2. 解决方案:

1. 流量分层削峰:CDN + 静态资源缓存 → 负载均衡(Nginx) → 服务层限流(令牌桶、漏桶)→ 异步队列(Kafka/RabbitMQ)→ 数据库分库分表。
2. 缓存策略:Redis 集群缓存热点数据,设置本地缓存(Guava Cache)减少穿透。
3. 数据库优化:读写分离、分库分表(ShardingSphere)、连接池优化。

3. 案例分析:电商秒杀系统

  • 用户请求先经过 Nginx 负载均衡到多台 Tomcat 服务器。
  • 网关层使用 Sentinel 实现 QPS 限流,拦截 90% 的无效请求。
  • 库存预扣减通过 Redis 原子操作(DECR)确保一致性,剩余请求进入 Kafka 异步处理订单。
  • 数据库使用分库分表(订单按用户ID哈希),避免单表瓶颈。

二、单体架构到微服务的拆分陷阱

1. 问题描述

单体应用臃肿,团队协作困难,如何合理拆分服务?

2. 解决方案:

1. 领域驱动设计(DDD):通过限界上下文(Bounded Context)划分服务边界。
2. 拆分策略:横向拆分(按功能模块)或纵向拆分(按业务领域)。
3. 服务治理:服务注册发现(Consul/Nacos)、API 网关(Spring Cloud Gateway)、分布式配置中心。

3. 案例分析:在线教育平台拆分

  • 用户服务:管理注册、登录、权限。
  • 课程服务:课程发布、目录管理。
  • 订单服务:支付、交易流水。
  • 使用 Spring Cloud Alibaba 生态,通过 OpenFeign 实现服务间调用,Seata 处理分布式事务。

三、分布式系统中的数据一致性难题

1. 问题描述

跨服务的数据操作如何保证一致性?如订单支付后库存扣减失败。

2. 解决方案:

1. 强一致性:分布式事务(2PC、3PC),牺牲性能换取一致性。
2. 最终一致性:

  • 本地消息表
    业务与消息表同库事务,异步重试。

  • 事务消息
    RocketMQ 事务消息确保消息必达。

  • Saga 模式
    通过补偿机制回滚分布式操作。

3. 案例分析:订单与库存最终一致性

  • 订单服务创建订单,写入本地消息表(状态为“待扣减库存”)。
  • 消息队列发送扣减库存事件,库存服务消费成功后确认消息。
  • 若库存不足,触发补偿逻辑:取消订单并通知用户。

四、缓存穿透、雪崩与击穿

1. 问题描述

缓存使用不当导致数据库压力骤增。

2. 解决方案:

  1. 穿透
    布隆过滤器拦截无效 Key,空值缓存(设置短过期时间)。

  2. 雪崩
    缓存过期时间随机化,多级缓存(Redis + Caffeine)。

  3. 击穿
    热点数据永不过期,互斥锁(Redis SETNX)重建缓存。

3. 案例分析:社交平台热点帖子

  • 使用布隆过滤器(Redisson 实现)过滤 80% 的非法帖子ID 查询。
  • 帖子详情缓存设置基础过期时间(30 分钟) + 随机偏移(±5 分钟)。
  • 针对明星热点动态,采用本地缓存 + Redis 双读策略,避免击穿。

五、技术选型的权衡与落地

1. 问题描述

如何选择适合当前业务的技术栈?

2. 决策框架:

1. 业务需求:高并发选 Kafka,复杂业务逻辑选 RabbitMQ。
2. 团队能力:熟悉 Java 则选 Spring Cloud,轻量级可选 Dubbo。
3. 社区生态:优先选择有活跃社区和维护的框架(如 Apache 项目)。

3. 案例分析:日志采集系统选型

  • 需求:每秒百万级日志写入,允许少量丢失。
  • 候选:Elasticsearch(搜索强) vs ClickHouse(分析快)。
  • 决策:选择 ClickHouse + Kafka,利用 ClickHouse 的列式存储高效压缩和分析日志。

六、系统扩展性与弹性设计

1. 关键设计模式

1. 水平扩展:无状态服务设计,通过 Kubernetes 自动扩缩容。
2. 弹性模式:熔断(Hystrix)、降级(返回兜底数据)、限流(RateLimiter)。

2. 案例:视频转码服务

  • 转码任务提交至 Kafka,Worker 集群根据队列长度自动扩容 Pod。
  • 当转码服务超时,触发熔断,降级为返回低清晰度视频。

七、总结

架构设计的核心在于平衡(性能 vs 一致性、复杂度 vs 扩展性)与 取舍

推荐学习路径:

  1. 理论:《软件架构设计:大型网站技术架构与业务架构融合之道》
  2. 实践:参与开源项目(如 Apache Dubbo、SkyWalking),分析 GitHub 优秀架构案例。
  3. 工具:熟练使用架构绘图工具(C4 Model、ArchiMate)表达设计思想。

本文的引用仅限自我学习如有侵权,请联系作者删除。
参考知识
程序员到架构师,定会遇到的经典架构问题!


版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词