问题描述

        分期缴费的时候,如果有抵扣,把抵扣已批单的形式从保费中扣除。那么就需要进行批单的处理。批单处理上需要一定时间。
        那么问题来了:

  1. 如果短时间内多次进行分期缴费呢,也就意味着需要进行多次批减保费的操作。每次批减保费是基于上次批减操作进行的,批减需要时间去处理,没处理完,之后的批减/退或其他操作是没办法进行的。
  2. 还是同样的情况,如果有一次批减发生了错误,那么之后的操作如何处理。

        总结为同单高并发,且需要按顺序处理

解决顺序性的方案

利用mq的JMSXGroupID

        mq的JMSXGroupID字段,只要consumer保持active,那么同一组的消息会被分到同一consumer下处理。这样可以保证消息处理顺序的正确性。
        缺点就是在某种情况下,mq队列会堆积,等待一个consumer处理,而其他consumer是空闲的。

redis锁+mq重发

        加redis锁,consumer消费后,自己重发mq。
        缺点就是耗费资源,而且重发是秒级。

redis锁+redis队列存放消息

        难点在于,对消息的消费,其实第一种方案比较合理,在不知道第一种的情况下,自己实现顺序消费。将进来的消息放到redis的队列中,集合也行,加上redis锁,在释放锁之前获取redis队列里的数据,取出一条进行重新消费。
        缺点就是,在某种极端情况下,向redis中放数据在查询数据之后,那么,这条数据就在不会被处理。