码迷,mamicode.com
首页 > 其他好文 > 详细

rabbitmq学习之路(三)

时间:2019-08-02 16:51:58      阅读:89      评论:0      收藏:0      [点我收藏+]

标签:怎么   主题   lis   ann   publish   影响   sdn   简单   log   

今天继续学习rabbitmq 了解一下AMQP的一些基本概念

 

交换机:

  • Direct exchange(直连交换机)
  • Fanout exchange(扇型交换机)
  • Topic exchange(主题交换机)
  • Headers exchange(头交换机)

交换机有两个状态 持久和暂存,区别就是持久话的交换机在消息代理也就是broker重启后依旧存在

 

 

队列:

队列需要被声明之后才能使用,如果声明时,该队列不存在,就会新建,如果已经存在,且属性无变化,则没有关系,不影响,若属性有变化,则报错

队列和交换机一样有两个状态 持久和暂存 也是一样的意思,持久化的队列在消息代理重启的时候依旧存在,暂存的则不存在,但是需要注意的是,队列存在不代表消息也存在,消息持久化和队列持久化是两个概念

 

信道:

在我们的应用中,通常需要和AMQP代理建立多个连接,开启多个tcp连接明显不合适,浪费过多的系统资源,而且这种情况配置防火墙等就更加麻烦了,信道更加合适,可以把信道看成是共享一个tcp连接的轻量级的连接,每个线程或者进程单独开启一个信道,信道之间并不共享。

 

 

 

接下来是rabbitMq的工作流程的简单介绍

 

1、建立信息。Publisher定义需要发送消息的结构和内容。
2、建立Conection和Channel。由Publisher和Consumer创建连接,连接到Broker的物理节点上,同时建立Channel。Channel是建立在Connection之上的,一个Connection可以建立多个Channel。Publisher连接Virtual Host 建立Channel,Consumer连接到相应的Queue上建立Channel。
3、声明交换机和队列。声明一个消息交换机(Exchange)和队列(Queue),并设置相关属性。
4、发送消息。由Publisher发送消息到Broker中的Exchange中
5、路由转发。RabbitMQ收到消息后,根据??消息指定的Exchange(交换机) 来查找Binding(绑定) 然后根据规则(Routing Key)分发到不同的Queue。这里就是说使用Routing Key在消息交换机(Exchange)和消息队列(Queue)中建立好绑定关系,然后将消息发送到绑定的队列中去。
6、消息接收。Consumer监听相应的Queue,一旦Queue中有可以消费的消息,Queue就将消息发送给Consumer端。
7、消息确认。当Consumer完成某一条消息的处理之后,需要发送一条ACK消息给对应的Queue。

关于消息确认,需要具体来说

 

如果消息确认模式不开启的话,队列会在某消息被消费者消费之后(甚至是刚指定完消费者之后)就立即从内存删除该消息,如果是持久化的消息,就从磁盘删除该消息

如果消息确认模式开启的话,有以下几种情况

1. 消费者接收了消息,并且发送了ack确认消息,队列就会删除该消息,并发送下一条消息

2.消费者接收了消息,没有发送ack确认,并且断开了连接,那么队列将不会删除该消息,如果有其他的channel,就会发送给其他的channel,如果没有,就会等该消费者重新建立连接之后再发送一遍

3.消费者接收了消息,但是忘记发送ack确认,但是也没有断开连接,那么队列不会删除该消息,也不会重复发送该消息,至于该消息怎么处理,看了下面就明白了

其实当开启了消息确认模式之后,rabbitmq服务端内部的消息分成了两个部分,第一个部分是等待投递给消费者的消息,第二部分是已经投递的消息,但是还没有收到确认的,这部分的消息只有在消费此消息的消费者断开连接之后,才会重新进入队列,等待投递给消费者,不一定是原来的那个。

 

 


原文:https://blog.csdn.net/anumbrella/article/details/79920854

 

rabbitmq学习之路(三)

标签:怎么   主题   lis   ann   publish   影响   sdn   简单   log   

原文地址:https://www.cnblogs.com/changeCode/p/11289015.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!