RabbitMQ --- 惰性队列、MQ集群

一、惰性队列 1.1、消息堆积问题
当生产者发送消息的速度超过了消费者处理消息的速度,就会导致队列中的消息堆积,直到队列存储消息达到上限 。之后发送的消息就会成为死信,可能会被丢弃,这就是消息堆积问题 。
解决消息堆积有三种思路:
要提升队列容积,把消息保存在内存中显然是不行的 。
1.2、惰性队列
从的3.6.0版本开始,就增加了Lazy 的概念,也就是惰性队列 。惰性队列的特征如下:
1.2.1、基于命令行设置lazy-queue
而要设置一个队列为惰性队列,只需要在声明队列时,指定x-queue-mode属性为lazy即可 。可以通过命令行将一个运行中的队列修改为惰性队列:
rabbitmqctl set_policy Lazy "^lazy-queue$" '{"queue-mode":"lazy"}' --apply-to queues
命令解读:
1.2.2、基于@Bean声明lazy-queue
【RabbitMQ --- 惰性队列、MQ集群】1.2.3、基于@声明
1.3、总结
消息堆积问题的解决方案?
惰性队列的优点有哪些?
惰性队列的缺点有哪些?
二、MQ集群 2.1、集群分类
的是基于语言编写,而又是一个面向并发的语言,天然支持集群模式 。的集群有两种模式:
镜像集群虽然支持主从,但主从同步并不是强一致的,某些情况下可能有数据丢失的风险 。因此在的3.8版本以后,推出了新的功能:仲裁队列来代替镜像集群,底层采用Raft协议确保主从的数据一致性 。
2.2、普通集群 2.2.1、集群结构和特征
普通集群,或者叫标准集群( ),具备下列特征:
结构如图:
2.2.2、部署
集群分类
在的官方文档中,讲述了两种集群的配置方式:
我们先来看普通模式集群,我们的计划部署3节点的mq集群:
主机名控制台端口amqp通信端口
mq1
8081 ---> 15672
8071 ---> 5672
mq2
8082 ---> 15672
8072 ---> 5672
mq3
8083 ---> 15672
8073 ---> 5672
集群中的节点标示默认都是:@[],因此以上三个节点的名称分别为:
获取
底层依赖于,而虚拟机就是一个面向分布式的语言,默认就支持集群模式 。集群模式中的每个 节点使用来确定它们是否被允许相互通信 。
要使两个节点能够通信,它们必须具有相同的共享秘密,称为。只是一串最多 255 个字符的字母数字字符 。
每个集群节点必须具有相同的。实例之间也需要它来相互通信 。
我们先在之前启动的mq容器中获取一个值,作为集群的 。执行下面的命令:
docker exec -it mq cat /var/lib/rabbitmq/.erlang.cookie
可以看到值如下:
FXZMCVGLBIXZCDEMMVZA
接下来,停止并删除当前的mq容器,我们重新搭建集群 。
docker rm -f mq
准备集群配置
在/tmp目录新建一个配置文件 .conf:
cd /tmp# 创建文件touch rabbitmq.conf
文件内容如下:
loopback_users.guest = falselisteners.tcp.default = 5672cluster_formation.peer_discovery_backend = rabbit_peer_discovery_classic_configcluster_formation.classic_config.nodes.1 = rabbit@mq1cluster_formation.classic_config.nodes.2 = rabbit@mq2cluster_formation.classic_config.nodes.3 = rabbit@mq3
再创建一个文件,记录
cd /tmp# 创建cookie文件touch .erlang.cookie# 写入cookieecho "FXZMCVGLBIXZCDEMMVZQ" > .erlang.cookie# 修改cookie文件的权限chmod 600 .erlang.cookie