互联网一致性架构设计 -- 库存扣除一致性
业务复杂、数据量大、并发量大的业务场景下,典型的互联网架构,一般会分为这么几层:
- 调用层,一般是处于端上的browser或者APP
- 站点层,一般是拼装html或者json返回的web-server层
- 服务层,一般是提供RPC调用接口的service层
- 数据层,提供固化数据存储的db
扣除库存的过程
对于库存业务,一般有个库存服务,提供库存的查询、扣减、设置等RPC接口:
1. 库存查询,stock-service本质上执行的是
select num from stock where sid=$sid
2. 库存扣减,stock-service本质上执行的是
update stock set num=num-$reduce where sid=$sid
3. 库存设置,stock-service本质上执行的是
update stock set num=$num_new where sid=$sid
用户下单前,一般会对库存进行查询,有足够的存量才允许扣减:
例如:总库存 = 5
用户下单时,接着会对库存进行扣减:
例如:扣除3个商品,剩余2
容错机制
架构在容错性上,往往需要一次重做,以防第一次扣除失败,就会调用重做来弥补。
重试时,有可能会出现重复扣除,如果数据库层面有重试容错机制,可能导致一次扣减执行两次,最终得到一个负数的错误库存。
原因:因为“扣减”操作是一个非幂等的操作,不能够重复执行。
解决方法:将扣除改成设置。
同样是购买3单位的商品,通过设置库存操作,即使有重试容错机制,也不会得到错误的库存,设置库存是一个幂等操作。
高并发下扣除商品
查询
并发购买
- 用户1购买了3个库存,于是库存要设置为2
- 用户2购买了2个库存,于是库存要设置为3
- 这两个设置库存的接口并发执行,库存会先变成2,再变成3,导致数据不一致(实际卖出了5件商品,但库存只扣减了2,最后一次设置库存会覆盖和掩盖前一次并发操作)
原因:设置操作发生的时候,没有检查库存与查询出来的库存有没有变化。
解决方法:修改设置的sql
修改前:
update stock set num=$y where sid=$sid
修改后:
update stock set num=$num_new where sid=$sid and num=$num_old
这正是大家常说的“Compare And Set”(CAS),是一种常见的降低读写锁冲突,保证数据一致性的方法。
其他解决方法
1. 数据一致性:通常方法是使用乐观锁解决(时间戳、版本号)
2. 可以用redis的事务性解决扣除库存问题,但是小心数据丢失,实际使用还要看业务
3. 能否用事务解决?容易死锁,而且吞吐量低,不建议。
4. 能否用分布式锁,如:setnx、mc、zookeeper?可以,但是吞吐量高不高?
5. 使用队列,在数据库侧串行化执行,降低锁冲突。
相关推荐
- 数据库设计遵循规范化原则,保证数据的一致性和完整性。 5. **安全性考虑**: - 采用HTTPS协议确保数据传输安全,防止信息被窃取。 - 对敏感操作(如支付、修改用户信息)进行二次验证,如短信验证码或微信...
2. 防止超卖:使用预扣库存策略,先扣减库存再发起支付请求,避免数据一致性问题。 3. 限流与熔断:通过Hystrix等工具进行流量控制,防止系统雪崩。 4. 异步处理:订单创建、库存扣除等操作可异步化,提高系统响应...
分布式事务在Java开发中是一个非常重要的主题,尤其是在大型系统或者微服务架构中,它涉及到多个节点之间的数据一致性问题。TCC(Try-Confirm-Cancel)是解决这个问题的一种常见方案,尤其适用于业务逻辑复杂的场景...
6. **JTA(Java Transaction API)**:JTA用于管理事务,确保在多组件操作中的数据一致性。在这个系统中,当涉及多步操作,如下载软件需要扣除用户积分时,JTA可能会被使用。 7. **JMS(Java Message Service)**:...
支付结算系统架构设计是构建电商平台或服务中至关重要的部分,它连接消费者、商家以及金融机构,确保交易的安全、高效和准确。以下将详细阐述支付系统的关键组成部分、核心流程以及对账和结算管理。 首先,支付系统...
微服务架构的实施,需要考虑到诸如服务划分、服务治理、服务间通信、数据一致性、服务安全、监控和日志记录等方面。每个服务都需要独立的数据库,以确保服务之间的解耦,并允许每个服务独立发展和扩展。服务之间通过...
这包括评估现有系统的复杂性,识别关键业务流程,制定合理的迁移策略,以及确保数据安全和一致性。同时,引入微服务、容器化和云技术可以帮助实现更灵活、可扩展的架构。通过逐步演进,中小银行可以构建出更健壮、...
- **CAP理论**:一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)是分布式系统设计的三大核心原则。在分布式环境中,系统必须在一致性、可用性和分区容错性之间做出权衡。由于...
数据库设计应遵循第三范式,确保数据的完整性和一致性。 2. 模块划分:库存管理系统一般包括入库管理、出库管理、库存查询、统计分析等多个模块。每个模块需独立设计,保证系统结构清晰,便于维护和扩展。 二、用户...
总结,设计一个高效的秒杀系统涉及多个层面,包括系统架构、并发控制、库存管理、数据一致性、用户体验优化以及监控与故障恢复。理解这些知识点,对于构建稳定、高性能的电商秒杀系统至关重要。
例如,最终一致性模型牺牲了一致性来提高可用性和分区容错性,而强一致性系统则倾向于牺牲可用性以保证数据一致性。 分布式事务的解决方案多种多样,如两阶段提交(2PC)、补偿事务(Saga)、最终一致性、Paxos、...
Python的SQLite或MySQLdb库可能用于连接和操作数据库,实现数据的增删改查操作,保证数据的安全性和一致性。 3. **数据模型** 模型层负责处理数据逻辑,通常包括药品类(Drug)、库存类(Inventory)等。这些类...
- 确保数据的一致性和完整性。 3. **表间关系**: - 通过外键等方式建立表之间的关联。 - 设计合理的索引以提高查询效率。 #### 六、系统概要设计 1. **总体架构设计**: - 采用数据库/应用服务器/客户端的三...
- 表间关系明确,通过外键关联确保数据的一致性和完整性。 ##### 2. 安全性设计 - **身份验证**:系统提供了登录功能,只有通过验证的用户才能访问系统中的敏感信息。 - **权限控制**:不同的用户角色拥有不同的...
- 这种不一致性会直接影响到数据分析的有效性和准确性。 3. **指标变动频繁**: - 同名指标在不同时间和场景下含义不同。 - 如“销售额”在不同地区、不同时期可能包含不同的内容(如是否扣除退货等)。 - 这种...
此外,需要设计数据库表结构,包括字段定义、数据类型、主键和外键等,以确保数据的一致性和完整性。对于4S店系统,可能有车辆表、客户表、订单表和用户权限表等。 3. **主要功能设计**: - **概述**:这部分内容...