秒杀系统总结与思考(一) 架构原则

本文分享了秒杀系统从初始版本到高级架构的优化历程,包括独立系统部署、缓存策略、页面动静分离及限流保护等关键技术点,遵循4要1不要架构原则。

重温许令波老师的秒杀系统课程 课程链接

架构基本原则: “4要1不要”

1、数据尽量少:数据网络传输,序列化,编码,解压等操作消耗CPU,数据越简单、越小则好
简化秒杀页面大小,去掉不必要的页面装修等
2、请求数量尽量少: 减少额外的请求,TCP等都耗时较多
3、路径尽量短: 远程调用都会创建scoket连接,也会增大服务不可用的可能性的叠加
4、依赖尽量少: 用户访问一个页面所依赖的系统,防止关键系统被弱依赖系统拖累
5、不要单点: 服务单点不可用

最初版本的秒杀系统

把你的商品购买页面增加一个“定时上架”功能,仅在秒杀开始时才让用户看到购买按钮,当商品的库存卖完了也就结束了。这就是当时第一个版本的秒杀系统实现方式

架构改造第一版

在这里插入图片描述
1、把秒杀系统独立出来单独打造一个系统,这样可以有针对性地做优化,例如这个独立出来的系统就减少了店铺装修的功能,减少了页面的复杂度;
2、在系统部署上也独立做一个机器集群,这样秒杀的大流量就不会影响到正常的商品购买集群的机器负载;
3、将热点数据(如库存数据)单独放到一个缓存系统中(如Redis),以提高“读性能”;
4、增加秒杀答题,防止有秒杀器抢单。
秒杀详情成为了一个独立的新系统,另外核心的一些数据放到了缓存(Cache)中,其他的关联系统也都以独立集群的方式进行部署。

架构改造第二版

在这里插入图片描述
1、对页面进行彻底的动静分离,使得用户秒杀时不需要刷新整个页面,而只需要点击抢宝按钮,借此把页面刷新的数据降到最少;
2、在服务端对秒杀商品进行本地缓存,不需要再调用依赖系统的后台服务获取数据,甚至不需要去公共的缓存集群中查询数据,这样不仅可以减少系统调用,而且能够避免压垮公共缓存集群。
3、增加系统限流保护,防止最坏情况发生。
经过这些优化,系统架构变成了下图中的样子。在这里,我们对页面进行了进一步的静态化,秒杀过程中不需要刷新整个页面,而只需要向服务端请求很少的动态数据。而且,最关键的详情和交易系统都增加了本地缓存,来提前缓存秒杀商品的信息,热点数据库也做了独立部署,等等。

总结

4要1不要的基本架构原则
秒杀系统独立(秒杀详情、秒杀交易),定制优化,与正常业务隔离
热点数据独立的缓存的系统。增加校验防止刷单
页面数据动静分离,静态数据localcache (请求尽量少,数据尽量少)
独立缓存,独立库存热点(依赖尽量少)
关于localcache的问题

1、本地cache用什么实现好呢? 内存实现,如map或gauva
2、通过什么方式往本地cache写数据? 用订阅的方式,初始化加载到内存
3、秒杀系统的及时性很高,把库存写进本地cache,如何及时更新?
有两种方法,一是定时更新取3秒,二是,主动更新,数据库字段更新后发消息更新缓存,这个需要用到一个组件阿里叫metaq就是就是数据库字段更新会产生一条消息。另外cache里库存不需要100%和数据库一致,最下单一致性校验即可

<think>我们正在讨论应用系统架构的设计原则、模式和实践。根据用户提供的引用,我们可以总结出以下几点: 1. **设计原则**:架构设计需要系统性思考,权衡利弊,在资源约束下做出最合理决策。它明确了系统骨架,包括子系统、模块、组件及其协作关系、约束规范和指导原则[^1]。架构设计以干系人需求为源头,以技术管理和过程改进体系为工作流程,以质量为重心[^1]。同时,可扩展性和可靠性是设计良好架构的主要因素[^4]。 2. **架构模式**:常见的模式包括创建型、结构型和行为型设计模式。创建型模式(如单例、工厂方法)负责对象创建;结构型模式(如适配器、代理)处理类或对象之间的关系;行为型模式(如观察者、策略)描述类或对象的交互和职责分配[^3]。此外,在微服务架构中,事件驱动架构种常见实践,通过消息队列(如Kafka)实现服务间解耦和数据库同步[^5]。 3. **最佳实践**:从业务架构中抽象出业务能力和业务流程,通过层层建模得到最终系统[^2]。在技术选型上,可根据需求组合不同数据库(如SQL Server + Cassandra)[^5]。同时,架构设计需关注可扩展性(支持百万用户)和可用性(低停机时间)[^4]。 接下来,我将根据这些要点组织回答,并生成相关问题。</think>### 应用系统架构设计:原则、模式实践 基于系统架构设计原理和工业实践,结合引用内容[^1][^2][^3][^4][^5],系统化梳理应用架构设计的核心要素: --- #### 架构设计原则(指导决策的核心准则) 1. **干系人需求驱动** - 以业务目标为源头,平衡功能非功能需求(性能、安全、扩展性)[^1] - 例如:电商系统需满足 $QPS \geq 10,000$ 的并发能力[^4] 2. **模块化低耦合** - 按功能拆分子系统(如订单服务、支付服务),控制耦合度 $C < 0.3$[^1] - 模块间通过标准接口通信(如RESTful API) 3. **可扩展性弹性** - 水平扩展设计:支持动态增减节点(如K8s自动扩缩容) - 数据分区策略:按用户ID分片存储(Cassandra分片机制)[^5] 4. **可靠性保障** - 多可用区部署:跨地域冗余(如AWS三可用区架构) - 故障恢复机制:SLA $\geq$ 99.95%(年宕机≤4.38小时)[^4] --- #### 二、主流架构模式(系统结构的范式选择) | **模式类型** | **典型方案** | **适用场景** | |--------------------|------------------------------|--------------------------| | **分层架构** | MVC模式(Model-View-Controller) | 传统Web应用(如Spring MVC) | | **微服务架构** | 独立服务+API网关 | 高复杂度系统(如电商平台)[^5] | | **事件驱动架构** | 消息队列(Kafka/RabbitMQ) | 实时数据处理(如订单流)[^5] | | **无服务器架构** | AWS Lambda/Azure Functions | 突发流量场景(如秒杀活动) | > **关键设计决策**: > - 数据库选型:事务型用SQL Server,高并发读用Cassandra[^5] > - 服务通信:同步用gRPC,异步用Kafka[^5] --- #### 三、最佳实践(工业级落地方法) 1. **抽象建模流程** ```mermaid graph LR A[业务架构] --> B[抽象业务能力] B --> C[定义业务流程] C --> D[设计应用模型] D --> E[实现系统] ``` 通过层层抽象降低复杂度[^2] 2. **设计模式应用** - **创建型**:工厂模式(动态创建订单处理器) - **结构型**:适配器模式(兼容新旧支付接口) - **行为型**:观察者模式(库存变更通知)[^3] 3. **容灾设计实践** - **数据同步**:SQL Server → Kafka → Cassandra 异步复制[^5] - **流量调度**:蓝绿部署 + 跨区域DNS负载均衡 4. **演进式架构** - 初期:单体架构(快速上线) - 成长期:微服务拆分(按业务域解耦) - 成熟期:Service Mesh(Istio服务治理) --- ### 关键公式度量 - **系统可用性**:$$Availability = \frac{\text{MTBF}}{\text{MTBF} + \text{MTTR}} \times 100\%$$ (MTBF: 平均故障间隔时间, MTTR: 平均修复时间) - **扩展性评估**:线性扩展比 $\alpha = \frac{\text{新增资源性能提升}}{\text{资源增量比例}}$(理想值 $\alpha \approx 1$) > **架构反模式警示**:避免过度设计(如初期引入复杂ESB)、忽视技术债累积[^1] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值