rabbitmq简介
基本流程
生产者投递消息->与server建立连接->开启信道->声明exchange和queue,通过routingkey绑定->消息到虚拟主机->消息到消息队列->关闭信道和连接
消费者建立连接->消费信息->关闭信道和连接
虚拟主机
全称为virtual host,作用与虚拟机、容器类似,都是一种隔离工具,虚拟主机之间的交换机、队列、消息均不能互通。在manage页面可以新建虚拟主机(通常以/开头),并为其配置允许对该虚拟主机进行操作的用户。
应用场景
在业务较为复杂的情况下可以设置多个vhost,给不同的用户操纵不同vhost的权限
新建虚拟主机
通常在新建Vhost时,新Vhost的名字命名通常以”/“开头
命令行:rabbitmqctl add_vhost name
新建用户
命令行:rabbitmqctl add_user username password
tags为用户的权限
- administrator:管理员,有所有权限
- monitoring:可以访问管理网页,修改所有连接和channel,以及所有与节点相关的信息
- policymaker:可以访问管理网页,只能修改自己有权限的vhost
- management:可以访问管理网页
命令行:rabbitmqctl set_user_tags username administrator
用户刚创建时是没有对任何虚拟主机进行操作的权限的,点击用户名
就可以为用户设置有权限操作的虚拟主机
命令行:rabbitmqctl set_permissions -p "vhostname" username ".*" ".*" ".*"
访问vhost
连接的uri格式为(以amqp为例)amqp://(username):(password)@IP:port/(Vhost)
例子
刚发过几条消息,guest用户看到的内容如下
将用户testuser访问虚拟主机”/“的权限删除,并将testuser的权限(tags)改为Policymaker
这是testuser用户看到的场景
坑
在admin修改其他用户的信息时,界面如下
这里的password是该用户修改后的密码,而不是验证当前用户的密码。
如果登录时出现密码错误,则会提示“您与此网站的连接不是私密连接”,而不是“密码错误”。
常用交换器
direct
点对点,通过特定的routing key锁定队列
注:在能够正常访问IP:port但无法通过routingKey获取队列的情况下生产者发送数据不会提示报错
fanout
发送到所有与该exchange绑定的队列
发送时会发送到所有队列,但消费时不会因为一个队列消费了该消息而将相同的消息从其他队列中移除
topic
一对n,识别routing key
*表示匹配一个词,#表示匹配1+个词,topic的格式为XX.XX.XX……
headers
有若干个key与对应的value,设定x-match来表示需要所有的key都匹配(all)或是部分匹配(any)
集群模式
主从模式
生产者和消费者只能对master(中的master queue)进行操作,连接到非master节点会被路由到master。
主从模式的优点在于部署简单,适用于并发与数据量不高的情况。
镜像模式
镜像模式的数据存在每一个节点上,所有节点的数据同步,能较好地保证数据的安全性。但由于节点多的时候同步的成本较高,因此无法线性扩展节点。
在一个集群刚被部署时候,是默认为主从模式的,想要改成镜像模式,可以通过设置policy来实现
name:policy的名称
pattern:队列的匹配模式,正则表达式
definition:镜像定义
- ha-mode:指明镜像的队列,有效值为all、exactly、nodes。all为在所有节点上都进行镜像(默认);exactly表示在指定个数的节点上进行镜像,节点个数由ha-params指定;nodes表示在指定节点上进行镜像,节点名称通过ha-params指定
- ha-params:ha-mode需要用到的参数
- ha-sync-mode:消息同步的方式,有效值为automatic和manual。manual意为当一个从节点加入或重新加入时,需要命令行手动进行同步,命令为
rabbitmqctl sync_queue name
,取消同步命令为rabbitmqctl cancel_sync_queue name
;automatic意为当一个从节点加入或重新加入时,rabbitmq将自动进行同步,但在同步完成前所有操作都会被阻塞 - ha-promote-on-shutdown:有效值为when-synced和always。when-synced意为只有在非可控的主节点关闭(如断网等)时,才会故障恢复到一个非同步的从节点;always则是在任何情况下只要主节点关闭,就进行故障恢复。
在pod内部可以通过rabbitmqctl list_policies
命令来查看是否为镜像模式,以及镜像模式的各个参数。
PS:在主节点服务因未知原因宕机后,会自动将新的节点作为主节点,并不影响正常使用,在原主节点恢复正常后不会将原主节点切换为主节点
多活模式
多活要求部署多套rabbitmq集群,通过federation插件达到在节点和集群之间传输消息的效果,并且连接的双方可以是不同的user和vhost,也可以使用不同版本的rabbitmq和erlang。
持久化介绍
交换器
交换器持久化后能保证在服务重启后交换器的元数据不丢失
队列
交换器持久化后能保证在服务重启后队列的元数据不丢失
消息
交换器持久化后能保证在服务重启后消息数据不丢失
优缺点
消息持久化是通过将消息写入磁盘来保证的,但由于磁盘的读写速度比内存读写要慢很多,因此在非必要的情况下不采用持久化的处理
即使是采用的镜像模式,在节点出故障后未被持久化的消息也会被删除
为什么选rabbitmq
优点
- 相对轻量,容易部署和使用
- 允许消息的发布确认
- 除AMQP还支持STOMP、MQTT等多种协议
- 较好的容错处理(通过交付重试和死信交换器)
- 可定时消费((TTL+死信交换器)/延迟队列)
缺点消息堆积处理不好
- 性能上有瓶颈,不适合性能要求非常高的场景(TransactionPerSecond在几万到十几万)
- 二次开发成本较高
- 不保证消息有序(发送失败后会重新回到队列)
- 不支持回溯(消费过的消息不会被保留)