Rabbitmq主体架构
首先这个过程走分三个部分,
1、客户端(生产消息队列)。
2、RabbitMQ服务端(负责路由规则的绑定与消息的分发)。
3、客户端(消费消息队列中的消息);由图可以看出,一个消息可以走一次网络却被分发到不同的消息队列中,然后被多个的客户端消费,那么这个过程就是RabbitMQ的核心机制,RabbitMQ的路由类型与消费模式。
RabbitMQ中间件分为服务端(RabbitMQ Server)和客户端(RabbitMQ Client),服务端可以理解为是一个消息的代理消费者,客户端又分为消息生产者(Producer)和消息消费者(Consumer)。
运行原理图
Exchange(交换器):用于接受、分配消息;
Direct Exchange
在我们之前的日志系统中,所有的消息被广播给所有的消费者,但是本章的需要是希望有一个程序可以只接收error级别的日志并保存到磁盘中,而不用浪费空间去存储那些info、warning级别的日志。
我们正在用的广播模式的交换器并不够灵活,它只是不加思索地进行广播。因此,需要使用direct exchange来代替。直连交换器的路由算法非常简单:将消息推送到binding key与该消息的routing key相同的队列。
为了说明这点,请看下图:
在该图中,直连交换器X上绑定了两个队列。第一个队列绑定了绑定键orange,第二个队列有两个绑定键:black和green。在这种场景下,一个消息在布时指定了路由键为orange将会只被路由到队列Q1,路由键为black和green的消息都将被路由到队列Q2。其他的消息都将被丢失。
多重绑定
同一个绑定键可以绑定到不同的队列上去,在上图中,我们也可以增加一个交换器X与队列Q2的绑定键,在这种情况下,直连交换器将会和广播交换器有着相同的行为,将消息推送到所有匹配的队列。一个路由键为black的消息将会同时被推送到队列Q1和Q2。
Topic Exchange
发送到主题交换器的消息不能有任意的routing key,必须是由点号分开的一串单词,这些单词可以是任意的,但通常是与消息相关的一些特征。比如以下是几个有效的routing key:"stock.usd.nyse", "nyse.vmw", "quick.orange.rabbit",routing key的单词可以有很多,最大限制是255 bytes。
binding key必须与routing key模式一样。Topic交换器的逻辑与direct交换器有点相似:使用特定路由键发送的消息将被发送到所有使用匹配绑定键绑定的队列,然而,绑定键有两个特殊的情况,如下:
•表示匹配任意一个单词 #表示匹配任意一个或多个单词 下图很好地表示这这两个通配符的用法:
在这个例子中,我们将发送所有跟动物有关的消息,这些消息将会发送到由三个单词,两个点号组成的routing key,第一个单词了表示的是速度,第二个单词表示颜色,第三个单词表示种类:
"
我们创建三个绑定关系:队列Q1绑定到绑定键
.orange.
,队列Q2绑定到
.
.rabbit和lazy.#。
总结下来就是:
队列Q1对橘黄色(orange)颜色的所有动物感兴趣;队列Q2对所有的兔子(rabbit)和所有慢吞吞(lazy)的动物感兴趣。
Queue(队列)
用于存储生产者的消息;
消息持久化
Rabbit队列和交换器有一个不可告人的秘密,就是默认情况下重启服务器会导致消息丢失,那么怎么保证Rabbit在重启的时候不丢失呢?答案就是消息持久化。
当你把消息发送到Rabbit服务器的时候,你需要选择你是否要进行持久化,但这并不能保证Rabbit能从崩溃中恢复,想要Rabbit消息能恢复必须满足3个条件:
1.投递消息的时候durable设置为true,消息持久化,代码:channel.queueDeclare(x, true, false, false, null),参数2设置为true持久化;2.设置投递模式deliveryMode设置为2(持久),代码:channel.basicPublish(x, x, MessageProperties.PERSISTENT_TEXT_PLAIN,x),参数3设置为存储纯文本到磁盘;3.消息已经到达持久化交换器上;4.消息已经到达持久化的队列;
持久化工作原理
Rabbit会将你的持久化消息写入磁盘上的持久化日志文件,等消息被消费之后,Rabbit会把这条消息标识为等待垃圾回收。
持久化的缺点
消息持久化的优点显而易见,但缺点也很明显,那就是性能,因为要写入硬盘要比写入内存性能较低很多,从而降低了服务器的吞吐量,尽管使用SSD硬盘可以使事情得到缓解,但他仍然吸干了Rabbit的性能,当消息成千上万条要写入磁盘的时候,性能是很低的。所以使用者要根据自己的情况,选择适合自己的方式。
rabbitmqctl 命令
命令格式
rabbitmqctl [-n ] [-q] []
-n node #默认node名称是"rabbit@server",如果你的主机名是'server.example.com',那么node名称是'rabbit@server' -q #安静输出模式,信息会被禁止输出
基础命令
停止在erlang node上运行的rabbitmq,会使rabbitmq停止 stop
停止erlang node上的rabbitmq的应用,但是erlangnode还是会继续运行的 stop_app
启动erlan node上的rabbitmq的应用 start_app
等待rabbitmq服务启动 wait
初始化node状态,会从集群中删除该节点,从管理数据库中删除所有数据,例如vhosts等等。在初始化之前rabbitmq的应用必须先停止 reset
无条件的初始化node状态 force_reset
轮转日志文件 rotate_logs
集群管理
clusternode表示node名称,--ram表示node以ram node加入集群中。默认node以disc node加入集群,在一个node加入cluster之前,必须先停止该node的rabbitmq应用,即先执行stop_app join_cluster [--ram]
显示cluster中的所有node cluster_status
改变一个cluster中节点的模式,该节点在转换前必须先停止,不能把一个集群中唯一的disk node转化为ram node stop_app change_cluster_node_type disc | ram start_app
远程移除cluster中的一个node,前提是该node必须处于offline状态,如果是online状态,则需要加--offline参数 forget_cluster_node [--offline]
更新集群节点 update_cluster_nodes clusternode
同步镜像队列 sync_queue queue
取消同步镜像队列 cancel_sync_queue queue
用户管理命令
在rabbitmq的内部数据库添加用户 add_user
删除一个用户 delete_user
改变用户密码(也是改变web管理登陆密码) change_password
清除用户的密码,该用户将不能使用密码登陆,但是可以通过SASL登陆如果配置了SASL认证 clear_password
设置用户tags set_user_tags ...
列出用户 list_users
创建一个vhosts add_vhost
删除一个vhosts delete_vhost
列出vhosts list_vhosts [ ...]
针对一个vhosts给用户赋予相关权限 set_permissions [-p ]
清除一个用户对vhosts的权限 clear_permissions [-p ]
列出哪些用户可以访问该vhosts list_permissions [-p ]
列出该用户的访问权限 list_user_permissions
策略管理
策略用来控制和修改queues和exchange在集群中的行为,策略可以应用到vhost。
设置一个policy,"name"为该policy的名字,"pattern"为一个正则表达式,所有匹配该正则表达式的资源都会应用该policy,"definition"是policy的定义,为json格式。"priority"为优先权,整数值。set_policy [-p vhostpath] {name} {pattern} {definition} [priority]
清除一个策略 clear_policy [-p ]
列出已有的策略 list_policies [-p ]
微服务微信交流群添加微信,备注微服务进群交流
关注公众号 soft张三丰
本文分享自微信公众号 - soft张三丰(aguzhangsanfeng)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/2335629/blog/4703971