问题描述
分期缴费的时候,如果有抵扣,把抵扣已批单的形式从保费中扣除。那么就需要进行批单的处理。批单处理上需要一定时间。
那么问题来了:
- 如果短时间内多次进行分期缴费呢,也就意味着需要进行多次批减保费的操作。每次批减保费是基于上次批减操作进行的,批减需要时间去处理,没处理完,之后的批减/退或其他操作是没办法进行的。
- 还是同样的情况,如果有一次批减发生了错误,那么之后的操作如何处理。
总结为同单高并发,且需要按顺序处理
解决顺序性的方案
利用mq的JMSXGroupID
mq的JMSXGroupID字段,只要consumer保持active,那么同一组的消息会被分到同一consumer下处理。这样可以保证消息处理顺序的正确性。
缺点就是在某种情况下,mq队列会堆积,等待一个consumer处理,而其他consumer是空闲的。
redis锁+mq重发
加redis锁,consumer消费后,自己重发mq。
缺点就是耗费资源,而且重发是秒级。
redis锁+redis队列存放消息
难点在于,对消息的消费,其实第一种方案比较合理,在不知道第一种的情况下,自己实现顺序消费。将进来的消息放到redis的队列中,集合也行,加上redis锁,在释放锁之前获取redis队列里的数据,取出一条进行重新消费。
缺点就是,在某种极端情况下,向redis中放数据在查询数据之后,那么,这条数据就在不会被处理。