RabbitMQ 基本知识笔记
RabbitMQ
1. 安装(CentOS7):
准备依赖环境
yum install -y build-essential openssl openssl-devel unixODBC unixODBC-devel make gcc gcc-c++ kernel-devel m4 ncurses-devel tk tc xz
下载安装rabbitmq, erlang, socat
-
下载RabbitMQ: https://packagecloud.io/rabbitmq/rabbitmq-server
wget --content-disposition https://packagecloud.io/rabbitmq/rabbitmq-server/packages/el/7/rabbitmq-server-3.10.0-1.el7.noarch.rpm/download.rpm
-
erlang下载网站: https://packagecloud.io/rabbitmq/erlang
- RabbitMQ是采用 Erlang语言开发的,所以系统环境必须提供 Erlang环境,需要是安装 Erlang
- Erlang和RabbitMQ版本对照:https://www.rabbitmq.com/which-erlang.html
wget --content-disposition https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-23.3.4.11-1.el7.x86_64.rpm/download.rpm
-
下载 socat(rabbitmq 依赖socat)
wget http://repo.iotti.biz/CentOS/7/x86_64/socat-1.7.3.2-5.el7.lux.x86_64.rpm
-
安装
rpm -ivh erlang-23.3.4.11-1.el7.x86_64.rpm rpm -ivh socat-1.7.3.2-5.el7.lux.x86_64.rpm rpm -ivh rabbitmq-server-3.10.0-1.el7.noarch.rpm
启动 RabbitMQ
-
启动:
rabbitmq-server start
rabbitmq-server -detached 后台启动
-
停止:
rabbitmqctl stop
-
管理插件:
rabbitmq-plugins enable rabbitmq_management
-
访问地址:
http://192.168.10.127:15672/
-
默认用户:
guest
密码:guest
-
验证rabbitmq是否启动
lsof -i:5672
// lsof -i :22 知道22端口被哪个进程占用netstat -lnp|grep 5672
查看5672端口被哪个进程占用
2. RabbitMQ 管理命令
官方文档:https://www.rabbitmq.com/rabbitmqctl.8.html
服务管理
- 关闭应用:
rabbitmqctl stop_app
- 启动应用:
rabbitmqctl start_app
- 节点状态:
rabbitmqctl status
插件管理
- 查看插件列表:
rabbitmq-plugins list
- 安装管理插件:
rabbitmq-plugins enable rabbitmq_managenment
- 卸载管理插件:
rabbitmq-plugins disable rabbitmq_managenment
- 访问地址:
http://192.168.11.76:15672
- 日子文件路径:
/var/log/rabbitmq/rabbit@localhost.log
/var/log/rabbitmq/rabbit@localhost-sasl.log
- 路径:
/usr/local/software
用户管理
- 添加用户:
rabbitmqctl add_user username password
- 列出所有用户:
rabbitmqctl list_users
- 删除用户:
rabbitmqctl delete_user username
- 修改密码:
rabbitmqctl change_password username newpassword
用户角色管理
用户角色可分为五类,超级管理员, 监控者, 策略制定者, 普通管理者以及其他。
-
超级管理员(administrator)
可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。
-
监控者(monitoring)
可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
-
策略制定者(policymaker)
可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息。 -
普通管理者(management)
仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。
-
其他
无法登陆管理控制台,通常就是普通的生产者和消费者。
了解了这些后,就可以根据需要给不同的用户设置不同的角色,以便按需管理。
设置用户角色命令:rabbitmqctl set_user_tags User Tag
User为用户名, Tag为角色名(对应于上面的administrator,monitoring,policymaker,management,或其他自定义名称)。
也可以给同一用户设置多个角色: rabbitmqctl set_user_tags hncscwc monitoring policymaker
用户权限管理
- 列出用户权限:
rabbitmqctl list_user_permissions username
- 设置用户权限:
rabbitmqctl set_permissions --vhost / ghw ".*" ".*" ".*"
- 清除用户权限:
rabbitmqctl clear_permissions --vhost vhostpath username
虚拟主机(vhosts)管理
- 创建虚拟主机:
rabbitmqctl add_vhost vhostpath
- 列出所有虚拟主机:
rabbitmqctl list_vhosts
- 列出虚拟主机上所有权限:
rabbitmqctl list_permissions --vhost /
- 删除虚拟主机:
rabbitmqctl delete_vhost vhostpath
队列操作
- 查看所有队列:
rabbitmqctl list_queues --vhost /
- 清除队列里的消息:
rabbitmqctl --vhost test purge_queue QueueName
高级操作
- 移除所有数据,要在rabbitmqctl stop_app 之后使用:
rabbitmqctl reset
- 组成集群命令:
rabbitmqctl join_cluster <clusternode> [--ram]
- 查看集群状态:
rabbitmqctl cluster_status
- 修改集群节点的存储形式:
rabbitmqctl change_cluster_node_type disc | ram
- 忘记节点(摘除节点):
rabbitmqctl forget_cluster_node [--offline]
- 修改节点名称:
rabbitmqctl rename_cluster_node oldnode1 newnode1 [oldnode2] [newnode2 ...]
消息生产与消费
- ConnectionFactory: 获取连接工厂
- Connection: 一个连接
- Channel: 数据通信信道,已发送和接收消息
- Queue: 具体的消息存储队列
- Producer & Consumer 生产和消费者
Exchange 交换机
Exchange: 接收消息,并根据路由建转发消息所绑定的队列
交换机属性
- Name: 交换机名称
- Type: 交换机类型 direct , topic, fanout, headers
- Durability: 是否需要持久化,true为持久化
- Atuto Delete: 当最后一个绑定到Exchange 上的队列删除后,自动删除该Exchange
- internal: 当前Exchange 是否用于RabbitMQ 内部使用,默认为False
- Arguments: 扩展参数,用于扩展AMQP 协议自定化使用
交换机类型
1. Fanout Exchange
-
这种Fanout模式不处理路由键,你需要简单的讲队列绑定到exchange上,一个发送到exchange的消息都会被转发到与该exchange绑定的所有队列上。很像广播子网,每台子网内的主机都获得了一份复制的消息。Fanout类型的Exchange转发消息是最快的。下面看一张图;
-
从上面这张图中我们发现,在这种模式中增加了Exchange的概念,这就说生产者会创建一个Exchange,并且将消息发送到exhange中,其余的事情不在关心,并且这种模式中,我们会发现拥有多个消费者,并且每个消费者都有一个独立的消息队列。 每个队列都需要绑定到exchange上面。生产者发送的消息,经过exchange到达队列,从而实现一个消息被多个消费者获取的目的。下面看一个比较简单的图
-
在这种模式中我们需要注意的,如果将消息发送到一个没有队列绑定的exchange上面,那么该消息将会丢失,这是因为在rabbitmq中exchange是不具备存储消息的能力,只有队具备存储消息的能力。
2. Direct Exchange : 所有发送到Direct Exchange 的消息被转发到RouteKey中指定的Queue
-
注意: Direct 模式可以使用RabbitMQ自带的Exchange:default Exchange,所以不需要将Exchange进行任何绑定(binding)操作,消息传递时,RouteKey必须完全匹配才会被队列接收,否则该消息会被抛弃。
-
这种模式就要去我们生产者在发送消息的时候,为此消息添加一个路由键,这样在消费者获取的时候才能达到“按需索取”。例如:将不同的级别的错误消息传递给不同的消费者,这就需要用到这种模式:
3. Topic Exchange
任何发送到Topic Exchange的消息都会被转发到所有关心routing_key中指定话题的Queue上
-
这种模式较为复杂,简单来说,就是每个队列都有其关心的主题,所有的消息都带有一个“标题”(routing_key),Exchange会将消息转发到所有关注主题能与routing_key模糊匹配的队列。
-
这种模式需要routing_key,也许要提前绑定Exchange与Queue。
-
在进行绑定时,要提供一个该队列关心的主题,如“#.log.#”表示该队列关心所有涉及log的消息(一个routing_key为”MQ.log.error”的消息会被转发到该队列)。
-
“#”表示0个或若干个关键字,“”表示一个关键字。如“log.”能与“log.warn”匹配,无法与“log.warn.timeout”匹配;但是“log.#”能与上述两者匹配。
-
同样,如果Exchange没有发现能够与routing_key匹配的Queue,则会抛弃此消息。
上面这张图根据颜色进行了路由键匹配的划分,下面四个队列中第一个红色队列,我们会发现它的路由键为“usa.#”这说明凡是路由键以“usa.”开头的消息都会被路由到这个队列中。第二个黄色队列,说明凡是以“.news”结束的路由键都会被路由到这个队列中。这样的模式是我们在使用过程中更加的灵活。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本