实践--接口幂等

背景:

停车入场、出场时,相机一体机会进行识别车牌,根据识别结果调用我们的接口。那么同一辆车在入场或出场时,相机可能会连续多次识别,连续多次调用我们的接口,这就要求与相机一体机对接的HTTP接口实现幂等性。

幂等—业务判断:

实现幂等一般都是通过业务判断来实现。

入场,通过判断:该车辆在该停车场是否有状态为已入场的订单,如果没有,就去创建这样一个订单,如果有,则返回TRUE。

出场,通过判断:该辆车在该停车场是否是否有状态为已入场的订单,如果有,则去执行出场逻辑,如果没有,则返回TRUE。

不幂等的漏洞:

如果是入场,那么同时就会有两个线程进入入场的幂等判断中,发现没有这样一个订单,然后两个线程都去创建订单,最后这辆车入场一次,结果数据库中出现了两条订单。

如果是出场,那么只要前面进入执行出场逻辑的线程没有执行完,订单的状态没有变更为已支付,那么再次请求过来的线程都会判断到没有出场,均去执行出场逻辑。

解决方案:

  1. Sychronized,如果使用同步的方式,虽然可以解决这样的问题,但是把所有线程都给同步了,实际上对于车牌不同的线程之间是不需要进行同步的,造成很多浪费,降低了接口性能。而且如果部署多个实例,还需要考虑分布式锁。
  2. 使用分布式锁的方式,然后通过车牌号、停车场ID进行锁区分,缩小锁的粒度,避免全部同步降低效率。
  3. 使用数据库锁的方式,A线程执行select….for update,无论能不能查到数据,select … for update都会锁住对应的行或者间隙,如果B线程再次执行select … for update,则会阻塞在此行,等待A线程所在事务提交之后,B线程会查出A线程对改行数据的修改或新增结果,然后继续往下走。

最终选择3方案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值