Spring全家桶来到JavaEE

RabbitMQ详解2.基础知识

2019-02-15  本文已影响4人  卢卡斯哔哔哔

1 AMQP与RabbitMQ

AMQP是什么

AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一个进程间传递异步消息的网络协议。AMQP消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。

AMQP历史

2004年,摩根大通和iMatrix开始着手AMQP开放标准的开发;2006年,AMQP规范发布。2007年,Rabbit技术公司基于AMQP标准开发的RabbitMQ 1.0 发布。

AMQP与RabbitMQ关系

AMQP是一种协议,而RabbitMQ是该协议的一个开源实现。

参考资料来源

官网地址
RabbitMQ对AMQP协议的支持
RabbitMQ基础知识
RabbitMQ与AMQP协议详解
AMQP 0-9-1 Model Explained

2 概念模型

概念模型

从概念模型中可以看出,在RabbitMQ中主要有以下几个角色。

  1. Broker:接收和分发消息的应用,RabbitMQ Server就是Message Broker。
  2. Virtual Host:出于多租户和安全因素设计的,把AMQP的基本组件划分到一个虚拟的分组中,当多个不同的用户使用同一个RabbitMQ Server提供的服务时,可以划分出多个Virtual Host,每个用户在自己的Virtual Host创建Exchange、Queue等。
  3. Connection:Publisher、Consumer和Broker之间的TCP连接。断开连接的操作只会在Client端进行,Broker不会断开连接,除非出现网络故障或broker服务出现问题。
  4. Channel:如果每一次访问RabbitMQ都建立一个Connection,在消息量大的时候建立TCP Connection的开销将是巨大的,效率也较低。Channel是在Connection内部建立的逻辑连接,如果应用程序支持多线程,通常每个Thread创建单独的Channel进行通讯,Channel之间是完全隔离的,Channel作为轻量级的Connection极大减少了操作系统建立TCP connection的开销。
  5. Exchange:message到达Broker的第一站,根据分发规则,匹配查询表中的routing key,分发消息到queue中去。
  6. Queue:消息最终被送到这里等待Consumer取走。一个message可以被同时拷贝到多个queue中。
  7. Binding:exchange和queue之间的虚拟连接,binding中可以包含routing key。Binding信息被保存到exchange中的查询表中,用于message的分发依据。
  8. Publisher和Consumer:Publisher和Consumer不属于AMQP中的元素,它们是连接Broker的应用程序,Publisher生产message,Consumer消费message。

3 Exchange 交换机

Exchange

Exchange(交换机)是接收生产者消息的一个实体,Exchange获取消息之后,将消息按照对应的规则路由给跟它绑定的Queue中,一共有以下四种类型的Exchange。

Fanout Exchange

Fanout Exchange将消息路由给绑定到它身上的所有队列,而不理会绑定的路由键。如果有多个队列都绑定到某个Fanout Exchange上,Fanout Exchange会将收到的消息的拷贝分别发送给所有连接的队列。

Fanout Exchange
Direct Exchange

Direct Exchange是根据消息携带的路由键(Routing Key)将消息投递给对应绑定键的队列。如果一个Queue按照某个路由键(如my_key)绑定到Direct Exchange上,当Direct Exchange接收到一个携带路由键my_key的消息时,Direct Exchange会将消息路由到该Queue;不携带my_key的消息则不会路由到该Queue。


Direct Exchange
Topic Exchange

前面提到的Direct规则是严格意义上的匹配,换言之Routing Key必须与Binding Key相匹配的时候才将消息传送给Queue,那么Topic这个规则就是模糊匹配,可以通过通配符满足一部分规则就可以传送。它的约定是:

  1. routing key为一个句点号.分隔的字符串,如“stock.usd.nyse”、“nyse.vmw”、“quick.orange.rabbit”
  2. binding key与routing key一样也是句点号.分隔的字符串
  3. binding key中可以存在两种特殊字符*#用于做模糊匹配,其中*用于匹配一个单词,#用于匹配多个单词(可以是零个)
    Topic Exchange
Headers Exchange

Headers类型的Exchange不依赖于routing key与binding key的匹配规则来路由消息,而是根据发送的消息内容中的headers属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到Exchange时,RabbitMQ会取到该消息的headers(也是一个键值对的形式),对比其中的键值对是否完全匹配Queue与Exchange绑定时指定的键值对;如果完全匹配则消息会路由到该Queue,否则不会路由到该Queue。

4 Queue 队列

Queue

Queue(队列)RabbitMQ的作用是存储消息,队列的特性是先进先出。上图可以清晰地看到Client A和Client B是生产者,生产者生产消息最终被送到RabbitMQ的内部对象Queue中去,而消费者则是从Queue队列中取出数据。实际生产环境中,我们不会直接向Queue中发送消息,而是把消息发送给Exchange,由Exchange按照规则来决定发送给哪个Queue。

5 Binding与Routing Key

Routing Key

生产者在将消息发送给Exchange的时候,可以通过携带一个Routing Key来指定这个消息的路由规则,Exchange将根据Routing Key来决定把这个消息路由给哪一个Queue。RabbitMQ中Routing Key设定的长度限制为255 bytes。

Binding 绑定

RabbitMQ中通过Binding将Exchange与Queue关联起来,这样RabbitMQ就知道如何正确地将消息路由到指定的Queue了。

Binding Key

在把Exchange与Queue的Binding(绑定)的时候,可以指定一个Binding Key;当生产者将携带对应Routing Key发送给Exchange的时候,Exchange会按照Binding Key与Routing Key的匹配关系,来决定把消息路由到哪一个Queue。

注意事项
  1. 在绑定多个Queue到同一个Exchange的时候,这些Binding允许使用相同的Binding Key。
  2. Binding Key并不是在所有情况下都生效,它依赖于Exchange Type。
上一篇下一篇

猜你喜欢

热点阅读