Rabbitmq-死信队列

Rabbitmq-死信队列

  • 队列的参数发生改变后,不会进行更新操作;此时直接启动会报错,需要手动删除当前队列。

  • 不过在实际开发中不建议删除队列;可以重新起一个队列名称进行绑定。

声明队列与交换机,并且绑定它们之间的关系

package com.zhang.rabbitmq.springbootrabbitmqproducer.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
* 死信队列
*/
@Configuration
public class DeadDirectConfiguration {

   //声明队列与类型
   @Bean
   public DirectExchange deadDirectExchange(){
       return new DirectExchange("dead_direct_exchange",true,false);
  }

   //声明队列
   @Bean
   public Queue deadQueu(){
       return new Queue("dead.direct.queue", true);
  }

   //绑定交换机与队列
   @Bean
   public Binding bindingDeadExchangeByDeadQueue(){
       return BindingBuilder.bind(deadQueu()).to(deadDirectExchange()).with("dead");
  }
}

绑定TTL过期队列与死信队列之间的关系

 

 

 

 

 

 

package com.zhang.rabbitmq.springbootrabbitmqproducer.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;

/**
* 过期队列-TTL-交换机和队列的绑定
*/
@Configuration
public class TTLDirectConfiguration {

   //声明交换机和类型
   @Bean
   public DirectExchange TTLDirectExchange(){
       return new DirectExchange("ttl_direct_exchange",true,false);
  }

   //声明过期队列-ttl
   @Bean
   public Queue TTLQueue(){
       //设置过期时间
       Map<String, Object> arge = new HashMap<>();
       //过期时间-消息过期后会将消息转移到死信队列中
       arge.put("x-message-ttl", 5000);
       //死信队列-将ttl过期队列与死信队列绑定
       arge.put("x-dead-letter-exchange","dead_direct_exchange");
       //死信队列的路由key
       arge.put("x-dead-letter-routing-key","dead");//如果是fanout模式,则不用设置routingKey
       //队列能接收的最大容量
       arge.put("x-max-length",25);
       return new Queue("ttl.direct.queue",true,false,false,arge);
  }

   //声明队列
   @Bean
   public Queue TTLMessageQueue(){
       return new Queue("ttl.message.direct.queue",true);
  }

   //绑定交换机与队列
   @Bean
   public Binding TTLQueueByExchange(){
       return BindingBuilder.bind(TTLQueue()).to(TTLDirectExchange()).with("ttl");
  }
   @Bean
   public Binding TTLMessageQueueByExchange(){
       return BindingBuilder.bind(TTLMessageQueue()).to(TTLDirectExchange()).with("ttlMessage");
  }
}
  • 死信队列:保存 TTL 队列中的过期信息的队列,被称为死信队列。

 

内存磁盘的监控

设置内存大小命令:根据电脑内存空间自动计算

rabbitmqctl set_vm_memory_high_watermark 0.6

设置磁盘大小命令:

rabbitmqctl set_vm_memory_high_watermark absolute “4G”

 

集群

1、查看Rabbitmq是否有启动

ps aux|grep rabbitmq
或者
systemctl status rabbimq-server

表示有服务启动

 

 

 

2、停止Rabbitmq服务

systemctl stop rabbitmq-server

3、启动第一个节点 rabbit-1

sudo RABBITMQ_NODE_PORT=5672 RABBITMQ_NODENAME=rabbit-1 rabbitmq-server start &

4、启动第二个节点rabbit-2

sudo RABBITMQ_NODE_PORT=5673 RABBITMQ_SERVER_START_ARGS="-rabbitmq_management listener [{port,15673}]" RABBITMQ_NODENAME=rabbit-2 rabbitmq-server start &

5、查看是否启动成功

ps aux|grep rabbitmq

启动成功

 

 

 

 

 

 

 

6、rabbit-1操作作为主节点

# 停止应用
sudo rabbitmqctl -n rabbit-1 stop_app; -n 表示服务的名称;
# 目的是清除节点上的历史数据(如果不清楚,无法将节点加入到集群)
sudo rabbitmqctl -n rabbit-1 reset
# 启动应用
sudo rabbitmqctl -n rabbit-1 start_app

7、rabbit2操作作为从节点

# 停止应用
sudo rabbitmqctl -n rabbit-2 stop_app; -n 表示服务的名称;
# 目的是清除节点上的历史数据(如果不清楚,无法将节点加入到集群)
sudo rabbitmqctl -n rabbit-2 reset
# 将rabbit2节点加入到rabbit1(主节点)集群当中【Server-node服务器的主机名】
sudo rabbitmqctl -n rabbit-2 join_cluster rabbit-1@'Server-node'
# 启动应用
sudo rabbitmqctl -n rabbit-2 start_app

绑定成功

 

 

8、验证集群状态

sudo rabbitmqctl cluster_status -n rabbit-1

绑定成功

 

 

集群web界面管理调试

rabbitmqctl -n rabbit-1 add_user admin admin
rabbitmqctl -n rabbit-1 set_user_tags admin administrator
rabbitmqctl -n rabbit-1 set_permissions -p / admin ".*" ".*" ".*"
   
rabbitmqctl -n rabbit-2 add_user admin admin
rabbitmqctl -n rabbit-2 set_user_tags admin administrator
rabbitmqctl -n rabbit-2 set_permissions -p / admin ".*" ".*" ".*"

1、集群的消息都是同步的。

2、主节点在运行中时,从节点挂了,数据不会丢失。

3、主节点挂了,从节点中的队列会显示为(down),表示节点已下线,不能接收消息,直到主节点恢复运行之后,从节点才能正常工作。

4、主节点和从节点都挂后,先启动从节点是不能启动成功的,必须要先启动主节点。

 

集群命令

rabbitmqctl -n rabbit-2 start_app   # 启动;
rabbitmqctl -n rabbit-2 stop_app # 停止;
rabbitmqctl -n rabbit-2 reset # 重启;

 

posted @ 2021-06-20 23:07  初夏_雨露  阅读(524)  评论(0)    收藏  举报