rabbitmq学习之路

Posted changecode

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rabbitmq学习之路相关的知识,希望对你有一定的参考价值。

今天继续学习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学习之路的主要内容,如果未能解决你的问题,请参考以下文章

SringCloud学习成长之路 八 消息总线

使用pybind11开发python扩展库

使用pybind11开发python扩展库

使用pybind11开发python扩展库

使用pybind11开发python扩展库(11)

使用pybind11开发python扩展库(10)