RabbitMQ 是一个在AMQP(Advanced Message Queuing Protocol 高级消息队列协议)基础上完成的,可复用的企业消息系统,用Erlang(面向并发的编程语言)实现
使用场景
在项目中,将一些无需即时返回且消耗的操作提取出来,进行了异步处理,而这种异步处理的方式大大的节省了服务器的请求响应时间,从而提高了系统的吞吐量。
Ubuntu 安装
sudo apt-get install rabbitmq-server
Celery 使用RabbitMQ
http://docs.celeryproject.org/en/latest/getting-started/brokers/rabbitmq.html#broker-rabbitmq
服务器管理
查看状态
1.which rabbitmqctl 例如-> /usr/sbin/rabbitmqctl
2.sudo /usr/sbin/rabbitmqctl status
出现Status of node rabbit@ubuntu
...
即为成功
启动节点
1.which rabbitmqctl 例如-> /usr/sbin/rabbitmqctl
2.sudo /usr/sbin/rabbitmq-server
如果启动失败了,请直接查看日志文件,一般日志文件存放在/var/log/rabbitmq下
日志的文件名字为:rabbit@[hostname].log,其中rabbit为默认Erlang节点的名字,而hostname即为当前的主机名字。
以后台进程的方式运行(安装成功后默认)
1.which rabbitmqctl 例如-> /usr/sbin/rabbitmqctl
2.sudo /usr/sbin/rabbitmq-server -detached
关闭节点(永远不要使用KILL来停止RabbitMQ服务器,推荐使用下面的命令来停止RabbitMQ服务器)
1.which rabbitmqctl 例如-> /usr/sbin/rabbitmqctl
2.sudo /usr/sbin/rabbitmqctl stop
注意:此时不仅关闭了Rabbit应用程序,同时也关闭了Erlang节点。
有时只想关闭Rabbit应用程序,而保留Erlang节点继续为其他程序服务(特别是在集群或分布式环境中,一个Erlang系欸但上可能同时运行着其他Erlang程序,这样的关闭节点是不可取的)
此时需要使用sudo ./rabbitmqctl stop_app 即可只关闭运行着的Rabbit 程序
用户管理
查看当前所有存在的用户列表
sudo /usr/sbin/rabbitmqctl list_users
(Celery http://docs.celeryproject.org/en/latest/getting-started/brokers/rabbitmq.html#broker-rabbitmq)
1.创建RabbitMQ用户
sudo rabbitmqctl add_user myuser mypassword
2.添加IP
sudo rabbitmqctl add_vhost myvhost
3.添加标签 查看所有存在的用户列表是 [ ] 里面的内容(详细见下面用户角色)
sudo rabbitmqctl set_user_tags myuser mytag
4.添加权限(-p 代表set_permissions作用在哪个host,三个点分别代表"配置","读","写",*是通配符)
sudo rabbitmqctl set_permissions -p myvhost myuser ".*" ".*" ".*"
5.删除用户
sudo rabbitmqctl add_user delete myuser
6.修改密码
sudo rabbitmqctl add_user myuser newpassword
替换适当的myuser, mypassword, newpassword及myvhost 值。
------------------------------------------------------RabbitMQ 扩展------------------------------------------------------
概念说明
Broker: 简单来说就是消息队列服务器的实体
Exchange: 消息交换机,指定消息按什么规则,路由到哪个队列
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
6.exchange接收到消息后,根据消息的key和已经设置的bingding,进行消息路由,将消息投递到一个或多个队列里
交换机的类型
Direct 完全根据Key 进行投递的交换机
Topic 对Key 进行模式匹配后进行投递的交换机
Fanout 不需要Key的交换机,采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列
RabbitMQ的持久化
1.exchange的持久化,在声明时指定durable=> 1
2.queue的持久化,在声明时指定durable=>1
3.消息持久化,在投递时指定delivery_mode=>2(1是非持久化)
用户角色(managementplugin 管理插件)
为用户添加系统预置的角色,为用户赋予角色,则用户也就拥有了所赋予的所有权限了,角色分为:
1.超级管理员(administrator)
可登录管理控制台(启用managementplugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作
2.监控者(monitoring)
可登录管理控制台(启用managementplugin的情况下),同时可以查看rabbitmq 节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
3.策略制定者(policymaker)
可登录管理控制台(启用managementplugin的情况下),同时可以对policy进行管理,但无法查看节点的相关信息
4.普通管理者(management)
仅可登录管理控制台(启用managementplugin的情况下),无法查看节点信息,也无法对策略进行管理
5.其他
无法登录管理控制台,通常就是普通的生产者和消费者
服务器使用统计
使用-p 选项,指定虚拟主机或路径信息,如果不添加该选项,那么rabbitmqctl 会将“/”作为默认的路径访问。
查看队列
查看默认虚拟机上所有队列列表(或查看指定虚拟机上所有的队列列表 )
sudo /usr/sbin/rabbitmqctl list_queues(list_queues -p vhost1)
查看属性特征名称:
name 队列的名字
messages 消息数目
consumers 消费者数目
memory 内存使用情况
durable 是否持久化
auto_delete 是否会被系统自动删除
查看交换机
查看默认虚拟机上所有交换机的信息列表
sudo /usr/sbin/rabbitmqctl list_exchanges
查看属性特征名称:
name 交换机名字
type 类型
durable 是否持久化
auto_delete 是否会被系统自动删除
查看绑定到交换机的队列
sudo /usr/sbin/rabbitmqctl list_bindings