文章目录
前言
我所参考阅读的书籍
1.生产者和消费者概念
AMQP
应用层标准高级消息队列协议
信道
当消费者和生产者两种程序连接上Rabbit,他们会和rabbit质检建立TCP连接,然后程序会在TCP的连接内创建一个虚拟连接即信道用于发送AMQP命令。
每个信道都有一个唯一ID,AMQP中有单独的库存贮ID。
使用信道的原因是因为TCP连接频繁新建中断资源消耗太大,如果使用信道则使用一个TCP连接即可。
图中AMQP连接可以理解为一个TCP连接,每个AMQP连接中有多个信道。
2.队列
队列两种订阅形式
basic.consume
使用AMQP该命令,会将信道设置为接收模式,直到取消对该队列的订阅,会一直取队列中的消息直到队列没有消息,还会监控队列有了消息就自动接收。
basic.get
该AMQP命令为订阅该队列获取一条消息然后立刻中断订阅。
队列无人订阅
队列无人订阅,消息会在队列中等待,直到有人订阅,可以设置多久的缓存,例如最多存7天的消息。
一个队列多个消费者
如果队列中有一条消息要发送给A、B两个人,那么这条消息会复制成两个一摸一样的消息分别发送给A和B。
消息确认
消息发送》消费者接收》返回确认接收》消息销毁
消费者接收消息,每一条都必须要进行确认.订阅队列的时候将auto_ack设置为true则接收了消息即确认。
如果消息发送给消费者,但消费者未回复确认则不会在发送新消息给该消费者。
拒绝消息
消费者有两种办法可以拒绝接收消息,1是直接取消订阅消息队列,2是RabbitMQ2.0以上版本的basic.reject命令。
basic.reject命令
该命令中有一个参数requeue,设置为true那么消息会发送给下一个订阅的消费者,false则只有当前消费者获取到消息接收完成该消息就销毁。
死信队列
basic.rejec的requeue设置为了false,那么被拒绝的消息就到了死信队列中,死信队列也是一个消息队列可订阅。
创建队列
消费者生产者都可以使用queue.declare命令创建队列。
注意:消费者如果订阅了队列,那么需要退订再把信道设置为传输,才可以创建队列。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2wlC4SlG-
如果声明一个已经存在的队列那么根据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硬盘比机械硬盘会好很多)。