RabbitMQ基本应用

RabbitMQ是流行的开源消息队列系统,用erlang语言开发。RabbitMQ是AMQP(高级消息队列协议)的标准实现。


基本概念

关键字 说明
Broker 消息队列服务器的实体
Exchange 消息交换机,它指定消息按什么规则,路由到哪个队列。如果没有队列绑定在exchange上面,那么发送到exchange上面的消息会丢失,一个exchange可以绑定多个队列,一个队列也可以被多个exchange绑定。声明一个已经存在的exchange,只是赋予不同的类型,则会出现创建错误,客户端需要删除已经存在的exchange,然后重新创建新类型的exchange。 exchange的属性,如果启用持久性,则exchange在服务重启前都有效,如果启用自动删除,则exchange在其绑定的queue都被删除后会自动删除掉自身。
常用类型的exchange
direct:转发消息到routingkey指定的队列,完全根据key进行投递的叫做Direct交换机,例如,绑定时设置了routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的才会投递到队列。
topic:按照规则转发消息,对key进行模式匹配后进行投递的叫做Topic交换机,符号”#”匹配一个或多个词,符号””匹配正好一个词。例如”abc.#”匹配”abc.def.ghi”,”abc.”只匹配”abc.def”。
fanout:转发消息到所有绑定的队列,它采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列。
Queue 消息队列载体,每个消息都会被投入到一个或多个队列。
Binding 绑定,它的作用就是把exchange和queue按照路由规则绑定起来。
Routing Key 路由关键字,exchange根据这个关键字进行消息投递。
vhost 虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。
producer 消息生产者,就是投递消息的程序。
consumer 消息消费者,就是接受消息的程序。
channel 消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。

客户端消息投递流程

  1. 连接到消息队列服务器,打开一个channel
  2. 声明一个exchange,并设置相关属性
  3. 声明一个queue,并设置相关属性
  4. 使用routing key,在exchange和queue之间建立好绑定关系
  5. 投递消息到exchange,exchange接收到消息后,根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里

rabbitmqctl

rabbitmqctl [-n <node>] [-q] <command> [<command options>] 
-n node 默认node名称是"rabbit@server",如果你的主机明是'server.example.com',那么node名称是'rabbit@server'。
-q 安静输出模式,信息会被禁止输出

[ command ]

基本的管理功能

stop [<pid_file>]
#停止在erlang node上运行的rabbitmq,会使rabbitmq停止

stop_app 
#停止erlang node上的rabbitmq的应用,但是erlang node还是会继续运行

start_app
#启动erlan node上的rabbitmq的应用

wait <pid_file>
#等待rabbitmq服务启动

reset
#初始化node状态,会从集群中删除该节点,从管理数据库中删除所有数据,例如vhosts等等。在初始化之前rabbitmq的应用必须先停止

force_reset
#无条件的初始化node状态

rotate_logs <suffix>
#轮转日志文

cluster管理

join_cluster <clusternode> [--ram]  
#clusternode表示node名称,--ram表示node以ram node加入集群中。默认node以disc node加入集群,在一个node加入cluster之前,必须先停止该node的rabbitmq应用,即先执行stop_app。

cluster_status  
#显示cluster中的所有node

change_cluster_node_type disc | ram  
#改变一个cluster中node的模式,该节点在转换前必须先停止,不能把一个集群中唯一的disk node转化为ram node

forget_cluster_node [--offline]  
#远程移除cluster中的一个node,前提是该node必须处于offline状态,如果是online状态,则需要加--offline参数。

update_cluster_nodes clusternode   

sync_queue queue  
#同步镜像队列

cancel_sync_queue queue    

用户管理

add_user <username> <password>  
#在rabbitmq的内部数据库添加用户

delete_user <username>  
#删除一个用户

change_password <username> <newpassword>  
#改变用户密码  \\改变web管理登陆密码

clear_password <username> 
#清除用户密码,禁止用户登录

set_user_tags <username> <tag> ...
#设置用户tags

list_users  
#列出用户

add_vhost <vhostpath>  
#创建一个vhosts

delete_vhost <vhostpath>  
#删除一个vhosts

list_vhosts [<vhostinfoitem> ...]  
#列出vhosts

set_permissions [-p <vhostpath>] <user> <conf> <write> <read>  
#针对一个vhosts 给用户赋予相关权限

clear_permissions [-p <vhostpath>] <username>  
#清除一个用户对vhosts的权限

list_permissions [-p <vhostpath>]   
#列出哪些用户可以访问该vhosts

list_user_permissions <username>  
#列出该用户的访问权限

set_parameter [-p <vhostpath>] <component_name> <name> <value>
#

clear_parameter [-p <vhostpath>] <component_name> <key>
#

list_parameters [-p <vhostpath>]
#

policy管理,策略用来控制和修改queues和exchange在集群中的行为,策略可以应用到vhost

set_policy [-p <vhostpath>] [--priority <priority>] [--apply-to <apply-to>]  
<name> <pattern> <definition>    
#name 策略名称,pattern  正则表达式,用来匹配资源,符合的就会应用设置的策略,apply-to 表示策略应用到什么类型的地方,一般有queues、exchange和all,默认是all。priority 是个整数优先级,definition 是json格式设置的策略。

clear_policy [-p <vhostpath>] <name>  
#清除一个策略

list_policies [-p <vhostpath>]  
#列出已有的策略

queues && exchange状态信息

list_queues [-p <vhostpath>] [<queueinfoitem> ...]  
#返回queue的信息,如果省略了-p参数,则默认显示的是"/"vhosts的信息。

list_exchanges [-p <vhostpath>] [<exchangeinfoitem> ...]  
#返回exchange的信息。

list_bindings [-p <vhostpath>] [<bindinginfoitem> ...] 
#返回绑定信息。

list_connections [<connectioninfoitem> ...]  
#返回链接信息。

list_channels [<channelinfoitem> ...]  
#返回目前所有的channels。

list_consumers [-p <vhostpath>]  
#返回consumers,

status  
#显示broker的状态

environment  
#显示环境参数的信息

report  
#返回一个服务状态report,

eval <expr>

rabbitmq-plugins 插件的开启和关闭

rabbitmq-plugins <command> [<command options>]
Commands:
list [-v] [-m] [-E] [-e] [<pattern>]  显示所有的的插件。-v 显示版本 -m 显示名称 -E 显示明确已经开启的 -e显示明确的和暗中开启的
enable <plugin> ...   开启一个插件
disable <plugin> ...  关闭一个插件

开启rabbitmq_management, 插件在安装目录的/plugins下面

rabbitmq-plugins enable rabbitmq_management
abbitmq_management提供一个基于HTTP的API接口,来管理和监控你的rabbitmq。他有web方式和CLI方式,其实web方式是在后端调用HTTP api