认真研究RabbitMQ

前言

我所参考阅读的书籍
我阅读的

1.生产者和消费者概念

AMQP

应用层标准高级消息队列协议

信道

当消费者和生产者两种程序连接上Rabbit,他们会和rabbit质检建立TCP连接,然后程序会在TCP的连接内创建一个虚拟连接即信道用于发送AMQP命令。
每个信道都有一个唯一ID,AMQP中有单独的库存贮ID。
使用信道的原因是因为TCP连接频繁新建中断资源消耗太大,如果使用信道则使用一个TCP连接即可。
图中AMQP连接可以理解为一个TCP连接,每个AMQP连接中有多个信道。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PNodTfAi-1596020249768)(/images/5/82/1596016939648.png)]

2.队列

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ub9QX5GL-1596020249771)(/images/5/82/1596016927170.png)]

队列两种订阅形式

basic.consume

使用AMQP该命令,会将信道设置为接收模式,直到取消对该队列的订阅,会一直取队列中的消息直到队列没有消息,还会监控队列有了消息就自动接收。

basic.get

该AMQP命令为订阅该队列获取一条消息然后立刻中断订阅。

队列无人订阅

队列无人订阅,消息会在队列中等待,直到有人订阅,可以设置多久的缓存,例如最多存7天的消息。

一个队列多个消费者

如果队列中有一条消息要发送给A、B两个人,那么这条消息会复制成两个一摸一样的消息分别发送给A和B。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VyDtCqiU-1596020249774)(/images/5/82/1596017977036.png)]

消息确认

消息发送》消费者接收》返回确认接收》消息销毁
消费者接收消息,每一条都必须要进行确认.订阅队列的时候将auto_ack设置为true则接收了消息即确认。
如果消息发送给消费者,但消费者未回复确认则不会在发送新消息给该消费者。

拒绝消息

消费者有两种办法可以拒绝接收消息,1是直接取消订阅消息队列,2是RabbitMQ2.0以上版本的basic.reject命令。

basic.reject命令

该命令中有一个参数requeue,设置为true那么消息会发送给下一个订阅的消费者,false则只有当前消费者获取到消息接收完成该消息就销毁。

死信队列

basic.rejec的requeue设置为了false,那么被拒绝的消息就到了死信队列中,死信队列也是一个消息队列可订阅。

创建队列

消费者生产者都可以使用queue.declare命令创建队列。
注意:消费者如果订阅了队列,那么需要退订再把信道设置为传输,才可以创建队列。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2wlC4SlG-1596020249778)(/images/5/82/1596018631386.png)]

如果声明一个已经存在的队列那么根据queue.declare命令中的passive命令,为true那么则只验证队列是否存在并不会新建队列,如果为false在队列不存在或者已经存在都返回成功,不存在则创建,但出现其他错误就会返回失败。

3.交换器和绑定

一条消息发送到服务器上,服务器上的交换器会根据一定的规则也就是路由键(routing key)绑定到相应的队列,即使你的路由建是空的他也会去验证是否有一样的。

规则(路由算法)

headers已经被淘汰,根据AMQP消息头去匹配放到哪个队列并不是路由键去匹配。
direct 路由键匹配则放入该队列
fanout 广播 一条消息发送多个队列接收
topic 主题模糊绑定模式即支持操作符例如消息发送到 /a/*那么信息会发送到路由键为/a开头的所有队列中

4.虚拟主机和隔离

每一个Rabbit MQ服务器都可以创建vhost虚拟主机,实际上是个小型的rabbitMQ服务器拥有单独的队列交换器和绑定方式并且具有自己的权限机制。
当创建了一个用户则通常会指派给一个vhost,并且只能访问这一个vhost内的队列交换器,相互之间是完全隔离的。
这么做主要是为了根据业务让特定的人群访问特定的服务,使用vhost则不用再去增加rabbitMQ服务器。
在这里插入图片描述

5.消息持久化

要求

  • 每个队列或交换器的durable属性默认为false,设置为true这样rabbitMQ重启时就不会重新创建队列和交换器。
  • 把消息的投递模式改为2(持久)
  • 发送到持久化的交换器
  • 到达持久化的队列

过程

整个过程大致为:消息》》rabbit写入磁盘持久化文件》》持久性消息》》到达持久化队列并且消费该消息》》消费完成将此消息标记为垃圾等待垃圾回收。

注意:

因为有了写磁盘的操作以及持久化的判定,吞吐量可能降低十倍(不是开玩笑,SSD硬盘比机械硬盘会好很多)。

猜你喜欢

转载自blog.csdn.net/zhaohan___/article/details/107672764