‘壹’ rabbitmq命令和通过网页查看rabbit的消息队列
1:启动
service rabbitmq-server start
2:启用web管理界面
rabbitmq-plugins enable rabbitmq_management
3:创建用户并设置权限
不知道用户和密码的可以创建用户并设置信碰液权限然后登陆网页查看
rabbitmqctl add_user admin admin123
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin '.*' '.*' '.*'
4:登陆查看rabbit的消息状态
http://IP:15672/
5:其他命令吵空
滑物停止:service rabbitmq-server stop
启动:service rabbitmq-server start
查看状态:service rabbitmq-server status
查看状态
rabbitmqctl status
查看用户列表
rabbitmqctl list_users
‘贰’ RabbitMQ-消息堆积&高可用
前置文章:
RabbitMQ-消息可靠性&延迟消息
一、MQ常见问题
二、消息堆积-惰性队列
1、消息堆积问题
2、解决消息堆积方法
3、惰性队列
三、高可用-MQ集群
1、集群分类
2、普通集群
3、镜像集群
4、冲裁队列
确保发送的消息至少被消费一次;
实现消息的延迟投递;
处理消息无法及时消费的问题;
避免单点MQ故障导致整体不可用;
1、消息堆积问题
当生产者发送消息的速度超过了消费者处理消息的速度,轮镇或就会导致队列中的消息堆积,直到队列存储消息达到上限。最早接收到的消息,可能就会 成为死信 ,会 被丢弃 ,这就是消息堆积问题。
2、解决消息堆积方法
3、惰性队列
从RabbitMQ的3.6.0版本开始,就增加了Lazy Queues的概念,也就是惰性队列。
Ⅰ 接收到消息后直接 存入磁盘 而非内存;
Ⅱ 消费者要消费消息时才会 从磁盘中读取 并加载到内存;
Ⅲ 支持 数百万条 的消息腊伍存储。
要设置一个队列为惰性队列,只需要在声明队列时,指定x-queue-mode属性为lazy即可。
Ⅰ 可以通过命令行将一个运行中的队列修改为惰性队列,如下:
rabbitmqctl set_policy Lazy "^lazy-queue$" '{"queue-mode":"lazy"}' --apply-to queues
Ⅱ 用SpringAMQP声明惰性队列,如下:
@Bean注解的形式,如下:
@RabbitListener注解的形式,如下:
Ⅰ 优点
基于磁盘存储,消息上限高;
没有间歇性的page-out,性能比较稳定;
Ⅱ 缺点
基于磁盘存储,消息时效性会降低;
性能受限于磁盘的IO。
官方文档: Clustering Guide — RabbitMQ 。
1、集群分类
是一种 分布式集群 ,将队列分散到集群的各个节点,从而提高整个集群的并发能力。
是一种 主从集群 ,普通集群的基础上,添加了主从备份功能,提高集群的数据可用性。
注意:镜像集群虽然支持主从,但主从同步并不是强一致的,某些情况下可能有数据丢失的风险。
在RabbitMQ的3.8版本以后推出的,底层采用Raft协议确保主从的数据一致性。
2、普通集群
Ⅰ 会在集群的各个节点间共享部分数据,包括:交换机、队列元信息。不包含队列中的消息;
Ⅱ 当访问集群某节点时,如果队列不在该节点,会从数据所在节点传递到当前节点并返回;
Ⅲ 队列所在节点宕机,队列中的消息就会丢失。
Ⅰ 获取Cookie
RabbitMQ底层依赖于Erlang,而Erlang虚拟机就是一个面向分布式的语言,默认就支持集群旅者模式。集群模式中的每个RabbitMQ 节点使用 cookie 来确定它们是否被允许相互通信。
要使两个节点能够通信,它们必须具有相同的共享秘密,称为 Erlang cookie 。cookie 只是一串最多 255 个字符的字母数字字符。
每个集群节点必须具有 相同的 cookie 。实例之间也需要它来相互通信。
首先获取Cookie,指令如下:
其中 YYNCLCJEKVNUFYQFPNZH 这一串就是生成的Cookie,如下:
Ⅱ 删除现有mq容器
Ⅲ 准备rabbitmq.conf配置文件
此处选择在tmp目录下创建,如下:
配置文件内容如下:
Ⅳ 准备Cookie记录文件
Ⅴ 准备集群目录
Ⅵ 拷贝配置文件、Cookie文件到目录
echo :用于字符串的输出,输出字符串到 | 后面;
-t :表示先打印命令,再执行;
-n 1 :表示执行命令时用的args个数为1个。
Ⅶ 创建集群网络
Ⅷ 运行容器
集群中的节点标示默认都是: rabbit@[hostname] 。
Ⅰ 往rabbit@mq1添加队列
在mq2、mq3中也可以查看到该队列,因为元信息共享。
Ⅱ 往simple.queue添加数据
在mq2、mq3中可以查看到消息,如下:
Ⅲ 让mq1宕机
mq2、mq3无法读取到数据,因为只共享元信息,没有同步备份数据,如下:
3、镜像集群
镜像集群官方文档: Classic Queue Mirroring — RabbitMQ 。
普通集群不具备高可用的特性,使用镜像集群可以解决这个问题。
Ⅰ 镜像队列结构是一主多从(从就是镜像);
Ⅱ 所有操作都是主节点完成,然后同步给镜像节点;
Ⅲ 主宕机后,镜像节点会替代成新的主(如果在主从同步完成前,主就已经宕机,可能出现数据丢失);
Ⅳ 不具备负载均衡功能,因为所有操作都会有主节点完成(但是不同队列,其主节点可以不同,可以利用这个提高吞吐量)。
Ⅰ 设置exactly模式
Ⅱ 创建队列
Ⅲ 发送消息
Ⅳ 让mq1宕机
注意:mq1恢复后,该队列的主节点仍然为mq3。
4、冲裁队列
Ⅰ 与镜像队列一样,都是主从模式,支持主从数据同步;
Ⅱ 使用非常简单,没有复杂的配置;
Ⅲ 主从同步基于Raft协议,强一致。
注意:仲裁队列是3.8版本以后才有的新功能。
+2表示有2个镜像节点,仲裁队列默认镜像数为5,集群节点不足5则都是镜像。
@Bean注解配置
修改配置文件
以上即为RabbitMQ-消息堆积&高可用的全部内容,感谢阅读。
‘叁’ rabbitmq如何查找相同的消息内容
消息ID。RabbitMQ可以通过消息的唯一标识符来查找相同的消息内容,这个唯一标识友亩迹符叫做消息ID。消息ID可以由生产者指定或者由好并RabbitMQ自动分配。如果生产者没有设置消息ID,RabbitMQ就会自动生成一耐档个全局唯一的消息ID。
‘肆’ RabbitMQ 消息状态
消息的位置:消息是保存在内存或磁盘上的;
消息是有索引的,索引的位置也是在内存或磁盘上的;
同一时刻可能内存和磁盘中都有消息或索引.
这些场景是根据队列类型来决定的.
在rabbit中,队列中的消息可能会处理以下四种状态毕袭:
alpha:消息内容以及消息在队列中的位置(消息索引)都保存在内存中;
beta:消息内容只在磁盘上,消息索引只在内存中;
gamma:消息内容只在磁盘上,消息索引在内存和磁盘上都存在;
delta:消息的内容和索引都在磁盘上。
——对于持久化消息,消息内容和消息索引都必须先保存在磁盘上,然后才处于上述状态中的一种。即属性是Durable的消息.
通过状态的流转来实现消息位置的变化,目的是在时间和空间中做出合理的取舍.
从内存个CPU的角度来理解就是满足不同的内存和CPU需求。
alpha最耗内存,但很少消耗CPU,因为直接存储在内存中;
delta基本不消耗内存,但是要消耗更多的CPU以及磁盘I/O操作(delta需要两次I/O操作,一次读索引,一次读消息内容, 所以消息尽可能的发送完立刻被消费;
beta及gamma只需要一次I/O操作来读取消息内容)。
gamma更多的是持久化的消息出现的状态。
在队列的状态vqstate(参见 [$RABBIT_SRC/src/rabbit_variable_queue.erl])结构中,存在q1,q2,delta,q3,q4五个队列(使用 q1~q4使用Erlang的queue模块,delta存储结构依赖于消息索引的实现),其中q1,q4只包含alpha状态的消 息,q2,q3只包含beta和gamma状态的消息,delta包含delta状态的消息。
一般情况下消息会以q1->q2->delta->q3->q4的顺序进行状态变换:消息进入队列时,处于alpha状态并保存 在内存中(q1或q4),然后某个时刻发现内存不足,被转换到beta状态(q2,q3)(这时候其实有两个转换 q1->q2,q4->q3),如果还是内存不足,被转换到delta状态(delta)(q2->delta,q3->delta);当从队 列中消费消息时,会先从处于alpha状态的内存队列(q4)中获取消息,如果q4为空,则从beta状态的队列 (q3)中获取消息,如果q3也为空,则会从delta状态的消息队列中读取消息,并将之转移到q3。
上述步骤只是个一般步骤,实际运行时,中间的步骤都是可以跳过的,比如消息可能在一开始被放在q4队列 中、q1队列中的元素会直接跳到q4队列中(这两种情况下,q3,delta,q2队列都为空);当delta队列为空 时,q2队列可以直接跳到q3队列,q1队列也可以直接跳到q3。
RabbitMQ系统中队列进程中消息流动逻辑 1.publish(消息的插入)
如果Q3队列为空,则将消息放入Q4队列,如果Q3队列不为空,则将消息放入Q1队列 2.alpha类毕数州型的消息转化为beta类型的消息(将消息的内容存入磁盘文件)(push_alphas_to_betas函数)
(1).Q1队列的转化,如果磁盘文件中的消息数量为0,则将Q1中的消息写入Q3队列,如果磁盘文件中的 消息数量不为0,则将Q1中的消息写入Q2队列
(2).Q4队列的转化,从Q4队列末端将消息放入到Q3队列的末端 3.beta类型的消手蔽息delta类型的消息(push_betas_to_deltas函数)
(1).从Q3队列末端将消息的队列索引存入磁盘文件
(2).将Q2队列中的消息的队列索引存入磁盘文件 4.如果Q4,Q3中的消息为空,且磁盘文件中有消息,则将从磁盘中读取消息,会将delta类型的消息转化为 beta类型的消息
(1).如果读取一个队列索引磁盘文件后磁盘文件中已经没有消息,则先将读取到的消息存入Q3队列末 尾,然后将Q2队列中的消息存入Q3队列的末尾
(2).如果读取一个队列索引磁盘文件后的磁盘文件中还有消息,则将读取到的消息存入Q3队列末尾
‘伍’ rabbitmq集群模式怎么看到所有节点的statistics
我喊氏也没搜到,但是查看单个节点状态用这个rabbitmqctl cluster_status
(据说在浏览器中可以看到所有节点的信息,如果其他节点信息没有显示启用web管郑姿散理就好,注意这个地册巧方的端口也可能是 15672,所以如果55672端口不行的话就换15672试试,附上原文链接网页链接)