RabbitMQ系列(4)-理解消息通信-交换器和绑定

消息是如何到达队列的呢?让我们来认识一下AMQP的交换器和绑定

欢迎访问本人博客:http://wangnan.tech

交换器和绑定

当你想要将消息投递到队列时,你通过把消息发送给交换器来完成。然后,根据确定的规则,RabbitMQ将会决定消息该投递到哪个队列,这些规则被称为路由键(routing key)队列通过路由键绑定到交换器,当你把消息发送到代理服务器时,消息将拥有一个路由键(即使是空的)
Rabbit也会将其和绑定使用的路由键进行匹配,如果匹配的话,那么消息将会投递到队列,如果路由的消息不匹配任何绑定模式的话,消息将进入“黑洞”

为什么大费周章使用这种交换器和绑定?

  • 这样可以满足更多复制的使用场景,利于发布\订阅或者多播
  • 对于发送消息给服务器的发布者来说,它不需要关心服务器的另一端(即队列和消费者)

交换器类型

  • direct
  • fanout
  • topic
  • headers

每一种类型实现了不同的路由算法

direct

非常简单,如果路由键匹配的话,消息就会被投递到对应的队列

服务器必须实现direct类型交换器,包含一个空白字符串名称的默认交换器,当声明一个队列时,他会自动绑定到默认交换器,并以队列名称作为路由键。
你可以使用如下代码发送消息到之前声明的队列去,前提是你已经获得了信道实例:

$channel->basic_publish($msg,'','queue-name');

第一个参数是你想要发送的消息内容,第二个参数是一个空字符串,指定了默认交换器,第三个参数是路由键

当默认的direct交换器无法满足你的需求是,你可以声明你自己的交换器,只需要发送exchange.declare命令并设置合适的菜蔬就行了

fanout

这种类型的交换器会将收到的消息广播到绑定的队列上

当你发送一条消息到fanout交换器时,他会把消息投递给所有附加在此交换器的队列,这允许你对单条消息做不同的反应

举个例子:
一个web应用可能需要在用户上传新的图片时做几件事情:

  • 用户相册清除缓存
  • 用户得到积分奖励

你可以将两个队列绑定到图中的交换器上,一个用于清楚缓存,一个用于积分奖励

使用fanout交换器,你唯一需要做的就是为新的消费者写一段代码,然后声明新的队列并将其绑定到fanout交换器上,而不用修改发送方的代码

topic

这类交换器允许你实现有趣的消息通信场景,它使得来自不同源头的消息能够到达同一个队列

让我们以web应用程序日志系统作为示例
你拥有不同的日志级别 例如:error info 和warning
你的程序拥有以下几个模块:user-profile,image-gallery,msg-inbox等

如果在发送消息的动作失败时,你想要报告一个error的话,则可以编写以下代码

$channel-> basic_publish($msg,'logs-exchange','error.msg-inbox');

然后你声明了一个msg-inbox-errors队列,你可以将其绑定到交换器来接收消息

$channel->queue_bind('msg-inbox-errors','logs-exchange','error.msg-inbox');

目前为止,看起来和使用direct交换器很像
但是如果你想要一个队列监听msg-inbox模块的所有级别的话,你该怎么做?
你可以通过将新的队列绑定到已有的同一个交换器来实现就像下面这样:

$channel->queue_bind('msg-inbox-logs','logs-exchange','*.msg-inbox');

msg-index-logs队列将会接收从msg-inbox模块发来的所有error,warning和info日志

通配符

  • 单个“.”把路由键分为几部分
  • “*”匹配特定位置的任意文本
  • “*”操作符将“.”视为分隔符,“#”操作符没有分块的概念,它将任意"."字符均视为关键词的匹配部分

为了实现匹配所有规则,你可以使用“#”

$channel->queue_bind('all-log','log-exchage',‘#’)

headers

允许你匹配AMQP消息的header而非路由键,除此之外,和direct交换器完全一致,但是性能差很多,因此它并不实用,而且几乎用不到

我们已经理解了这几种交换器类型,并能体会AMQP的强大之处了,你可以对服务器的行为编程以满足自己的需求,它既能够以发布\订阅模式的设置方式作为队列服务器使用,也可以作为RPC服务器使用

总结

  • AMQP架构中最关键的几个组件分别是 交换器 队列和绑定
  • 根据绑定规则将队列绑定到交换器上
  • 消息是发布到交换器上的
  • 有四种类型的交换器 - direct fanout topic headers
  • 基于消息的路由键和交换器类型,服务器会决定将消息投递到哪个队列去

(注:内容整理自《Rabbit实战》)

欢迎访问本人博客:http://wangnan.tech

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

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 来源 RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。支持消息的持久化、事务、拥塞控...
    jiangmo阅读 10,335评论 2 34
  • 1 RabbitMQ安装部署 这里是ErLang环境的下载地址http://www.erlang.org/down...
    Bobby0322阅读 2,211评论 0 11
  • AMQP大致内容就是,将消息和队列绑定起来,规定让进入到交换机中的具有某个路由键的消息进入到指定队列中去。 Rab...
    StevenMD阅读 1,829评论 0 3
  • 关于消息队列,从前年开始断断续续看了些资料,想写很久了,但一直没腾出空,近来分别碰到几个朋友聊这块的技术选型,是时...
    预流阅读 584,174评论 51 785