AMQP协议和rabbitMQ

AMQP,即 高级消息队列协议(Advanced Message Queuing Protocol),是一个消息中间件应用层协议,用于组件之间的解耦,来提供 统一消息服务。主要功能是 排序消息,路由消息(包括点对点和订阅-发布),保证消息的可靠性和安全性。
遵循AMPQ协议的客户端,都能通过 消息中间件 相互通信。这样 客户端 就可以采用不同的开发语言实现,彼此无强依赖关系,降低客户端复杂性,提高开发效率也利于后期维护。

AMQP 的模型架构如下:

  1. 最左端和最右端,publisher(消息生产者)consumer(消息消费者) 都是客户端
  2. 左上方灰色方框为 message消息结构(交换器名exchange_name,路由键rountingKey)
  3. 中间红色方框为 message broker(消息中间件),如 rabbitMQ,kafka
  4. 客户端通过 tcp连接,建立 connection 来进行通信
下面介绍AMQP模型的概念:
1.'pubilsher':消息生产者,生产消息并投送到指定的交换器上。

2.'consumer':消息消费者,从对应的队列中取出消息消费。
  1)当 autoAck 为 true 时,消息发送出去后就认为消费成功,而不管消费者是
  否真正消费到这些消息。当channel因意外而关闭,或者消费者在消费过程之
  中意外宕机时,会丢失对应的消息。因此这种模式可以提高吞吐量,但存
  在数据丢失的风险。
  2)当 autoAck 为 false 时,consumer在数据处理完成后需要返回确认信息,
  只有broker收到确认消费信息后,才认为这条消息已经被成功处理。
  这可以保证数据的可靠性投递,但会降低系统的吞吐量。

3.'message':消息,由消息头和消息体组成。消息头存储与消息相关的元数据,
  如交换器名字(exchange_name),路由键(rountingKey)和可选配置(properties),
  消息体为实际需要传递的数据。

4.'message_broker':消息中间件,如rabbitMQ,kafka。

5.'virtual_host':虚拟主机,类似于linux的namespace,实现用户资源的隔离
  当 broker 有多个用户时,可以划分出多个 vhost,每个vhost类似于小型的broker,
  拥有独立的交换器,队列和绑定关系。用户根据不同的应用场景选择vhost。
  
6.'exchange':交换器,message到达 broker 的第一站。
  负责接收publisher的消息并根据绑定关系,将消息路由到到一个或多个queue中
  1)当mandatory为true时,如果根据分发规则找不到符合条件的queue,会将消息返回给publisher
  2)当mandatory为false时,如果根据绑定关系找不到符合条件的queue,会直接丢弃该message
  
7.'bindingKey':绑定键,exchange和queue通过bindingKey建立绑定关系。
  另外还有 'rountingKey'。当publisher将message发送给exchange时,一般会
  指定一个 rountingKey,用来指定这个message的路由规则。当rountingKey和
  bindingKey基于规则匹配时,消息被路由响应的queue中

8.'queue':消息队列。存储路由过来的message,一个queue可以被多个
   consumer订阅,此时queue会通过轮询(round-robin)方式分发message,即
   每条message只会发送给一个consumer,不会出现同一个message被多个
  consumer重复消费的情况。

9.'connection':用来传递消息的tcp连接

10.'channel':信道。是在connection内部采用 IO多路复用建立的逻辑连接,
  每个chanel拥有独立的channelID,保证channel之间的隔离性,类似于在同一个
  tcp连接中建立更小的tcp独立连接,每次断开连接,断开的是channel连接,
  最外层的tcp连接并不会断开,一直在被复用,极大减少了tcp连接的开销。


基于AMPQ协议实现的rabbitMQ

rabbitMQ是AMQP协议的一个开源实现。架构模型同样可以用以下的图来表示:

rabbitMQ具有以下特点:
1. 可靠性,使用一些机制,如持久化,发布确认,传输确认等保持可靠性
2. 灵活的路由,提供了多种6工作模式满足各种业务需求
3. 集群性,多个 rabbitMQ 服务器可以组成一个集群,形成一个逻辑 broker
4. 高可用,queue可以在集群上进行镜像,使得部分节点出问题仍能保持可用
5. 多种协议,支持多种消息队列协议,如stomp,mqtt等等
6. 多语言客户端,几乎支持所有常用语言,如java,ruby,golang等等
7. 管理界面,提供了一个易用的用户界面,方便监控和管理
8. 跟踪机制,如果消息异常,使用者可以找出发生了什么问题
9. 插件机制,提供了许多插件来扩展,也可以编写自己的插件

下面主要介绍rabbitMQ 6种工作方式:

1. simple模式,如下图示:

如上图,simple模式,单个publisher,单个queue,单个consumer


2. work模式,如下图示:

如上图,work模式
多个consumer共用一个queue的message
此种模式下,rabbitMQ会自动做负载均衡,将消息轮询发送给各个消费者,即一个消息只能被一个消费者获取


3. publish / subscribe 发布订阅模式(广播模式),如下图示:

如上图,publish / subscribe 发布订阅模式(广播模式)
相对前2种模式,多了一个exchange (type为fanout),message先发送到exchange,exchange再分别发送到对应的所有queue。而consumer订阅自己的queue,在自己订阅的queue上消费message。

示例应用场景,如下图示:

比如 网上购物,下单支付成功后,通知用户的方式有许多种,app推送,短信,email 等等。
message到来后被exchange发送到3个queue(app推送q,短信q,email_q)
之后 app推送服务,短信通知服务,email通知服务 从各自订阅的queue获取消息,通知用户支付成功


4. routing 路由模式,如下图示:

如上图示,exchange类型设定为direct
此时 message中的rountingKey 和 exchange中的bindingKey匹配,两者相等则发送对应的queue中,如果匹配不到bindingKey,则丢弃该message。

示例应用场景,如下图示:

比如服务产生的日志,日志有许多类型,error,info,debuf等类型的日志,而我们的需求只想要将 error 类型的日志写入磁盘,就可以用routing模式,将error日志路由到error queue,再由相应的 写入磁盘服务获取message,写入磁盘


5. topic 主题模式,如下图示:
'*' 和 '#' 代表通配符
'*' 代表匹配 1个单词(如 "a","abc")
'#' 代表匹配 0个或多个单词(如 "","a","abc","abc.def.ddd")
exchange 根据 key 模糊匹配到对应的queue
路由键为 lazy.orange.hello 的消息会发送给所有队列;
路由键为 quick.orange.fox 的消息只会发送给 Q1 队列;
路由键为 lazy.brown.fox 的消息只会发送给 Q2 队列;
路由键为 lazy.pink.rabbit 的消息只会发送给 Q2 队列;
路由键为 quick.brown.fox 的消息与任何绑定都不匹配;
路由键为 orange 或 quick.orange.hello.rabbit 的消息也与任何绑定都不匹配

如上图示,exchange类型为topic,相对于第4种模式,相同点是都根据 rountingKey 匹配,不同点是 topic 模式支持模糊匹配。

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