本文参考以下链接摘录翻译:
https://www.rabbitmq.com/tutorials/amqp-concepts
AMQP (Advanced Message Queuing Protocol)
高级消息队列协议,一个消息协议,用于实现客户端应用与消息中间件的通讯。
消息代理及关联的角色
消息代理接收生产者/发布者发布的消息,将消息路由给消费者。(发布消息的应用被称为发布者或生产者,处理该消息的应用称为消费者)
因为AMQP是一个网络协议,生产者、消费者、消息代理可以部署在不同的机器上。
AMQP模型简介
消息被发布到交换机,交换机可类比为邮局或邮箱。
交换机使用绑定(bindings即路由规则)将消息副本分发到队列(queues)。
然后消息代理要么把消息派送给订阅了队列的消费者,或者消费者根据自己的需要从队列获取消息。
【队列只是消息暂存的地方,所有的活都是交换机在干!】
当发布一条消息时,发布者可能会定义各种消息属性(消息元数据)。部分元数据可能会被消息代理使用,尽管如此,剩下的数据对消息代理是完全透明的,这部分数据只会被接收消息的应用使用。
网络是不可靠的,而且应用可能会处理消息失败,因此AMQP 0-9-1提供了一钟消息确认机制(ack)。当一条消息发送给一个消费者时,消费者通知消息代理,要么自动发送或者程序员选择通知时机。当启用了ack机制,消息代理只有在收到ack通知后会完全删除一条消息(或一组消息)。
在有些情形,例如,当一条消息无法路由时,消息可能会被退回给发布者,或者丢弃掉,或者,如果消息代理实现了死信队列(deal letter queue),消息会被放入死信队列。发布者可以在发布消息时用一些参数来决定如何处理类似的情况。
队列(queues),交换机(exchanges),绑定(bindings)都是AMQP的实体(entities)。
AMQP是一个可编程的协议
当AMQP 0-9-1实体和路由机制由应用自己定义,而不是消息代理管理员配置时,AMQP 0-9-1是一个可编程的协议。相应地,协议提供了对:声明队列和交换机,定义绑定规则,订阅队列等操作的支持。【就是说客户端应用可以自己声明队列、交换机、绑定等,不用找消息代理管理员配置】
这给了应用程序员很多自由,但也要求他们注意潜在的定义冲突。从实践来看,冲突很少,通常是配置错误。
应用声明自己需要的AMQP 0-9-1实体,定义必要的路由机制,当实体不再使用时,可以选择删除不需要的AMQP 0-9-1实体。
交换机和交换机类型
交换机是生产者将消息发送到的地方。交换机取出一条消息并将它路由到0个或很多个队列。使用的路由算法由交换机类型和路由规则决定。AMQP 0-9-1 消息代理提供了4种交换机类型:
交换机类型 | 默认预声明名字 |
Direct exchange | 空字符串 或 amq.direct |
Fanout exchange | amq.fanout |
Topic exchange | amq.topic |
Headers exchange | amq.match (and amq.headers in RabbitMQ) |
除了交换机类型,交换机声明时可以设置一些属性,最重要的属性如下:
- Name 名字
- Durability 持久性,让交换机在消息代理重启后依然存在
- Auto-delete 自动删除,当最后一个队列与交换机解绑时,交换机被删除
- Arguments 参数,可选,供插件和消息代理使用
交换机可以是持久的或者临时的。持久的交换机在消息代理服务器重启后依然存在,临时交换机会丢失(当消息代理恢复时,临时交换机必须重新声明)。
不是所有的情景和用例都需要持久化的交换机。
待续。。。