文章目录
- 1 为什么使用RabbitMQ
- 2 为什么RabbitMQ这么快
- 3 AMQP介绍
- 3.1 AMQP的核心概念
- 3.2 AMQP分层:
- 4 RabbitMQ的整体结构
- 4.1 结构图
- 4.2 不同的交换机类型
- 5 相关命令
- 5.1 服务相关命令
- 5.2 用户相关命令
- 5.3 虚拟主机相关命令
- 5.4 队列相关命令
- 5.5 集群相关命令
- 参考
1 为什么使用RabbitMQ
- RabbitMQ是开源的。
- RabbitMQ提供了可高的消息投递模式(confirm)、返回模式(return)。
- RabbitMQ能够完美地整合SpringAMQP,API非常丰富。
- RabbitMQ的集群模式非常丰富,支持表达式配置,HA模型,进行队列模型。
- RabbitMQ可靠性高,能保证数据不丢失。
2 为什么RabbitMQ这么快
- RabbitMQ是使用Erlang开发,而Erlang有着和原生Socket一样的延迟。
3 AMQP介绍
AMQP协议是指高级消息队列协议(Advanced Message Queuing Protocol)。
3.1 AMQP的核心概念
- Server:或者称为Broker,消息中间件的服务节点,接受客户端的连接,实现AMQP实体服务。
- Connection:连接,指客户端与服务节点之间的网络连接。
- Channel:网络信道,Channel是进行消息读写的通信。客户端与服务节点直接可以建立多个Channel,一个Channel便是一个会话任务。
- Message:消息,客户端和服务节点之间传递的数据。由Properties和Body组成,Properties可以对消息进行修饰,比如消息的优先级、延迟等高级特性,Body则是消息体内容。
- Exchange:交换器,生产者将消息发送到Exchange,由Exchange将消息路由到一个或者多个队列中。
- Biding:Exchange和Queue之间的虚拟连接,指将二者绑定在一起,在绑定时一般会指定一个BindingKey(绑定键)。
- RoutingKey:路由键,生产者将消息发送给交换机时,会通过RoutingKey来确定该消息的路由规则,即消息流向哪里。
- Queue:或者成为Message Queue,是消息队列,保存消息并将它们转发给消费者。一个Queue可以被多个消费者订阅。
- Virtual Host:虚拟地址,用于进行逻辑隔离(就比如一个Mysql,可以分出多个DB,这就是逻辑隔离),最上层的消息路由。一个Virtual Host里面可能包含若干个不同名的Exchange和Queue。
3.2 AMQP分层:
- Module Layer:位于协议最高层,主要定义了一些提供客户端调用的命令,客户端可以利用这些命令是自己的业务逻辑。可以理解为客户端的API。
- Session Layer:位于中间层,主要负责将客户端的命令发送给服务器,再将服务器端的应答返回给客户端,主要为客户端与服务端之间的同学提供可靠的同步机制和错误处理。
- Transport Layer:位于最底层,主要传输而姜汁数据流,提供帧的处理、信道复用、错误检测和数据表示等。
4 RabbitMQ的整体结构
4.1 结构图
RabbitMQ是遵循AMQP协议的,所以其核心概念与AMQP一致。其中需要注意一下Binding:
- 在绑定交换器和队列时使用的是BindingKey,在发送消息时使用的是RoutingKey,二者虽然是不同的概念,但是在大部分情况下值都是相同的,尤其是使用direct类型的交换器时,所以可以统称为路由键。
- 生产者将消息发送给交换器时需要指定一个Routingkey,当BindingKey和RoutingKey相匹配时,消息会被路由到对应的队列中。
- 在绑定多个队列到同一个交换器时,允许使用相同的BindingKey。
- 在不同的交换器类型下,BindingKey和RoutingKey的匹配方式也有所不同,可能是完全匹配,也可能是模糊匹配,甚至是无需匹配。
4.2 不同的交换机类型
- fanout:会无视BindingKey,会把所有发送到该交换器的消息路由到所有与该交换器绑定的队列中。
- direct:将消息路由到BindingKey和RoutingKey完全匹配的队列中。
- topic:将消息路由到BindingKey和RoutingKey模糊匹配的队列中,注意,这里的模糊是有规则的,比如“ * ”用于匹配一个单词,“ # ”用于匹配多个单词,单词直接是由“ . ”分隔。
- headers:不依赖于路由键的匹配规则来路由消息,而是根据发送消息的内容中的headers属性来进行匹配。该类型的交换机性能差且不实用,基本上不使用。
5 相关命令
vhostpath:指虚拟主机。
5.1 服务相关命令
- 启动服务:rabbitmqctl start_app
- 关闭服务:rabbitmqctl stop_app
- 查看服务节点状态:rabbitmqctl status
- 移除所有数据(需关闭服务后执行):rabbitmqctl reset
5.2 用户相关命令
- 添加用户:rabbitmqctl add_user username password
- 查看所有用户:rabbitmqctl list_users
- 删除用户:rabbitmqctl delete_user username
- 清除用户权限:rabbitmqctl clear_ppermissions -p vhostpath username
5.3 虚拟主机相关命令
- 查看所有的虚拟主机:rabbitmqctl list_vhosts
- 创建虚拟主机:rabbitmqctl add_vhost vhostpath
- 查看虚拟主机上所有的权限:rabbitmqctl list_permissions -p vhostpath
- 删除虚拟主机:rabbitmqctl delete_vhost vhostpath
5.4 队列相关命令
- 查看所有的多列信息:rabbitmqctl list_queues
- 清除队列里的消息:rabbitmqctl -p vhostpath purge_queue blue
5.5 集群相关命令
- 查看集群状态:rabbitmqctl cluster_status
- 组成集群命令:rabbitmqctl join_cluster <clusternode> [–ram] 注意:–ram指的是存储模式。
- 修改集群节点的存储模式:rabbitmqctl change_cluster_node_type disc | ram disc;注意:指的是磁盘,ram指的是内存。
- 移除节点:rabbitmqctl forget_cluster_node [–offline] disc;注意:–offline指的是在服务不启动的情况下移除节点。
- 修改节点名称:rabbitmqctl rename_cluster_node oldNode1 newNode1 oldNode2 newNode2 …
参考
- 电子工业出版社,朱忠华 著, 《RabbitMQ实战指南》