美文网首页Java 杂谈
消息队列协议(一)---AMQP

消息队列协议(一)---AMQP

作者: Coding小聪 | 来源:发表于2019-05-18 23:43 被阅读0次

    1. 概述

    AMQP全称为Advanced Message Queuing Protocol,即高级的消息队列协议,它主要应用于消息中间件。在市面上主流的MQ产品(ActiveMQ、RocketMQ、Kafka、RabbitMQ)当中,对AMQP协议支持较好的产品是RabbitMQ。

    AMQP协议有以下版本

    • AMQP1.0
    • AMQP version 0-10
    • AMQP version 0-9-1
    • AMQP version 0-9
    • AMQP version 0-8

    这篇文章我们基于0-9-1版本进行分析,之所以选择这个版本是因为RabbitMQ支持的AMQP版本就是0-9-1。

    2. 组件

    • Publisher(消息生产者):向Exchange发布消息的客户端应用程序;
    • Consumer(消息消费者):从消息队列中获取消息的客户端应用程序;
    • Message Queue(消息队列):用来存储消息者待消费的消息,一个消息可以投递给一个或者多个消息队列;
    • Exchange(交换器):用来接收生产者发送的消息并将这些消息路由到相应的消息队列中,AMQP提供了四种不同的交换器类型:direct、fanout、topic、header;
    • Routing Key(路由规则):虚拟机使用路由规则来确定如何路由一个特定的消息;
    • Binding(绑定):用于交换器和消息队列之间的关联。绑定之后,交换器能将消息按照特定的规则路由至相应的队列中去。随后,消费者才能从队列中消费消息。
      如果生产者生产的某条消息,没有与之匹配的任何一个队列可供路由(比如,没有任何队列与交换器绑定)。那么,根据该条消息的属性,该消息要么丢弃,要么返回至生产者。
    • Broker(消息代理):消息代理接收来自生产者的消息,并将它们路由到相应的消费者手中;
    • Connection(连接):客户端和消息服务器之间的网络连接;
    • Channel(通道):数据传输通道,双向传输。通道主要是用来复用网络连接,所以一个连接会对应着多个通道;
    • Message(消息):消息中间件所处理数据的最小单元,消息包括一个内容头、一组属性和一个内容体。

    3. 分层描述

    3.1 服务端分层

    AMQP协议是分层描述的,在0-9-1版本中(不同版本中的分层有所不同),分了两层:Functional Layer和Transport Layer,即功能层和传输层。

    AMQP服务端分层

    功能层定义了一系列命令,客户端应用可以使用它们来实现自己的业务逻辑。这些命令按功能逻辑组合形成不同的Class类,即使用API类来表示命令。

    传输层将功能层所接收的消息传递给服务器经过相应处理后再返回,处理的事情包括信道复用、内容编码、心跳检测、错处处理等。

    3.2 客户端分层

    AMQP客户端分层

    API层:该层会暴露特定的API给应用程序调用;
    Connection管理层:连接管理;
    异步I/O层:主要用于网络IO通讯。

    4. 交换器Exchange

    交换器用来接收生产者投递过来的消息,然后在将消息转发到消息队列当中。根据交换器的类型不同,交换器转发的规则也有所不同。目前,AMQP提供了4种类型的交换器:direct,fanout,topic,header.

    (1)direct类型

    该类型的交换器在分发消息到指定队列时要求:生产者生产某条消息时指定的路由关键字X与队列绑定到交换器上时指定的路由关键字Y完全一致,即X = Y。

    而且,多个队列可以使用相同的路由关键字与交换器绑定。比如,生产者不断的生成路由关键字为X的消息,你可以指定多个队列都使用路由关键字Y与该交换器绑定(X=Y)。这样一来,消息就会被分发至多个队列中。但是,需要注意的是,消息负载均衡并不在于队列间,而是在于消费者间。

    direct

    (2)fanout类型

    该类型的交换器会将消息转发给所有与之绑定的队列上。比如,有N个队列与fanout交换器绑定,当产生一条消息时,交换器会将该消息的N个副本分别发给每个队列。类似于广播机制。


    fanout

    Fanout Exchange 会忽略 RoutingKey 的设置,直接将 Message 广播到所有绑定的 Queue 中。

    (3)topic类型

    该类型的交换器会视消息路由关键字和绑定路由关键字之间的匹配情况,进行消息的路由转发。比如,消息路由关键字为x.y.z的消息会转发给绑定路由关键字为.y.的队列,也会转发给绑定路由关键字为x.#的队列,但却不会转发给绑定路由关键字为.a.的队列。

    topic

    Topic Exchange 和 Direct Exchange 类似,也需要通过 RoutingKey 来路由消息,区别在于Direct Exchange 对 RoutingKey 是精确匹配,而 Topic Exchange 支持模糊匹配。分别支持和#通配符,表示匹配一个单词,#则表示匹配没有或者多个单词。

    (4)headers类型

    该类型的交换器与前面介绍的稍有不同,它不再是基于路由关键字(routing key)进行路由,而是基于多个属性进行路由的,这些属性比路由关键字更容易表示为消息的头。也就是说,用于路由的属性是取自于消息header属性的,当消息header的值与队列绑定时指定的值相同时,消息就会路由至相应的队列中。

    参考

    1. http://www.amqp.org/specification/0-9-1/amqp-org-download
    2. RabbitMQ Tutorials

    相关文章

      网友评论

        本文标题:消息队列协议(一)---AMQP

        本文链接:https://www.haomeiwen.com/subject/pjgcoqtx.html