AMQP 0-9-1模型的简单介绍
1.声明
当前内容用于本人学习和理解AMQP这个基本概念,主要来源于:RabbitMQ官方介绍
2.AMQP 0-9-1的介绍
AMQP 0-9-1(高级消息队列协议)是一种消息传递协议,使一致的客户端应用程序可以与一致的消息传递中间件代理进行通信。
分析发现这个就是一个消息中间件的消息传递协议,帮助我们统一中间件之间通信
3.AMQP的世界观
AMQP 0-9-1模型具有以下的世界观:消息发布到交易所
,通常与邮局或邮箱进行比较。然后,交易所使用称为绑定的规则将 消息副本分发到队列中
。然后,代理要么将消息传递给订阅了队列的使用者,要么使用者按需从队列中获取/拉取消息
。
从这个地方分析RabbitMQ的主要实现
- 消息发布者(publisher)将消息发送到交易所(exchange)
- 交易所(exchange)使用绑定规则(bind)将消息副本(后面提到的扇区交换)分发到队列(queue)中
- 代理要么将消息传递给订阅了队列的使用者(consumer),要么使用者按需从队列(queue)中获取/拉取消息
从这里发现就和这个官方的图非常相似
只是这个图中没有bind绑定规则
4.AMQP 0-9-1协议的特点
以下来自官方
-
发布消息时,
发布者可以指定各种 消息属性(消息元数据)
。这些元数据中的某些可能由代理使用,但是其余部分对代理完全不透明,并且仅由接收消息的应用程序使用
。 -
网络不可靠,应用程序可能无法处理消息
,因此AMQP 0-9-1模型具有消息确认的概念 :将消息传递给消费者时,消费者会自动或在应用程序开发人员选择后立即通知代理
。这样做。使用消息确认时,代理只有在收到该消息(或消息组)的通知时,才会从队列中完全删除该消息
。 -
在某些情况下,例如,
当无法路由消息时
,消息可能会返回给发布者,被丢弃,或者(如果代理实施了扩展)会将消息放入所谓的“死信队列”中
。发布者
通过使用某些参数发布消息来选择如何处理这种情况
。 -
队列,交换和绑定统称为AMQP实体。
通过以上的发现了,消息发布者可以发送各种消息属性元数据
AMQP有一套自动处理和知道消息是否被消费的机制,主要依赖消费者给应用发送以消费信号,AMQP可以自动实现消息删除功能
AMQP对于一些无法被消费无法被路由的消息,直接放入死信队列中(死信就是无法处理的消息),AMQP中的死信队列中的数据是可以被发布者处理的
从上面我们获得如何保证消息的可达性,以及死信队列的知识和死信队列的处理方式
5.可编程性
-
从AMQP 0-9-1实体和路由方案主要由应用程序本身而不是代理管理员定义的意义上来说,AMQP 0-9-1是一种可编程协议。因此,为声明队列和交换,定义它们之间的绑定,订阅队列等等的协议操作作了准备。
-
这为应用程序开发人员提供了很大的自由度,但同时也要求他们意识到潜在的定义冲突。实际上,定义冲突很少发生,并且经常表示配置错误。
-
应用程序声明所需的AMQP 0-9-1实体,定义必要的路由方案,并且在不再使用AMQP 0-9-1实体时可以选择删除它们
分析上面可以知道,一般我们直接声明queue和exchange,然后定义queue和exchange之间的bind就可以实现自己的方式
该协议中开发自由大,并且如果不使用可以删除
6.总结
1.AMQP是RabbitMQ中使用的一个协议,该协议具有通用性,是中间件之间基本通用的协议
2.AMQP协议具有高可用性,可以保证消息的可达性,以及保证消息的消费,可以处理死信
3.AMQP协议具有可替换性,只需修改exchange和queue和之间的规则bind就可实现自定义
以上纯属个人见解,如有问题请联系本人!