RabbitMQ介绍
RabbitMQ
是使用Erlang
语言来编写的,基于AMQP
协议,是跨平台、跨语言的一个消息代理和队列服务器。
高性能的原因:Erlang
语言,面向并发的编程语言。使用于交换机领域,进行数据交互的性能十分优秀。有与原生Socket
一样的延迟。
AMQP介绍
基本概念
AMQP:Advanced Message Queuing Protocol
(高级消息队列协议)。基于二进制的协议。一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
协议模型
核心概念
Server
:又称Broker
,接受客户端的连接,实现AMQP
实体服务。Connection
:连接,应用程序与Broker
的网络连接。Channel
:网络信道,几乎所有操作都在Channel
中进行,是进行消息读写的通道。客户端可建立多个Channel
,每个代表一个会话任务。Message
:消息,服务器和应用程序之间传递的数据。由Properties
和Body
组成。Properties
可以对消息进行修饰,如消息的优先级、延迟等高级特性,Body
是消息体的内容。Virtual Host
:虚拟地址,用于逻辑隔离,最上层的消息路由(划分具体的服务)。一个Virtual Host
可以有若干个Exchange
和Queue
,但同一个Virtual Host
不能有相同名称Exchange
或Queue
。Exchange
:交换机,接收消息,根据路由键转发消息到绑定的队列,可对消息进行过滤。Binding
:Exchange
和Queue
之间的虚拟连接,binding
中可以包含routing key
。
– Routing key
:一个路由规则,虚拟机用它来确定如何路由一个特定消息。(交换路由)
Queue
:又称为Message Queue
,消息队列,保存消息并将它们转发给消费者。
RabbitMQ的架构
架构图
Broker
:消息队列服务进程,此进程包括两个部分:Exchange和Queue。Exchange
:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑。Queue
:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方。Producer
:消息生产者,即生产方客户端,生产方客户端将消息发送到MQ。Consumer
:消息消费者,即消费方客户端,接收MQ转发的消息。
消息发布接收流程:
-
发送消息
- 生产者和
Broker
建立TCP连接。 - 生产者和
Broker
建立通道。 - 生产者通过通道消息发送给
Broker
,由Exchange
将消息进行转发。 Exchange
将消息转发到指定的Queue
(队列)
- 生产者和
-
接收消息
- 消费者和
Broker
建立TCP连接 。 - 消费者和
Broker
建立通道。 - 消费者监听指定的
Queue
(队列) - 当有消息到达
Queue
时Broker
默认将消息推送给消费者。 - 消费者接收到消息。
- 消费者和
消息流转
生产者生产出Message
并投递到Exchange
上。
一个Exchange
可以绑定多个Message Queue
,它根据路由策略(routing key
)路由到指定的队列。
最后由消费端去监听队列。
RabbitMQ
安装与使用
安装(rpm方式):
下载对应版本的Erlang
和RabbitMQ
。
- 安装
erlang
:
- 安装
socat
密钥:
要先安装socat
再安装rabbitmq
,不然会报错。 - 安装
rabbitmq
:
修改配置文件
vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app
默认端口号5672
修改loopback_users
:(保留guest也可)
RabbitMQ
基本命令
关于服务的操作:
- 服务启动:
rabbitmqctl start_app / rabbitmq-server start &
这里有用到主机名,可以通过vim /etc/hostname
来配置。
可以看到rabbitmq
已经启动:- 查看服务是否启动
lsof -i:5672
- 查看服务是否启动
- 服务停止:
rabbitmqctl stop_app / rabbitmq-server stop
- 服务重启:
service rabbitmq-server restart
- 节点状态:
rabbitmqctl status
- 启动管理控制台:
- 管理插件:
rabbitmq-plugins enable rabbitmq_management
- 控制台访问地址:
http://192.168.58.129:15672
- 管理插件:
如果既修改过配置文件,又开启了插件,但是还访问失败,可以看下是不是没有关闭防火墙。
firewalld的基本使用
- 启动:
systemctl start firewalld
- 关闭:
systemctl stop firewalld
- 查看状态:
systemctl status firewalld
- 开机禁用:
systemctl disable firewalld
- 开机启用:
systemctl enable firewalld
关于用户的操作:
- 添加用户:
rabbitmqctl add_user username password
- 列出所有用户:
rabbitmqctl list_users
- 删除用户:
rabbitmqctl delete_user username
- 清除用户权限:
rabbitmqctl clear_permissions -p vhostpath username
- 列出用户权限:
rabbitmqctl list_user_permissions username
- 修改密码:
rabbitmqctl change_password username newpassword
- 设置用户权限:
rabbitmqctl set_permissions -p vhostpath username ".*" ".*" ".*"
关于虚拟主机的操作:
- 创建虚拟主机:
rabbitmqctl add_vhost vhostpath
- 列出所有虚拟主机:
rabbitmqctl list_vhost
- 列出虚拟主机上所有权限:
rabbitmqctl list_permissions -p vhostpath
- 删除虚拟主机:
rabbitmqctl delete_vhost vhostpath
关于消息队列的操作:
- 查看所有队列信息:
rabbitmqctl list_queues
- 清除队列里的消息:
rabbitmqctl -p vhostpath purge_queue blue
RabbitMq
高级命令
rabbitmqctl reset
:移除所有数据,要在rabbitmqctl stop_app
之后使用。- 组成集群命令:
rabbitmqctl join_cluster <clusternode> [--ram]
(ram内存级别存储,disc磁盘) - 查看集群状态:
rabbitmqctl cluster_status
- 修改集群节点的存储形式:
rabbitmqctl change_cluster_node_type disc | ram
- 忘记(摘除)节点:
rabbitmqctl forget_cluster_node [--offline]
(offline服务不启动的情况下) - 修改节点名称:
rabbitmqctl rename_cluster_node oldnode1 newnode1 [oldnode2] [newnode2 ...]
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END