常用命令
/etc/init.d/rabbitmq-server start|stop|restart|reload
rabbitmqctl add_vhost vhostname ##创建vhost
rabbitmqctl delete_vhost vhostname ##删除vhost
rabbitmqctl list_vhosts ##变量所有的虚拟主机信息
rabbitmqctl add_user username passwd ##添加一个用户
rabbitmqctl change_password username password ##修改用户密码
rabbitmqctl set permissions -p v_host user ".*" ".*" ".*" ##绑定权限,并且具备读写的权限
rabbitmqctl list_quenens ##显示所有队列
生产者创建消息,发布到代理服务器(rabbitmq),消息包括有效载荷和标签
有效载荷时实际要传输的数据,标签描述了有效载荷
消费者连接到代理服务器,订阅队列,消费者接收消息时,只得到有效载荷,得不到标签
basic.consume:订阅消息
basic.get获取单条消息
basic.ack确认接收消息
basic.reject拒绝接收消息,参数设为true转发到下一个消费者,设为false从消息队列删除
queue.declare创建队列,参数exclusive设为true时,变为私有队列,auto_delete,当最后一个消费者取消订阅时,字段删除消息,一般和exclusive一起使用,你的消费者断开连接时,队列被移除
声明队列时,如已存在,rabbit什么都不做,返回true如果只想检测队列存在,将passive参数设为true,此时,存在->true,不存在返回一个错误,不创建队列
rabbit会丢弃没有消费者的队列
rabbit的权限控制是以vhost为单位的,在集群上创建vhost时,整个集群上都会创建该vhost
rabbitmqctl vhost_list ##查看所有的vhost节点
rabbitmqctl add_vhost [hostname] ##添加一个vhost
rabbitmqctl delete_vhost [hostname] ##删除一个vhost
可以直接运行rabbitmqctl 来管理自己的mq节点,也可以指定-n rabbit@[servername] 来管理远程节点
servername可以是ip或者域名
队列和交换器的durable属性默认false,断电重启之后重新创建队列,消息丢失,将它设为true可以不用重建队列
持久化消息:能从服务器崩溃中恢复的消息,
(1)消息发布前,把它的投递模式设置为2标记持久化,
(2)发送到持久化的交换器
(3)并投放到持久化队列
恢复:写入磁盘上的持久化文件,rabbit会在消息提交到日志后才发送响应,但,若消息路由到了非持久化队列,RQM会自动从持久性日志删除,并无法再重启中自动恢复
消费之后,标记为待垃圾回收
消费之前,RMQ重启,会自动重建队列和交换器,并重播日志中的消息到对应的地方
AMQP的事务概念:把信道设置为事务模式后,发送一条命令后的一系列命令的执行取决于第一条命令是否执行成功,如果失败,后边的命令不会执行,填补了消息发布到持久化到磁盘这段时间的服务器宕机,但会大大损耗rabbit的性能
confirm机制:写入磁盘之后发送包含消息id的确认消息,否则发送not ack信号
交换机的四种类型:
direct,fanout,topic,headers(直接匹配amqp的header,而非路由键)
direct如果路由键匹配,就发送到相应队列
$channel ->basic_publish($msg,'','queue_name);
$msg要发送的信息内容 ''指定使用默认交换器 'queue_name'路由键
默认的路由器不能满足时,使用exchange.declare来声明队列
broker消息队列的服务器实体
exchange交换机,指定消息投入到哪个队列里边
queue消息队列载体,每个消息的投放之处
binding把exchage和queue对应起来
routing key路由关键字,exchange根据这个关键字进行消息的投递
vhost虚拟主机,一个broker可以开设多个vhost,用于不同用户的权限分离
producer:消息生产者,就是投递消息的程序
consumer:消息消费者,就是接收消息的程序
channel:消息通道,可以建立多个channel,每个channel代表一个会话
使用大致流程:
客户端连接到消息服务器,打开一个channel(会话)
客户端声明一个exchange,设置相关熟悉
客户端声明一个queue并设置相关属性
客户端使用routing key,在exchange和queue之间建立绑定关系
客户端投递消息
type:direct binding key和routing key完全一致时投递
topic:用于模糊匹配,*匹配一个单词 #用于匹配多个,可以是0个,匹配不到的消息将被废弃
headers:不根据routing key和binding key决定消息的转发,而是根据发送消息中header信息
fanout:广播模式,最简单的模式,直接忽略routingkey
注意一点:指定了持久化的交换机,在重新启动时才能重建,否则需要客户端重新声明生成才可以
#交换机的持久化并不等于消息的持久化,只有在持久化队列中的消息,才能持久化,如果没有队列,消息是没有地方存储的,消息本身在投递的时候也是有一个持久化标志的,php默认投递到持久化交换机的消息就是持久的消息,不用特别指定
#多个客户端监听同一个队列的时候采用的是轮询的机制
###
添加用户:rabbitmqctl add_user rainbird password
添加权限:rabbitmqctl set_permisions -p "/" rainbird ".*"".*"".*"
删除测试用户:rabbit delete_user guest