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个队列同时消费,如果消费还是慢,可以扩容初始化队列数

  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值