写在前面:做供应链业务一年有余了,这一年里MQ帮我们解决了很多问题,在此做一些经验总结;另外,各个公司消息中间件提供的功能大同小异,最基础的推消息、下游异常重试机制应该是都具备的,本文所述也是建立在这样的能力基础上的~
场景一:削峰填谷,降低响应时间,下游异常自动重试、保证成功
举例:对库存模块而言,入库是一个增量操作,当通过了数据校验之后就理应执行成功,但入库操作常常伴有复杂的写库逻辑及乐观锁冲突,同步模型平均响应时间长,且并发条件下乐观锁冲突失败概率较大;这里就可以引入MQ,将写库操作异步处理,简要流程如下:
需要注意的是:
1、如果有重复发消息地可能性,MQ下游需要做业务幂等,整条链路要有并发锁保护(redis实现并发悲观锁可参看文章:https://segmentfault.com/a/1190000014270584);
2、如果下游触发异常,中间件一般会自动重试(并发乐观锁冲突自动重试可解决,中间件一般会提供一直重试、重新入队、丢弃消息等模式,需根据具体场景选取,在此不再赘述);如果是非