RabbitMQ实战指南
2020-09-30 17:17:15 0 举报
AI智能生成
RabbitMQ实战指南思维导图
作者其他创作
大纲/内容
Federation联邦
联邦exchange
要注意的点
1、不同broker节点直接用AMQP 0-9-1协议进行通讯
2、可以容忍不稳定的网络环境
3、一个broker节点中可以有联邦的和普通的交换器(或队列)
4、不需要在N个节点间建立O(N平方)个连接,更容易拓展
5、两个交换器可以互为:federation和upstream
6、默认交换器和内部交换器不能设置federation
工作方式
1、broker1节点的交换器exchangeA
2、broker1内部交换器“exchangeA->broker2 B”
3、broker1内部队列“federation:exhchangeA->broker2 B”
4、broker2交换器exchangeA
联邦queue
要注意的点
1、联邦队列没有继承关系
2、不能用Basic.Get从远程队列拉取消息,只能用Basic.Cosume
工作方式
1、broker1节点的queue1有消息,消费者直接消费queue的消息
2、broker1节点的queue1没有消息,从broker2节点的queue2拉取消息到queue1
相关命令
rabbitmq-plugins enable rabbitmq_federation_management
Federation link
Shovel铲子
优势
1、松耦合
2、支持广域网
3、高度定制
需要注意的点
1、数据的流向,本质一定是从队列流向交换器
相关命令
rabbit_plugins enable rabbitmq_shovel
使用方案
1、消息堆积
Shovel link
cluster集群
需要注意的点
添加节点能线性拓展消息通信和吞吐量
单纯集群没办法保证消息的万无一失,需要配合镜像队列(同步有延迟)。
集群里的所有节点都会备份所有数据信息:队列、交换器、绑定关系、vhost
在集群创建队列,只有队列的宿主节点会启动队列进程,处理消息,其他节点只保存队列元数据
交换机只是保存一个名字和绑定列表,由所连接的通道负责路由消息到队列中
集群对时延敏感,只适合局域网
所有节点都关闭的时候,第一个重新启动的节点,必须是最后停止的节点
集群中必须有一个磁盘节点disc
集群中所有磁盘节点都挂了,集群能正常工作,但是无法执行任何元数据变更命令
相关命令
rabbitmq-server -detached
rabbitmqctl stop
rabbitmqctl cluster_status
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join cluster 基准节点名称
rabbitmqctl start_app
rabbitmqctl change_cluster_node_type {disc ram)
rabbitmqctl forget_cluster_node 节点名称
节点类型
disc
ram
删除节点的方式
rabbitmqctl forget_cluster_node 节点名称 -offline
rabbitmqctl reset
集群升级
1、关闭所有节点的服务,注意采用 rabbitmqctl stop 命令关闭
2、保存各个节点的Mnesia 数据
3、解压新版本的 RabbitMQ 指定的目录
4、指定新版本的Mnesia路径为步骤2中保存的路径
5、启动新的服务,注意先启动最后关闭的节点
节点故障恢复
1、rabbitmqctl forget_cluster_node 节点名称
2、重置,清理Mnesia数据
3、rabbitmqctl join cluster 基准节点名称
集群迁移
元数据迁移方式
1、web管理界面,旧集群导出,新集群导入
2、编写程序,调用rabbit服务器的http接口
数据迁移方式
ForwardMaker
Zookeeper的数据变更监听
高阶知识
存储机制
需要这主意的点
1、不管是持久化消息还是非持久化消息,都能保存到硬盘
持久化消息进入到队列就落盘;为了提高性能,内存中也会保存一份
非持久化消息一般只保存在内存,内存不够时也可以落盘
2、小消息可以存在rabbit_queue_index,大消息可以存在rabbit_msg_store,由queue_index_embed_msgs_below,默认4096B
3、rabbit_queue_index从磁盘读取数据,至少要在内存中维护一个段文件,调大queue_index_embed_msgs_below容易造成内存使用暴涨
4、目标队列是空的,消息会直接交给消费者,不需要在队列暂存
持久层
队列索引rabbit_queue_index
存储的内容
消息的存储位置
是否已经交付给消费者
是否被消费者ack
存储方式
段文件的存储方式
最多存储SEGMENT_ENTRY_COUNT条记录,默认16384
消息存储rabbit_msg_store
分类
非持久化消息的持久化msg_store_transient
持久化消息的持久化msg_store_persistent
存储方式
文件追加
到达最大大小就另起新文件,file_size_limit
存储消息的时候,会保存“消息id->文件存储位置”的映射关系
ETS(Erlang Term Storage)
删除消息,只是删除ETS中的相关信息,在存储文件中将消息标记为“垃圾数据”
队列结构
rabbit_amqqueue_process
backing_queue
Q1
Q2
Delta
Q3
Q4
队列中消息的状态
alpha
beta
gamma
delta
消息状态的变化机制
优先从Q4取消息
Q4为空,从Q3取消息
Q3为空,则整个队列为空
Q3不为空,从Q3取出消息,然后判断Q3和Delta的长度
如果Q3和Delta都为空,则代表Q2、Delta、Q3和Q4都为空,Q1数据可以直接迁移到Q4
如果Q3为空,Delta不为空,将Delta数迁移到Q3
Delta迁移数据到Q3是按分段读取,判断段里的消息数量是否与Delta消息数相等。如果相等,证明Delta被清空,可以把Q2的数据直接迁移到Q3
优化性能的手段
加大prefetchCount
multiple ack
流量控制
惰性队列
特点
1、所有消息都保存到磁盘
2、支持大队列,消息的积压
3、适合存储持久化消息的队列
内存及磁盘告警
内存告警
默认阈值为机器内存的0.4
默认达到阈值的50%,就会开始将内存的消息持久化到磁盘
磁盘告警
默认磁盘剩余空间不足50M
默认每10秒检查一次剩余磁盘空间
流控
突破流控导致的队列性能瓶颈
把多个队列封装成一个队列来使用
镜像队列
原理
1、在其他节点创建备份的队列
2、形成1个master和n个slave的主备
3、master挂了,又启动时间最长的slave成为master
4、除了Basic.bublish其他命令,都只会向master发送,再广播给slave
5、启用事务机制或者publish confirm机制,只有当所有slave都收到命令了,会算完成
收藏
0 条评论
下一页