RabbitMQ详解2.基础知识

一年又一年,字节跳动 Lark(飞书) 研发团队又双叒叕开始招新生啦!
【内推码】:GTPUVBA
【内推链接】:https://job.toutiao.com/s/JRupWVj
【招生对象】:20年9月后~21年8月前 毕业的同学
【报名时间】:6.16-7.16(提前批简历投递只有一个月抓住机会哦!)
【画重点】:提前批和正式秋招不矛盾!面试成功,提前锁定Offer;若有失利,额外获得一次面试机会,正式秋招开启后还可再次投递。

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。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,744评论 6 502
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,505评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,105评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,242评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,269评论 6 389
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,215评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,096评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,939评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,354评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,573评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,745评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,448评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,048评论 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,683评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,838评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,776评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,652评论 2 354