RabbitMQ 7
uwupu 啦啦啦啦啦

优先级队列

在消息消费时,消息会根据优先级进行排序,优先级高的消息会被最先被消费。

使用

队列配置

x-max-priority可以配置队列的优先级数。

1
return ExchangeBuilder.directExchange(EXCHANGE).withArgument("x-max-priority",10).build();

消息配置

发送消息的时候要为消息配置优先级。

1
2
3
4
template.convertAndSend(RabbitMQConfig.EXCHANGE,RabbitMQConfig.QUEUE_KEY,"当前是消息"+i, message -> {
message.getMessageProperties().setPriority(7);
return message;
});

注意

在测试过程中,要为消费者设置较小的basicQos,否则由于消费者一次获取多个消息,无法达到优先队列的效果。

原理

RabbitMQ使用堆排序。

惰性队列

介绍

  • 惰性队列可以将消息尽可能多地存储在磁盘中,而不是驻留在内存中,直到消费者需要消费相应消息时才会被加载到内存中。
  • 默认情况下,队列会尽可能地将消息存储在内存中,这样可以更快地将消息发给消费者。
    • 即使是持久化队列,也会在内存中驻留一份备份。
  • 当需要释放内存时,RabbitMQ会将消息换页到磁盘中,这个操作会消耗大量时间,并且造成阻塞队列,无法收到新的消息
  • 在惰性队列中,
    • 持久化队列会将收到的消息直接存入文件系统,减少内存消耗,增加I/O使用,
    • 若是非持久化消息,将不会发生变化。

配置惰性队列

  • 通过配置arguments来配置惰性队列

    1
    2
    3
    4
    5
    6
    7
    8
    @Bean
    public Queue lazyQueue(){
    return QueueBuilder.durable("lazyQueue_Study_1030").withArgument("x-queue-mode","lazy").build();
    }
    @Bean
    public Queue lazyQueue2(){
    return QueueBuilder.durable("lazyQueue_Study_10302").lazy().build();
    }
  • 通过配置Policy的方式配置惰性队列

    hole…

RabbitMQ集群

配置

image

1
2
3
4
rabbitmqctl stop_app #停止当前RabbitMQ
rabbitmqctl reset # 重置RabbitMQ
rabbitmqctl join_cluster [email protected]:port #加入集群
rabbitmqctl start_app # 开启服务

其他命令

查看集群状态:rabbitmqctl cluster_status

从集群中删除节点

1
rabbitmqctl forget_cluster_node rabbitmq@node2 #在集群的任意节点执行

镜像队列

镜像队列配置在Policy中,具体配置三个参数

  • ha-mode:配置镜像队列的复制模式
    • exactly:队列复制到指定数量的节点
    • nodes:将队列复制到所有具有相同名称的节点
    • all:将队列复制到所有节点
  • ha-params:ha-mode指定后的参数
    • exactly模式,这里表示要复制的节点数量
    • nodes模式,这里表示要复制到的节点的名称,如:["rabbitmq@node1","rabbitmq@node2"]
  • ha-sync-mode:表示镜像的同步方式,
    • automatic:异步模式进行同步
    • manual:需要显式调用API进行同步操作

Haproxy,keepalive

实现RabbitMQ的高可用,负载均衡。

Federation插件

Federation联邦,用于为用户优选RabbitMQ主机。

使用

1
2
rabbitmq-plugins enable rabbitmq_federation  #开启插件
rabbitmq-plugins enable rabbitmq_federation_management #开启插件
 评论