AMQP 0-9-1学习笔记
AMQP(Advanced Message Queuing Protocol)高级消息队列协议:是一个进程间传递异步消息的网络协议
2.
AMQP的基本模型: Publisher(发布者) → Exchange(交换机) → Queue(队列) → Consumer(消费者)


3.
工作原理:publisher public Message to Exchange. Exchange distribute the message to Queue by Route.Consumer consum the message(Return result or no return).
4.深入理解
4.1 发布者、交换机、队列、消费者都可以有多个。因为AMQP是一个网络协议协议,所以这个过程中的发布者,消费者,消息代理可以分别存在于不同的设备上。负载均衡处理
4.2 发布者发货消息时可以给消息指定各种消息属性(Message Meta-data)。有些属性有可能会被消息代理(Brokers)使用,然而其他的属性则是完全不透明的,他们只能被接受消息的应用所使用。
4.3 从安全角度考虑,网络是不可靠的,又或是消费者在处理消息的过程中意外挂掉,这样没有处理成功的消息就会丢失。基于此原因,AMQP模块包含了一个消息确认(Message Acknowledgements)机制:当一个消息从队列中投递给消费者后,不会立即从队列中删除,知道它收到来自消费者的确认回执(Acknowledgement)后,才完全从队列中删除。
4.5 我们可以把一些无法消费的消息和无法路由的消息,扔到死信队列里面去。当我们需要处理或者观察这些消息的时候,可以从消息队列里面把这些死信拿出来分析和处理。
5.Exchange(交换机)
AMQP 0-9-1提供了4种默认的交换机
1.Direct Exchange((Empty string) and amq.direct) Depend on Routing key。只有消息的Routing key和队列绑定到交换机的Routing key相等的时候,才会分发消息到消息队列里面。
2.Fanout exchange(amq.fanout) Delivery the message to all it's was binded Queues 。忽略Routing key,所有绑定到交换机的消息队列都会被分发到消息。
3.Topic exchange(amq.topic) depend on Routing key and pattern
' * '代表一个单词
' # '代表零个或多个单词。
单词和单词之间用'.'(点号)分隔开。
4.Headers exchange(amq.match(and amq.headers in RabbitMQ)) 。忽略Routing key。如果消息的标题头的值和绑定交换机的消息队列的标题头的值相等。就会分发到相等的消息队列里面。x-match属性,如果x-match属性设置为any,则其中的一个标题头的值匹配就可以了。如果x-match的属性设置为all,则全部的标题头的值都匹配才可以。
除了这些交换机类型外,交换机还有很多的属性,比较重要的如下:
1.Name(名称)名称
2.Durability(Exchange survive broker restart)重启MQ服务后,代理仍然会重新声明持久的交换机
3.Auto-delete(exchange is deleted when last queue is unbound from it) 当最后一个队列也解绑后,交换机是否还存在
4.Arguments(optional,used by plugins and broker-specific features) 可选,由插件和特定于代理的功能使用
6.Queue(消息队列)
所有的消息都存储在消息队列里面(包括:1.待消费的消息 2.正在消费的消息),一般的消息队列都只要声明了,就不会修改队列的属性,如果修改了,必须要删除旧的消息队列,然后重新生成新的。
6.1消息队列的特性:
6.1.1 Name 如果声明队列的时候不指定队列名称,代理会为队列声明一个唯一的队列名称。
6.1.2 Durable(the queue will survive a broker restart) 队列的持久性不会使路由到该队列的消息持久。如果代理被删除然后重新启动,则在代理重启期间将重新声明持久队列,但是,只会恢复持久性消息。
6.1.3 Exclusive(Used by only one connection and the queue will be deleted when that connection closes)最后一个连接到这个消息队列的连接都被关闭后,如果Exclusive=true,这个消息队列会被删除。
6.1.4 Auto-delete(queue that has had at least one consumer is deleted when last consumer unsubscribes)最后一个消费者取消订阅的时候,这个消息队列会被删除。
6.1.5 Arguments(optional;used by plugins and broker-specific features such as message TTL.queue length limit,etc)
7.消费消息(Consumers)
Comsume message are two way in AMQP 0-9-1 (1) Have messages delivered to them("push API") (2) Fetch messages as needed("pull API")
8.Message Acknowledgements
因为网络和程序的一个失败,所以一些程序需要有一个"消息确认"。"消息确认"机制可以帮助我们创建一个更加稳定,保障的软件系统
消息确认大体分为两种:(1) 消息接受确认 (2) 消息接受并且消费确认
9.Connections(连接)
AMPQ 0-9-1 使用TCP传输。连接使用身份验证,可以使用TLS进行保护。当应用程序不再需要连接服务器时,关闭它的AMQP 0-9-1连接,而不是关闭TCL连接。
10.Vitual Host(虚拟主机)
为了使单个代理可以托管多个隔离的“环境”(用户组,交换,队列等),AMQP包含虚拟主机(虚拟主机)的概念。它们类似于许多流行的Web服务器使用的虚拟主机,并提供AMQP实体所在的完全隔离的环境。AMQP客户端指定在AMQP连接协商期间要使用的vhost。
11.Message Attributes And Payload(消息特性和有效负载)
消息特性:①Content type(消息格式) ②Content encoding(消息编码) ③Routing key ④Delivery mode or persistent or not(消息是否持久) ⑤Message priority(消息优先级) ⑥Message publishing timestamp(消息发布时间戳) ⑦Expiration period(有效期) ⑧Publisher application id(发布消息发布者Id)