今天继续学习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