`
youyu4
  • 浏览: 435467 次
社区版块
存档分类
最新评论

互联网一致性架构设计 -- 库存扣除一致性

 
阅读更多

互联网一致性架构设计 -- 库存扣除一致性

 

 

业务复杂、数据量大、并发量大的业务场景下,典型的互联网架构,一般会分为这么几层:


  • 调用层,一般是处于端上的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. 使用队列,在数据库侧串行化执行,降低锁冲突。

 

 

 

 

 

  • 大小: 22.6 KB
  • 大小: 32.6 KB
  • 大小: 26.1 KB
  • 大小: 29 KB
  • 大小: 32.9 KB
  • 大小: 31.9 KB
  • 大小: 46.9 KB
  • 大小: 48 KB
分享到:
评论

相关推荐

    Java毕业设计-ssm基于微信平台的校园汉服租赁系统的设计与实现演示录像(高分期末大作业).rar

    - 数据库设计遵循规范化原则,保证数据的一致性和完整性。 5. **安全性考虑**: - 采用HTTPS协议确保数据传输安全,防止信息被窃取。 - 对敏感操作(如支付、修改用户信息)进行二次验证,如短信验证码或微信...

    秒杀系统设计与实现.互联网工程师进阶与分析

    2. 防止超卖:使用预扣库存策略,先扣减库存再发起支付请求,避免数据一致性问题。 3. 限流与熔断:通过Hystrix等工具进行流量控制,防止系统雪崩。 4. 异步处理:订单创建、库存扣除等操作可异步化,提高系统响应...

    Java-24-通用设计-分布式事务-TCC.rar

    分布式事务在Java开发中是一个非常重要的主题,尤其是在大型系统或者微服务架构中,它涉及到多个节点之间的数据一致性问题。TCC(Try-Confirm-Cancel)是解决这个问题的一种常见方案,尤其适用于业务逻辑复杂的场景...

    J2EE课程设计-软件下载中心课程设计书+调试好的系统

    6. **JTA(Java Transaction API)**:JTA用于管理事务,确保在多组件操作中的数据一致性。在这个系统中,当涉及多步操作,如下载软件需要扣除用户积分时,JTA可能会被使用。 7. **JMS(Java Message Service)**:...

    支付结算系统架构设计.docx

    支付结算系统架构设计是构建电商平台或服务中至关重要的部分,它连接消费者、商家以及金融机构,确保交易的安全、高效和准确。以下将详细阐述支付系统的关键组成部分、核心流程以及对账和结算管理。 首先,支付系统...

    微服务架构设计电子银行.pdf

    微服务架构的实施,需要考虑到诸如服务划分、服务治理、服务间通信、数据一致性、服务安全、监控和日志记录等方面。每个服务都需要独立的数据库,以确保服务之间的解耦,并允许每个服务独立发展和扩展。服务之间通过...

    中小银行核心系统架构如何解决去耦和扩展性难题-最佳实践.docx

    这包括评估现有系统的复杂性,识别关键业务流程,制定合理的迁移策略,以及确保数据安全和一致性。同时,引入微服务、容器化和云技术可以帮助实现更灵活、可扩展的架构。通过逐步演进,中小银行可以构建出更健壮、...

    分布式事务专题-v1.1.docx

    - **CAP理论**:一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)是分布式系统设计的三大核心原则。在分布式环境中,系统必须在一致性、可用性和分区容错性之间做出权衡。由于...

    VC++库存管理系统

    数据库设计应遵循第三范式,确保数据的完整性和一致性。 2. 模块划分:库存管理系统一般包括入库管理、出库管理、库存查询、统计分析等多个模块。每个模块需独立设计,保证系统结构清晰,便于维护和扩展。 二、用户...

    关于电商系统常用的秒杀

    总结,设计一个高效的秒杀系统涉及多个层面,包括系统架构、并发控制、库存管理、数据一致性、用户体验优化以及监控与故障恢复。理解这些知识点,对于构建稳定、高性能的电商秒杀系统至关重要。

    分布式事务专题-v1.1.pdf

    例如,最终一致性模型牺牲了一致性来提高可用性和分区容错性,而强一致性系统则倾向于牺牲可用性以保证数据一致性。 分布式事务的解决方案多种多样,如两阶段提交(2PC)、补偿事务(Saga)、最终一致性、Paxos、...

    Python的药房库存系统源代码.zip

    Python的SQLite或MySQLdb库可能用于连接和操作数据库,实现数据的增删改查操作,保证数据的安全性和一致性。 3. **数据模型** 模型层负责处理数据逻辑,通常包括药品类(Drug)、库存类(Inventory)等。这些类...

    企业工资管理系统的设计与实现模板

    - 确保数据的一致性和完整性。 3. **表间关系**: - 通过外键等方式建立表之间的关联。 - 设计合理的索引以提高查询效率。 #### 六、系统概要设计 1. **总体架构设计**: - 采用数据库/应用服务器/客户端的三...

    ASP源码asp.net某公司员工管理系统的设计与实现(源代码+论文)

    - 表间关系明确,通过外键关联确保数据的一致性和完整性。 ##### 2. 安全性设计 - **身份验证**:系统提供了登录功能,只有通过验证的用户才能访问系统中的敏感信息。 - **权限控制**:不同的用户角色拥有不同的...

    Java课程设计1

    此外,需要设计数据库表结构,包括字段定义、数据类型、主键和外键等,以确保数据的一致性和完整性。对于4S店系统,可能有车辆表、客户表、订单表和用户权限表等。 3. **主要功能设计**: - **概述**:这部分内容...

    企业指标设计方法指南(25页PPT).pptx

    - 这种不一致性会直接影响到数据分析的有效性和准确性。 3. **指标变动频繁**: - 同名指标在不同时间和场景下含义不同。 - 如“销售额”在不同地区、不同时期可能包含不同的内容(如是否扣除退货等)。 - 这种...

Global site tag (gtag.js) - Google Analytics