RabbitMQ的基本概念和模型_第1页
RabbitMQ的基本概念和模型_第2页
RabbitMQ的基本概念和模型_第3页
RabbitMQ的基本概念和模型_第4页
RabbitMQ的基本概念和模型_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

RabbitMQ 是一种消息队列 用于程序间的通信 形象地说 MQ 就像一个邮局 发送者将消息写入 MQ MQ 负责把消息发送给接收者 RabbitMQ 可支持 Java PHP Python Go JavaScript Ruby 等多种语言 几个基本概念 图 1 rabbit model RabbitMQ 的基本模型如图 1 所示 先介绍一些术语 生产者生产者 producer 在图中为 P 表示消息的发送者 交换机交换机 exchanges 在图中为 X 生产者发过来的消息需要经过交换机 交换机将决定将消息放到哪些 队列当中 队列 队列 queue 队列在图 1 中由红色矩形阵列表示 负责保存消息和发放消息 消费者 消费者 consumer 在图中为 C 代表等待接收消息的程序 信息流 消息是怎么从生产者传递到消费者的呢 首先 生产者发送消息到交换机 同时发送一个 key 通过这个 key 交换机就知 道该把消息发到哪个队列 随后交换机把消息发送到相应的队列中 由队列将消息 发送给消费者 消费者监听某些队列 当有消息过来时 就立即处理消息 那么 接下来就有两个问题 交换机是如何根据 key 来分配消息到队列 队列怎样将消息发送给消费者 交换机类型 这个部分将回答第一个问题 交换机如何根据 key 来分配消息到队列 RabbitMQ 的交换机有四种类型 direct topic headers fanout fanout fanout 交换机就跟广播一样 对消息不作选择地发给所有绑定的队列 以图 1 为 例 两个队列都将收到消息 direct 图 2 direct 在 direct 模式里 交换机和队列之间绑定了一个 key 只有消息的 key 与绑定了的 key 相同时 交换机才会把消息发给该队列 如图 2 所示 消息的 key 为 orange 时 消息将进入队列 Q1 key 为 black 或者 green 时 消息将进入队列 Q2 若消 息的 key 是其他字符串 被交换机直接遗弃 图 3 多重绑定 同时 交换机支持多重绑定 多个队列可以以相同的 key 与交换机绑定 如图 3 所 示 当消息的 key 为 black 时 消息将进入 Q1 和 Q2 topic topic 模式可以理解为主题模式 当 key 包涵某个主题时 即可进入该主题的队列 topic 模式的 key 必须具有固定的格式 以 作为间隔的一串单词 比如 quick orange rabbit key 最多不能超过 255byte 交换机和队列的 key 可以以类似正则表达式的方式存在 有两种语法 1 可以替代一个单词 2 可以替代 0 个或多个单词 图 4 topic 图中 Q1 与交换机绑定的 kye 为 orange 故当消息的 key 为三个单词 且 中间的单词为 orange 时 消息将进入 Q1 Q2 与 exchange 绑定的 key 为 rabbit 当消息的 key 以 rabbit 开头时 消息将进入 Q2 其实 图中的 key 描述的是动物的属性 第一个单词表示反应速度 第二个单词表 示颜色 第三个单词表示名称 绑定的 key 定义了它们的筛选规则 所有橘色的动 物都将进入 Q1 所有懒洋洋的动物都将进入 Q2 老鼠也将进入 Q2 下面给出更具体的例子帮助理解 key 进入的队列 lazy orange elephant Q1 和 Q2 quick orange fox Q1 quick orange fox Q2 quick brown fox 被直接无视 headers 官网没介绍这个模式 队列分发消息的方式 这一部分将回答第二个问题 队列怎样将消息发送给消费者 图 5 Round robin dispatching 循环发放 循环发放 Round robin dispatching 队列分发消息给消费者的方式采用循环发放 举例来说 若队列里有四个消息 w x y z 则 C1 将得到消息 z 和 x C2 将得到消息 y 和 w 即每个消费者按顺序每 人发一个消息 注意 在这种分配方式下 消息其实在刚进入队列的时候就已经内定好将要被分发 的消费者 即 z x 一定是给 C1 y w 一定是给 C2 这种方式存在一些隐患 如果 z 和 x 都是耗时的命令 y z 都是简单的命令 C1 将 不停地工作 而 C2 就比较空闲 造成资源浪费 公平发放解决了上述问题 公平发放 公平发放 fair dispatching 这种方式下 队列只会把消息给空闲的消费者 如果它看到某个消费者正忙 就查 找下一个空闲消费者 java 中 公平发放的实现 使用 basicQos 方法将 prefetchCount 设为 1 int prefetchCount 1 channel basicQos prefetchCount 消息的确认 消息的确认 Message acknowledgment 若没有特别设定 消息一旦被队列分发给消费者 就被 rabbitmq 从内存中删除 在这种情况下 如果将一个正在处理消息的消费者强行关闭 那么 消息将未被完 全处理 且 RabbitMQ 完全不知情 为了解决上述问题 可以配置使得消息处理完后 向 RabbitMQ 返回一个 acknowledgment RabbitMQ 直到收到 acknowledgment 后 才将消息删除 当消费者死亡时 its channel is closed connection is closed or TCP connection is los

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论