当前位置:   article > 正文

RabbitMQ——幂等性、优先级队列、惰性队列_rabbitmq 幂等的好处

rabbitmq 幂等的好处

1. 幂等性

消费者在消费MQ中的消息时,消费者在ack时网络中断,因此MQ没有接收到确认消息,你们这条消息就会从新发给消费者,但是实际上该消息已经被消费了,故而造成重复消费。

1.1 解决方法

使用全局ID或者UUID每次消费时先判断该消息是否已经消费过。

1.2 消费端幂等性保障

业务高峰期,生产端可能重复发送了消息,那么消费端就需要实现幂等性来确保一条消息不会被消费多次。

1.2.1 唯一ID+指纹码

指纹码:根据一定规则生成或者拼接成的唯一信息码,需要保证唯一性,在消费时判断数据库中是否存在当前指纹码,缺点是高并发影响效率。

1.2.2 Redis原子性

利用Redis执行setnx

2. 优先级队列

具有更高优先级的队列具有较高的优先权,优先级高的消息具备优先被消费的特权。

2.1 添加方法

2.1.1 控制页面添加

优先级值为0~255
在这里插入图片描述

2.1.2 代码配置

队列和消息都需要设置优先级。只有将多条不同优先级的消息发送到队列中之后才能进行排序。

队列优先级:

   Map<String ,Object> argument = new HashMap<>();
   argument.put("x-max-priority",10);
   channel.queueDeclare(QUEUE_NAME,false,false,false,argument);
  • 1
  • 2
  • 3

消息优先级:

AMQP.BasicProperties properties =
                        new AMQP.BasicProperties().builder().priority(6).build();
                channel.basicPublish("",QUEUE_NAME,properties, msg.getBytes(StandardCharsets.UTF_8));

  • 1
  • 2
  • 3
  • 4

2.2 实战测试

生产者:

/**
 * @Description 优先级队列消费者
 * @date 2022/3/14 15:16
 */
public class Producer {

    private static final String QUEUE_NAME = "priority_queue";

    public static void main(String[] args) throws Exception {

        Channel channel = RabbitMQUtils.getChannel();

        Map<String ,Object> argument = new HashMap<>();
        argument.put("x-max-priority",10);
        channel.queueDeclare(QUEUE_NAME,false,false,false,argument);

        int priorityVal = 2;

        for (int j = 0; j < 10; j++) {
            String msg = "优先队列发送消息,顺序:" + j ;
            if (j % 2 == 0){
                msg += "优先级:" + priorityVal;
                AMQP.BasicProperties properties =
                        new AMQP.BasicProperties().builder().priority(priorityVal).build();
                channel.basicPublish("",QUEUE_NAME,properties, msg.getBytes(StandardCharsets.UTF_8));
                priorityVal ++;
            }else{
                channel.basicPublish("",QUEUE_NAME,null, msg.getBytes(StandardCharsets.UTF_8));
            }
            System.out.println("发送成功:" + msg);
        }
        System.out.println("----------==========发送完毕==========----------");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

在这里插入图片描述
接收消息:
在这里插入图片描述
显然优先级高的消息先接收到。

3. 惰性队列

惰性队列是RabbitMQ在3.6.0版本提出的,是将消息保存在磁盘中,通常只有在MQ中堆积了大量的消息的时候才会使用惰性队列。

设置方式:

代码:

Map<String,Object> arg = new HashMap<String,Object>();
arg.put("x-queue-mode","lazy");
channel.queueDeclare("quque_name",false,false,false,arg);
  • 1
  • 2
  • 3

端口:
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/418836
推荐阅读
相关标签
  

闽ICP备14008679号