自动排车功能模块概述
用户在租车业务中,在选定城市、门店、车型以及时间,下单成功后,订单部分会生成一个订单。此时该订单只下单了门店中有库存的车型,还需要去把该车型中有库存的车辆进行排车。
自动排车就是主动去订单系统捞取未排车的订单,通过一系列业务规则的处理,按照排车优先级的顺序,选出满足一定时间段内无占车单的车辆,排给该订单。
设计点:
- 捞取未排车的订单
2.获取满足条件的,门店中有库存的车型的车辆数据,
3.过滤条件
车辆默认取短租运营车辆(包含已租赁与待租赁)
过滤未完成调度工单和拦截工工单(加盟商订单跳过)chooseVehicleService.removeBlockVehicle(vehList);
交叉占车单过滤
限行过滤
区分车辆二级状态
待租赁的调用顺风车工单验证(加盟商订单没有顺风车订单) chooseVehicleService.passingJudge(vehMap, passingList);
已租赁车辆按需求文档标记排序
排序后取第一辆车作为可排车辆
总体思路:
优先排取车门店车辆,取车门店没车再排供车门店车辆,供车门店也没车就计算可供车门店,挨个查是否有可排车辆.
设计考虑点:
1、在获取门店车型中的车辆库存时,可能会与无车升级的产时冲突,因为是分布式系统,这里需要加一个分布式锁。(使用redis实现,setNex,超时时间设置为10秒,同时使用try-catch-finally,保证一定会释放锁)。
2.分布式锁的选型。 zookeeper、数据库唯一索引实现、redis实现。
-
业务处理复杂,考虑避免OOM,内存泄漏。。
-
一些上下游系统调用以及处理日志记录,用于排查问题以及确认排车步骤是否合理。
5.此功能与无车升级某些处理逻辑是一样的,无车升级为该车型无库存,此时可以换同一级别车型或者高级别的车型,是自动触发的,类似与“排车”,有些功能可以进行抽象后共用。
优化点:
按照顺序来,应该是一个个订单去遍历排车,但是这样处理因为业务过程复杂导致效率低下。
可以进行分组处理,按照城市进行分组后,各个城市的租车订单并行处理,并行去循环遍历订单处理。
补偿机制: 某些特殊条件的下,某些订单一直排不上车,此时可以进行后台手动排车。
其他思考点:
自动排车规则为半小时进行一次自动排车,此依据是业务规则还车后,需要至少半小时的还车整备时间,租车时一般是整点或者半小时的时间,因此按照业务设计为半小时一次。
同时分布式锁的锁定时间设计,需要考虑业务处理时间过程,这个时间需要设置多少秒最合适,目前是10秒,这是根据经验设置的。
待续。
网友评论