rabbitmq 解决数据同步顺序消费导致消息堆积
1、MQ为什么要顺序消费
- 在开发过程中存在数据同步问题,当新增、删除、修改业务数据并需要通过MQ异步同步至其他数据源,为保证数据一致性,所以必须要保证消息的顺序消费,因此使用单消费者进行消息消费。
2、为什么会消息堆积
- 但是由于数据变更过快或者修改频繁,数据激增,而消费者消费速度小于消息增长数据,导致队列消息积压
3、如何解决
方案一、分组线程池
-
1、增加消费者
第一个想法就是增加消费者,保证消息能够快速消费,但是这个无法保证消息消费顺序,暂未想到方案 -
2、多线程
第二个想法是在单消费者中使用线程池,通过多线程的方式加快消费速度,但是这个无法保证消息消费顺序,暂未想到解决方案 -
3、拆分队列
第三个想法是拆分队列,将新增、删除、修改等消息放入不同队列,但是还是没有想到如何保证数据可以顺序消费方案 -
4、建一个线程组
第四个想法是在单消费者中创建一个线程组的概念Map<Integer, ExecutorService> map = new ConcurrentHashMap<>(); for (int i = 0; i < 10; i++) { ExecutorService executor = Executors.newSingleThreadExecutor(); map.put(i, executor); }
通过计算唯一ID的hash值获取执行线程,这样保证相同数据使用同一个线程执行,加快消费速度,保证数据消费顺序
方案二、分组MQ
1、初始化20个队列,设置同一个交换机,但是通过计算唯一ID的hash值获取路由键,然后发送消息
2、监听定义20个队列同时消费,如果消费还是慢,可以扩容初始化队列数