AMQP 基本概念
AMQP(Advanced Message Queuing Protocol 高级消息队列协议),一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。 Rabbitmq是AMQP协议的实现。
AMQP基本组成及基本概念
主要由三部分组成:publisher ——> broker ——> consumer
a.生产者(Publisher/Producer):生产者顾名思义就是生产消息的角色。生产者会将消息发送给交换机。为了使交换机正确的将消息路由给队列,发布消息时需指定消息的路由键(routing key)。
b.消息代理(Broker):代理的职能就是接收发布者发布的消息并将消息推送给订阅了消息的消费者。rabbitmq就相当于一个代理。
c.虚拟主机(Virtual Host):出于多租户和安全因素设计的,把AMQP的基本组(交换机,队列,绑定称为AMQP组件)件划分到一个虚拟的分组中,类似于网络中的namespace概念。当多个不同的用户使用同一个borker(RabbitMQ server)提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue等。
d.交换机(Exchange):交换机负责接收消息并按照一定的规则将消息路由给队列。路由的规则存储在交换机与队列绑定时指定的routing key。
e.绑定(Binding):交换机和队列之间通过路由键(routing key)相互绑定起来,并根据路由键将消息路由到对应队列。
f.队列(Queue):消息的载体,exchange中的消息将被路由到队列中,并推送给消费者或者被消费者取走。
g.连接(Connection):消费者和生产者与消息代理之间的连接
h.通道(Channel):如果消费者每一次从代理中取消息都建立一次连接的话,在消息量大的情况下建立多个连接将会有巨大的开销。Channel是在Connection内部建立的逻辑连接。如果应用程序支持多线程,可以为每个线程建立单独的通道进行通讯。AMQP method包含了channel id帮助客户端和message broker识别channel,所以channel之间是完全隔离的。Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销。
i.消费者(Consumer):接收消息的角色就是消费者
交换机(Exchange)
为什么需要Exchange 而不是直接发送消息到队列?
AMQP协议核心思想就是生产者和消费者的解耦,生产者从不直接将消息发送给队列。生产者通常不知道是否一个消息会被发送到队列中,只是将消息发送到一个交换机。先由 Exchange 来接收,然后 Exchange 按照特定的策略转发到 Queue 进行存储。
Exchange 的四种种主要类型:Fanout、Direct 和 Topic、headers。
1.Direct Exchange
要求该消息与一个特定的路由键完全匹配 Direct Exchange 是 RabbitMQ 默认的 Exchange,完全根据 RoutingKey 来路由消息。设置 Exchange 和 Queue 的 Binding 时需指定 RoutingKey(一般为 Queue Name),发消息时也指定一样的 RoutingKey,消息就会被路由到对应的Queue。
2.Topic Exchange
Topic Exchange 支持模糊匹配,支持 * 和 # 通配符 Topic Exchange 和 Direct Exchange 类似,也需要通过 RoutingKey 来路由消息,区别在于Direct Exchange 对 RoutingKey 是精确匹配,而 Topic Exchange 支持模糊匹配。分别支持 * 和 # 通配符,* 表示匹配一个单词, # 则表示匹配没有或者多个单词。
3.Fanout Exchange (发布/订阅模式)
不处理路由键。将队列绑定到交换机,消息会转发给所有与该交换机绑定的队列上。 Fanout交换机转发消息是最快的。