首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

面试必问,如何保证接口的幂等性?

虽然最后会通过各种办法退还给你,但是心里总还是不爽的,不是么? 所以,就得通过开发来保证接口的幂等性。...但是高并发的请求中,token的验证机制,是不是线程安全的呢? 如果要是线程不安全的话,我们也没有办法保证这个操作的幂等性吧。于是就有了下面的思路。...总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,只更新的时候会判断一下在此期间别人有没有更新这个数据。 而最常用的就是通过版本号或者CAS来实现乐观锁。...就比如我们最常见的: 订单服务 —> 库存服务 (PRC远程调用(服务接口)) 因为分布式部署,很有可能在调用库存服务,因为网络等原因,订单服务调用失败,但其实库存服务已经处理完成,只是返回给订单服务处理结果出现了异常...这个时候一般系统会作补偿方案,也就是订单服务再此放起库存服务的调用,库存减1。

40211
您找到你想要的搜索结果了吗?
是的
没有找到

面试必问,如何保证接口的幂等性?

虽然最后会通过各种办法退还给你,但是心里总还是不爽的,不是么? 所以,就得通过开发来保证接口的幂等性。...但是高并发的请求中,token的验证机制,是不是线程安全的呢? 如果要是线程不安全的话,我们也没有办法保证这个操作的幂等性吧。于是就有了下面的思路。...总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,只更新的时候会判断一下在此期间别人有没有更新这个数据。 而最常用的就是通过版本号或者CAS来实现乐观锁。...就比如我们最常见的: 订单服务 —> 库存服务 (PRC远程调用(服务接口)) 因为分布式部署,很有可能在调用库存服务,因为网络等原因,订单服务调用失败,但其实库存服务已经处理完成,只是返回给订单服务处理结果出现了异常...这个时候一般系统会作补偿方案,也就是订单服务再此放起库存服务的调用,库存减1。

55010

Redis---事务篇

---- 乐观锁 **乐观锁(**Optimistic Lock), 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是更新 候会判断一下在此期间别人有没有更新这个数据...如果两个终端同时对当前key进行修改,一个终端修改完后,对应key的版本号更新,那么另一个终端修改完之后,需要比对当前key的版本是否已经更新,如果更新了,那么当前终端的操作就失效了,即事务被打断了 演示...,因为spring底层就是通过名字匹配的,要不然就是别名匹配 -n :当前的请求次数 -c :当前的并发次数 -n 2000 -c 200 :2000个请求中有200个并发操作,即有200个操作同一刻发生...所以,我们不开启事务的情况下,自己在外面执行的multi方法完全不会生效的(因为连接对象都换了) 手动开启事务: redisTemplate.setEnableTransactionSupport(...当500人同时请求,一个人秒杀到之后,版本号更新,那么剩余人的操作会因为版本号的更新而失效 ---- LUA脚本 Lua 是一个小巧的脚本语言,Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用

68820

微服务应该这么搞,才能少踩坑!

比如订单服务依赖库存服务。我们可以订单服务冗余库存数据(注意控制合理的安全库存,防超卖)。下单减库存,如果库存服务挂了,我们可以直接从订单服务取库存。...数据冗余 服务调用者可以冗余它所依赖服务的数据。当依赖的服务故障,服务调用者可以直接使用冗余数据。 例如,我之前某家自营电商公司。...当时的商品服务依赖于价格服务,获取商品信息,商品服务要调用价格服务获取商品价格。因为是自营电商,商品和SKU数量都不太多,一两万的样子。所以我们商品服务冗余了价格数据。...假如第一步更新订单为“已支付”成功了,第二步扣减库存库存服务挂了或者网络出问题了,导致扣减库存失败。你告诉用户支付成功了,但是库存没扣减。这怎么能行!...假如冻结库存发生超时,tcc框架会回滚(cancel)整个分布式事务,回滚完成后冻结库存请求才到达参与者(库存服务)并执行,这时被冻结的库存就没办法处理(恢复)了。

3.6K20

漫谈悲观锁和乐观锁

但是更新数据的时候,会判断再次期间有没有人去修改这个数据,如果发现被修改了即产生了冲突,则返回给用户错误的信息,让用户决定如何去做。乐观锁适用于读操作多的场景,这样可以提高程序的吞吐量。...都要等待或者直接抛出异常 注意:使用 mysql Innodb 引擎实现悲观锁,必须关闭 mysql 的自动提交属性,因为 MySQL 默认使用 autocommit 模式,也就是说,当你执行一个更新操作后...该店铺的商品表goods和表数据如下: id name num 1 猪肉脯 1 2 牛肉干 1 从表中可以看到猪肉脯目前的数量只有1个了。不加锁的情况下,如果A,B同时下单,就有可能导致超卖。...在对一个数据进行更新前,先持有对这个数据原有值的备份。比如,要将a=2更新为a=3,进行更新前会比较此刻a是否为2.如果是2,才会进行更新操作。...当多个线程尝试使用CAS同时更新一个变量,只有一个线程能够成功,其余都是失败。失败的线程不会被挂起,而是被告知这次竞争失败,并且可以再次尝试。

68720

高并发系统的设计及秒杀实践

涉及到业务各阶段特性的例子就是秒杀系统,第二部分秒杀实践中我会详细介绍。 合适选择和调用缓存 除了业务特性方面,缓存是业务对抗高并发非常重要的一个环节,合理选择缓存的类型和调用缓存的时机非常重要。...对于库存,剩余库存个数,一般来说是全局需要一致的,可以用memcached来缓存,秒杀的过程中,库存变化的非常快,如果直接对库存个数进行缓存,那么秒杀期间就需要频繁的更新缓存,像之前说的,虽然缓存是用来扛并发的...如果缓存true or false的话,这个值秒杀期间是相对稳定的,只需要在库存耗尽的时候更新一次,而且为了防止这一次的更新失败,可以重复更新,利用memcached的cas操作,最后memcached...一个解决的办法是 分库存,比如总共有50000个秒杀名额,可以分50份,放在redis上的50个不同的key,那么每份上1000个库存,用户进入秒杀流程后随机到其中一个库存来修改,这样有50个库存数来竞争...这样专门为高并发设计的系统最大的敌人 是低流量,大部分库存都好近,而有几个剩余库存, 用户会看到明明还能抢却总是抢不到,而在高并发下,用户根本就觉察不到。

1.5K30

如何实现分布式锁?

想到此处,Tomcat立刻去查看各个线程活干得怎么样,有没有人故意偷懒。 线程0x9527和0x7954又在吵架了,原因非常简单,他们俩都去做扣减库存的操作:读取库存,修改库存,写回数据库。...0x7954回答道:“没办法,张大胖的代码就是这么写的,好像是业务要求的,扣减库存之前要检查库存够不够。”...Tomcat这个JVM进程内部,同一个时刻只有一个幸运儿线程可以扣减库存,可是现在有三个Tomcat,出现了三个幸运儿。..., 咱们这么做:” #old_num = 先获取现有的库存数量 #new_num = #old_num - 10 update stock set stock_num = #new_num where...说明在这段时间内没有别的线程更新库存; 如果不成功,那就重新执行这三条语句,直到成功为止, 就这个么简单, 完全不用锁,真是太爽了。

72360

厉害了,用微服务架构 ERP 系统

比如说操作库存的时候,你不能从读库里读库存,然后写库里写入库存。因为主从复制会有时效性,写入的库存并不能马上写入从库。这样的场景ERP中也有多处。何况写库不能扩展,只能有一个。...其次,就是更新非常方便,各个子系统以后台微服务的方式存在。前台一个单独的web项目,这个web项目调用后台这些子系统的服务接口。这样的设计,某个业务子系统需要更新的时候,可以单独更新。...采购入库这个操作设计仓库管理服务中。入库后,需要更新采购子系统中的采购单中的入库数量。这个过程要求数据一致性,也就是采购单入库成功后写入了库存表中的数量,同时要更新采购单表中的入库数量。...如仓库子系统处理采购入库需要增加入库单数据和更新库存数据等多个表。这多个表都在仓库子系统中,我们可以使用一个本地事务来保证仓库子系统中的表数据一致性。然后调用采购子系统更新采购单里的入库数量。...或者更新失败后重新调用仓库子系统回滚入库单和库存数据,达到最终一致性!如图所示: ?

5K20

常见的保障盘点结果准确性的方法和盘点差异的处理方法

盘点的目的之一是保证库存准确性,但不恰当的盘点方法反而会导致库存变得不准确。另外,当盘点出现差异,恰当的处理方法可以帮助发现库存管理中潜在的问题,从而优化库存管理。...有没有办法可以同时利用两者的优点,同时规避两者缺点的盘点方案呢?...1、盘盈的处理办法 1.1 出库货品少发造成的盘盈 A、如果收货方要求补发,则在账面外(WMS之外)做补发货处理,无需做账务登记; B、如果收货方不要求补发,则可以找到原出库单,修改出库单内容(减少出库量...那么,盈亏的处理原则是什么呢,那就是,要么增减实物库存数量,以使其与账务库存数量一致;要么是增减账务库存数量,使其与实物库存数量一致。...仓库企业除了要保证自身的账物数量的一致,同时还要保证与上下游企业间账目数量的一致,这才是保证库存数据整个供应链体系中一致,并保障仓库正常业务运作的关键。

1.7K10

如何使用Redis实现电商系统的库存扣减?

日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等。 解决方案 使用mysql数据库,使用一个字段来存储库存,每次扣减库存更新这个字段。...还是使用数据库,但是将库存分层多份存到多条记录里面,扣减库存的时候路由一下,这样子增大了并发量,但是还是避免不了大量的去访问数据库来更新库存。...基于数据库多库存 第二种方式其实是第一种方式的优化版本,在一定程度上提高了并发量,但是还是会大量的对数据库做更新操作大量占用数据库资源。...基于数据库来实现扣减库存还存在的一些问题: 1、用数据库扣减库存的方式,扣减库存的操作必须在一条语句中执行,不能先selecupdate,这样并发下会出现超扣的情况。...基于redis实现扣减库存的具体实现 我们使用redis的lua脚本来实现扣减库存 由于是分布式环境下所以还需要一个分布式锁来控制只能有一个服务去初始化库存 需要提供一个回调函数初始化库存的时候去调用这个函数获取初始化库存

3K20

2020年PHP中级面试知识点及答案

答:RPC就是要像调用本地的函数一样去调远程函数 主要作用: (1)解决分布式系统中,服务之间的调用问题 (2)远程调用时,要能够像本地调用一样方便,让调用者感知不到远程调用的逻辑。...(库存不足则记得手动释放锁,并重新选择其他库) (12)说一下悲观锁和互斥锁的具体区别 1、互斥锁、自旋锁、读写锁都属于悲观锁,悲观锁认为并发访问共享资源,冲突概率可能非常高,所以访问共享资源前,...(2)vue基础面试题 (3)谈谈你对闭包的理解 1、通过匿名函数实现,一般是普通函数调用匿名函数,返回数据。...allkeys-lru:当内存不足以容纳新写入数据键空间中,移除最近最少使用的key。 allkeys-random:当内存不足以容纳新写入数据键空间中,随机移除某个key。...volatile-lru:当内存不足以容纳新写入数据设置了过期时间的键空间中,移除最近最少使用的key。

99620

面试必问:Redis 如何实现库存扣减操作?

基于数据库多库存 基于redis 基于redis实现扣减库存的具体实现 初始化库存回调函数(IStockCallback) 扣减库存服务(StockService) 调用 ---- 日常开发中有很多地方都有类似扣减库存的操作...解决方案 使用mysql数据库,使用一个字段来存储库存,每次扣减库存更新这个字段。...基于数据库多库存 第二种方式其实是第一种方式的优化版本,在一定程度上提高了并发量,但是还是会大量的对数据库做更新操作大量占用数据库资源。...基于数据库来实现扣减库存还存在的一些问题: 用数据库扣减库存的方式,扣减库存的操作必须在一条语句中执行,不能先selecupdate,这样并发下会出现超扣的情况。...需要提供一个回调函数初始化库存的时候去调用这个函数获取初始化库存 初始化库存回调函数(IStockCallback ) /**  * 获取库存回调  * @author yuhao.wang  *

40630

如何使用Redis实现电商系统的库存扣减?

日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等。 解决方案 使用mysql数据库,使用一个字段来存储库存,每次扣减库存更新这个字段。...还是使用数据库,但是将库存分层多份存到多条记录里面,扣减库存的时候路由一下,这样子增大了并发量,但是还是避免不了大量的去访问数据库来更新库存。...基于数据库多库存 第二种方式其实是第一种方式的优化版本,在一定程度上提高了并发量,但是还是会大量的对数据库做更新操作大量占用数据库资源。...基于数据库来实现扣减库存还存在的一些问题: 用数据库扣减库存的方式,扣减库存的操作必须在一条语句中执行,不能先selecupdate,这样并发下会出现超扣的情况。...基于redis实现扣减库存的具体实现 我们使用redis的lua脚本来实现扣减库存 由于是分布式环境下所以还需要一个分布式锁来控制只能有一个服务去初始化库存 需要提供一个回调函数初始化库存的时候去调用这个函数获取初始化库存

58820

简历上写的电商,那请问Redis 如何实现库存扣减操作和防止被超卖?

基于数据库多库存 基于redis 基于redis实现扣减库存的具体实现 初始化库存回调函数(IStockCallback) 扣减库存服务(StockService) 调用 ---- 日常开发中有很多地方都有类似扣减库存的操作...解决方案 使用mysql数据库,使用一个字段来存储库存,每次扣减库存更新这个字段。...基于数据库多库存 第二种方式其实是第一种方式的优化版本,在一定程度上提高了并发量,但是还是会大量的对数据库做更新操作大量占用数据库资源。...基于数据库来实现扣减库存还存在的一些问题: 用数据库扣减库存的方式,扣减库存的操作必须在一条语句中执行,不能先selecupdate,这样并发下会出现超扣的情况。...我们使用redis的lua脚本来实现扣减库存 由于是分布式环境下所以还需要一个分布式锁来控制只能有一个服务去初始化库存 需要提供一个回调函数初始化库存的时候去调用这个函数获取初始化库存 初始化库存回调函数

26010

面试官:电商库存扣减如何设计?如何防止超卖?

解决方案 使用mysql数据库,使用一个字段来存储库存,每次扣减库存更新这个字段。...还是使用数据库,但是将库存分成多份存到多条记录里面,扣减库存的时候路由一下,这样子增大了并发量,但是还是避免不了大量的去访问数据库来更新库存。...基于数据库多库存 第二种方式其实是第一种方式的优化版本,在一定程度上提高了并发量,但是还是会大量的对数据库做更新操作大量占用数据库资源。...基于redis实现扣减库存的具体实现 我们使用redis的lua脚本来实现扣减库存 由于是分布式环境下所以还需要一个分布式锁来控制只能有一个服务去初始化库存 需要提供一个回调函数初始化库存的时候去调用这个函数获取初始化库存...扣减库存数量 * @return 扣减之后剩余的库存【-3:库存未初始化; -2:库存不足; -1:不限库存; 大于等于0:扣减库存之后的剩余库存】 */ private

45020

Redis 如何实现库存扣减操作?如何防止商品被超卖?

日常开发中有很多地方都有类似扣减库存的操作,比如电商系统中的商品库存,抽奖系统中的奖品库存等。 解决方案 1. 使用mysql数据库,使用一个字段来存储库存,每次扣减库存更新这个字段。 2....还是使用数据库,但是将库存分层多份存到多条记录里面,扣减库存的时候路由一下,这样子增大了并发量,但是还是避免不了大量的去访问数据库来更新库存。 3....[基于数据库多库存] 第二种方式其实是第一种方式的优化版本,在一定程度上提高了并发量,但是还是会大量的对数据库做更新操作大量占用数据库资源。...基于数据库来实现扣减库存还存在的一些问题: 用数据库扣减库存的方式,扣减库存的操作必须在一条语句中执行,不能先selecupdate,这样并发下会出现超扣的情况。...基于redis实现扣减库存的具体实现 我们使用redis的lua脚本来实现扣减库存 由于是分布式环境下所以还需要一个分布式锁来控制只能有一个服务去初始化库存 需要提供一个回调函数初始化库存的时候去调用这个函数获取初始化库存

20210

SAP 历史库存的详解

表MBWEH中,记录历史库存,按照物料+工厂+月份记录物料特定月份工厂下的数量和金额; 1.2 表MBEW和MBEWH记录的逻辑说明 物料MBEW为当前库存信息,因此每次库存变动,都会更新表MBEW...当物料每个月发生第一次货物移动,则在表MBEWH中记录该物料上个月的库存信息,当物料未发生货物移动,但发生金额变动,也会在表MBEWH记录该物料上个月的库存信息。...当物料A1月份发生第一次库存移动,此时系统更新表MBEWH,更新结果为上个月的库存数量和金额,具体而言,本例中,表MBEWH的信息增加记录如下 物料A 月份201012 数量500个 金额5000...元 当物料A1月份再次发生货物移动,由于已经表MBEWH记录了上个月的库存信息,因此不再更新表MBEWH 而物料B1月份未发生任何货物,因此不会更新表MBEWH。...我看到过的 SAP系统 中关于“历史库存报表”或“时点库存报表”的方案无外乎有两种: 一、使用作业的办法,定期(一般是每天)抓取作业执行时刻的库存信息,存储自定义表格中; 二、查询业务单据或物料凭证的明细

3.4K32
领券