- 正常情况:
下架后,一个框绑定一个波次-多个订单
分拨:一个框号绑定一个墙,一个格口对应一个订单
- 出现的异常情况:
下架后,一个框子绑定了多个波次,导致分拨混乱(因为包裹不属于一个波次下的订单,会提醒包裹不属于当前波次,正常直接提醒去哪个格口了)
- 知识点:
拉波次-绑定框号pcs-wms-outstock#OffShelvesService#pullAutoWaveInfo
框号绑定分布式锁时间:8s
完成分拨-解绑框号pcs-wms-outstock#AllotServiceManager#execAllotFinished
- 框重复问题一直陆续出现。主要问题有一下几点:
- COE合箱后误释放框(1号仓的框是合箱后释放):分拨完成释放了一次,这时这些框可以被其他下架波次占用,合箱时再释放会导致被正在占用的框被释放。【已修复-COE合箱不释放框】
- 下架拉波次占用框时,分布式锁时间过短,事务在分布式锁时间内还未提交,导致框被重复占用。【已修复-加长分布式锁的时间】
- 同一扫墙请求多次调用,生成多条绑定记录job_wall_wave_binding(非并发原因)。【已修复-接口幂等】
1、2点展开:可认为框分布式锁获取成功=框状态为已占用(事务未提交)
case1. 分布式锁时间过短,造成事务提交前释放了分布式锁。问题波次与框:4C07框BN19051509381007|BN19051509391003|BN19051509401003
排查步骤:pcs-wms-outstock powerlog,getContainerCode 4C13,按时间定位获取分布式锁获取成功时间,再使用traceId跟。
B1:BN19051509381007: 0b151f1515578863233215655e0d1c
2019-05-15 10:12:04 获取分布式锁成功
2019-05-15 10:12:04 开始落表
2019-05-15 10:12:12 释放分布式锁 1
2019-05-15 10:12:29 落表成功--事务提交,数据库锁释放 2。这里落表整整花了25s...
注意1,2时间,事务还未提交,分布式锁已释放,此时,在事务内框其实已经被占用,但因为尚未提交,对其他事务是不可见的,且框的分布式锁已经被释放,所以就导致了已被占用的框又被占用了,多个波次绑定一个框。
ps:BN19051509391003其实未重复占用框,这里有一个锁等待超时知识点,值得记录一下。
B2:BN19051509391003: 0b15510715578863342013591e0cac
2019-05-15 10:12:18 获取分布式锁成功 3
2019-05-15 10:12:18 等待获排他锁更新sys_container,因为此时B1的事务还未提交,4C07框记录行的排他锁未释放
2019-05-15 10:12:24 等待锁超时,抛出异常,事务回滚,此次拉波次请求无效
2019-05-15 10:12:26 释放分布式锁
B3:BN19051509401003: 0b1548b415578863479504984e0d0b 4C07框
2019-05-15 10:12:28 获取分布式锁成功,等待B1在2019-05-15 10:12:29事务提交锁释放,绑定框号成功
2019-05-15 10:12:36 释放分布式锁
2019-05-15 10:12:29 开始落表
2019-05-15 10:12:31 落表完成
为保证逻辑正确,分布式锁的释放一定要在事务提交后。
case2: 同一扫框请求多次,生成多条job_wall_wave_binding
无效扫墙后,再点完成分拨,又将占用中的框给释放了。
思考:接口开发时,并发情况,幂等,极端情况的考虑。