系统设计
# 系统设计
# 1. 如何设计一个系统?
网站设计不可能一蹴而就,都是根据业务需求逐渐演化而来。架构师所能做的就是根据已有的经验设计出尽可能完美的系统。
设计前
分析业务需求,制定方案,选择合适的技术栈。
设计时
需要考虑整个系统的高性能(并发能力)、可用性、伸缩性、扩展性、安全性。
- 高性能:响应时间块、并发量高、吞吐量大等等
- 前端优化:浏览器访问优化、CDN 加速、反向代理
- 应用服务器优化:缓存、异步、集群、代码优化
- 存储性能优化:选择更好的服务器
- 高可用:可用时间、故障时间
- 架构:分层,应用层 — 服务层 — 数据层
- 应该层、服务层的可用:异步调用、服务降级、服务熔断、幂等性设计
- 数据层的可用:数据备份、失效转移
- 高可用发布:自动测试、自动发布、灰度发布
- 运行监控:监控数据采集,出问题可以分析;监控管理,出问题报警、失效转移,自动降级等
- 伸缩性:集群里添加删减服务器,性能可以线性上升
- 应用服务器集群负载均衡
- 分布式缓存可以使用一致性 hash 算法
- 可扩展性:不改变已有系统添加新的功能
- 消息队列
- 分布式服务打造可复用的业务平台
工作流引擎:将视图文件编译成 Java 代码。开源项目:compile-flow、activiti
# 2. 如何设计一个秒杀系统?
遇到的问题及解决方案
⭐ 高并发对已有业务造成影响,有可能造成整个网站瘫痪。
秒杀系统独立部署,使其与原网站隔离开,即使秒杀系统崩了,也不会对网站造成影响。
⭐ 大量的请求会对应用服务器和数据库服务造成负载压力
扩展应用服务器的集群。
⭐ 超过网站平时的网络带宽
为秒杀系统新增网络带宽,在运营商哪里购买或租借。为了减轻网站服务器的压力,将秒杀的静态页面缓存到 CDN。
⭐ 秒杀系统的设计
前台系统的设计
- 详情页面静态化,将商品的描述、参数、成交记录、评价全部写入一个静态页面,将其存储在 redis 集群中,或者放在运营商的 cdn 服务器上,或者用户的浏览器上,以减轻应用服务器和数据库的压力。
- 按键设计,秒杀开始之前不能点击购买,开始之后,用户 10s 内只能点击按钮一次,防止重复购买。
- 秒杀开始之前谁都不知道秒杀的 url,开始之后动态生成。
- 验证码
后台系统
- 为了防止网站崩溃,需要设置服务降级、熔断、限流。Sentinal
- 通过 redis 解决高并发读的问题;通过 MQ 异步/削峰解决高并发写的问题。
- 通过 MQ 发布/订阅模式,可以异步处理积分、物流等业务。
- 超卖问题
- 下单服务,通过 redis 预减库存,redis 查询判断用户发符合预约条件后,在把相关信息发送到 MQ,通过 zookeeper 分布式协调,监控处理结果
- 库存服务,专门监听 MQ,减少数据库中的库存,如果处理失败就回滚。通过 zookeeper 分布式协调告知下单服务是否下单成功。
- 下单成功后,在有效时间内付款,超时自动化释放订单。
编辑 (opens new window)
上次更新: 2023/08/20, 21:21:52