RabbitMQ学习笔记

[TOC]

摘要:一种用Erlang语言开发的符合AMQP的高性能消息中间件。

1 概念和原理

1.1概念

RabbitMQ是使用Erlang语言开发的符合AMQP的高性能消息中间件。它遵循AMQP,即Advanced Message Queuing Protocol。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。 总体来说RabbitMQ是位于生产者和消费者之间的缓冲队列,其内部组成包括以下几种组件:

rabbitmq-struct.png

Broker:即队列服务主体,即RabbitMQ Server本身;
vhost:一个broker里可以划分多个vhost,用作不同用户的权限分离;
Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。
Queue:消息的载体,每个消息都会被投到一个或多个队列。
Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来.
Routing Key:路由关键字,exchange根据这个关键字进行消息投递。
vhost:虚拟主机,一个broker里可以有多个vhost,用作不同用户的权限分离。
Producer:消息生产者,就是投递消息的程序.
Consumer:消息消费者,就是接受消息的程序.
Channel:消息通道,在客户端的每个连接里,可建立多个channel.

1.1.1Exchange分类

RabbitMQ中的交换机主要包括如下几种类型:

  1. Direct Exchange(直连交换机)
    所有发送到DE的消息被转发到RouteKey中指定的Queue。如果消息的routigKey和binding的routigKey直接匹配的话,消息将会路由到该队列。
  2. Fanout Exchange(扇型交换机)
    扇形交换机,转发消息到所有绑定队列(速度最快),不管消息的routigKey息和binding的参数表头部信息和值是什么,消息将会路由到所有的队列。
  3. Topic Exchange(主题交换机)
    主题交换机,按规则转发消息(最灵活),如果消息的routigKey和binding的routigKey符合通配符匹配的话,消息将会路由到该队列。
  4. Headers Exchange(头交换机)
    首部交换机 ,如果消息的头部信息和binding的参数表中匹配的话,消息将会路由到该队列。headers类型的交换机分发消息不依赖routingKey,是使用发送消息时basicProperties对象中的headers来匹配的。headers是一个键值对类型,发送者发送消息时将这些键值对放basicProperties对象中的headers字段中,队列绑定交换机时绑定一些键值对,当两者匹配时,队列就可以收到息。匹配模式有两种,在队列绑定到交换机时用x-match来指定,all代表定义的多个键值对都要满足,而any则代码只要满足一个就可以了。
  5. 死信队列(Dead-Letter-Exchange)
    利用DLX, 当消息在一个队列中变成死信(dead message)之后, 它能被重新publish到另一个Exchange, 这个Exchange就是DLX。DLX也是一个正常的Exchange, 和一般的Exchange没有区别, 它能在任何队列上被指定, 实际上就是设置某个队列的属性为死信队列。当这个队列中有死信时, RabbitMQ就会自动将这个消息重新发布到设置的Exchange上去, 进而被路由到另一个队列。消息变成死信有以下几种情况 :
    • 消息被拒绝(basic.reject/basic.nack) 并且requeue重回队列设置成false
    • 消息TTL过期
    • 队列达到最大长度

1.2工作流程

  • 消息发送流程
  1. Producer与 Borker建立 Connection开启 channel;
  2. Producer声明 Exchange,Queue以及 binding key ;
  3. Producer生产 msg,包括:palyload(载体)、label(标签),然后发送消息;
  4. Boker根据 msg中 label中的 Exchange名称 和 Routing key进行消息路由;
  5. 关闭 channel和 Connection。
  • 消息接收流程
  1. Consumer与 Borker建立 Connection开启 channel;
  2. Consumer监听某个 Queue;
  3. Consumer主动拉取,或者被动接收推送的信息进行消费,并推送 Ack 确认消费到Borker;
  4. Boker收到 Ack 确认,将消息从 Queue中删除;
  5. 关闭 channel和 Connection。

2应用场景

2.1 跨系统间的通信

如:存在一个旧有的跑了很久的老代码。此时,搭建一个新的 Saas 平台,作为服务提供商,旧有的老系统需要作为其中一个服务纳入到新系统平台中,且业务需求上他们之间的用户是存在关联关系的。这两个系统除了业务上需要关联,其他都是分离,包括数据库等。这时候,两个平台的用户信息变更,如:创建,更新等,都需要进行信息同步。这时候消息中间件就派上了用场。在旧有的系统中加入 RabbitMQ 组件,在用户信息发生变更时,将变更信息可靠的投递到 RabbitMQ Borker(RabbitMQ 服务节点)中,由新的系统监听消息 Queue(队列),然后确保消息的消费,同步更新用户信息,以此达到跨系统间的通信。

2.2 保持消息的最终一致性

解决分布式事务的方案之一,Base 理论的提出,通过数据的最终一致性解决分布式事务问题,而事务的最终一致性可以通过 RabbitMQ 来完成。分布式系统间的事务处理,通过消息的发送和订阅来实现,当出现事务需要回滚的场景,同样通过消息的发送和订阅来实现业务的补偿,最终实现数据的最终一致性问题。

友链:谈谈分布式事务

2.3 基于 Pub/Sub 模型实现事件驱动

在例如:电商,金融交易等平台中,通常都存在 “订单”。如:电商中,用户下单之后并不一定会马上付款,但是此时商品资源被锁定,这时候就需要在规定时间内对未支付的订单进行取消的操作,同时释放商品资源。如:金融交易平台。平台中的金融产品需要提前预约,预约时会进行资源锁定,锁定产品份额等资源。在客户在规定时间内未进行交付,需要自动取消预约订单,同时释放额度。这时候可以通过 RabbitMQ 实现延迟队列的方式来处理。通过设定如:30分钟,未交付或者未付款的订单 进行取消订单,释放额度处理。

3 安装

4 使用

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