一、序言

RabbitMQ目前在开发中被广泛应用,这篇文章用尽可能浅显的语言来解释RabbitMQ的入门知识,希望能够帮助更多的人花费更好的时间入门。

如果你想更深入的了解RabbitMQ,可以继续关注本头条号后续发布的文章或者自己从网上搜寻了资料,自己探索研究。

二、RabbitMQ是什么

是传输服务,消费者(consumer)订阅某个队列。生产者(producer)创建消息,然后发布到队列(queue)中,最后将消息发送到监听的消费者。

三、RabbitMQ具有的特点

1.可靠性(Reliability)

RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。

2.灵活的路由(Flexible Routing)

在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ 已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个 Exchange 绑定在一起,也通过插件机制实现自己的 Exchange 。

3.消息集群(Clustering)

多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker 。

4.高可用(Highly Available Queues)

队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。

5.多种协议(Multi-protocol)

RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等。

6.多语言客户端(Many Clients)

RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby 等等。

7.管理界面(Management UI)

RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面。

8.跟踪机制(Tracing)

如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么。

9.插件机制(Plugin System)

RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。

四、RabbitMQ 基本概念

1.Message

消息,消息是不具名的,它由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。

2.Publisher

消息的生产者,也是一个向交换器发布消息的客户端应用程序。

3.Exchange

交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。

4.Binding

绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。

5.Queue

消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。

6.Connection

网络连接,比如一个TCP连接。

7.Channel

信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内地虚拟连接,AMQP 命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接。

8.Consumer

消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。

9.Virtual Host

虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。

10.Broker

表示消息队列服务器实体。

五、AMQP 中的消息路由方式

1.direct

Exchange分发消息时根据类型的不同分发策略有区别,目前共四种类型:direct、fanout、topic、headers 。headers 匹配 AMQP 消息的 header 而不是路由键,此外 headers 交换器和 direct 交换器完全一致,但性能差很多,目前几乎用不到了,所以直接看另外三种类型:

消息中的路由键(routing key)如果和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中。它是完全匹配、单播的模式。

2.fanout

每个发到 fanout 类型交换器的消息都会分到所有绑定的队列上去。fanout交换器不处理路由键,只是简单的将队列绑定到交换器上,每个发送到交换器的消息都会被转发到与该交换器绑定的所有队列上。

3.topic

通过模式匹配分配消息的路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上。它将路由键和绑定键的字符串切分成单词,这些单词之间用点隔开。它同样也会识别两个通配符:符号“#”和符号“”。#匹配0个或多个单词,匹配不多不少一个单词。

六、RabbitMQ 集群

RabbitMQ 最优秀的功能之一就是内建集群,这个功能设计的目的是允许消费者和生产者在节点崩溃的情况下继续运行,以及通过添加更多的节点来线性扩展消息通信吞吐量。

RabbitMQ 会始终记录以下四种类型的内部元数据:

1.队列元数据

包括队列名称和它们的属性,比如是否可持久化,是否自动删除

2.交换器元数据

交换器名称、类型、属性

3.绑定元数据

内部是一张表格记录如何将消息路由到队列

4.vhost 元数据

为 vhost 内部的队列、交换器、绑定提供命名空间和安全属性

在集群模式下提供两种选择:存到硬盘上(独立节点的默认设置),存在内存中。内存节点可以提供出色的性能,磁盘节点能保障配置信息在节点重启后仍然可用,那集群中如何平衡这两者呢?

RabbitMQ只要求集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入火离开集群时,它们必须要将该变更通知到至少一个磁盘节点。集群中的唯一磁盘节点崩溃的话,集群仍然可以运行,但直到该节点恢复,否则无法更改任何东西。

RabbitMQ 集群中可以共享 user、vhost、exchange等,所有的数据和状态都是必须在所有节点上复制的,除了消息队列。RabbitMQ 节点可以动态的加入到集群中。当在集群中声明队列、交换器、绑定的时候,这些操作会直到所有集群节点都成功提交元数据变更后才返回。

如果在集群中创建队列,集群只会在单个节点而不是所有节点上创建完整的队列信息。如果在集群中创建队列,集群只会在单个节点而不是所有节点上创建完整的队列信息。但是队列的内容不会消失,在集群的其他节点都有队列镜像。

mfc 消息消息队列概念_必看入门秘籍——解密原理:消息中间件之RabbitMQ相关推荐

  1. zbrush次世代零基础新手必看入门教程第一部分:建模

    zbrush零基础新手必看入门教程.在第一部分中,将向您展示了如何建模...... 欢迎阅读zbrush零基础新手必看入门教程的第一部分.这部分将带您直接开始,并向您展示如何从头开始创建一个吸引人的角 ...

  2. zbrush零基础新手必看入门教程第三部分:构成

    zbrush零基础新手必看入门教程,在第三部分,如何构建模型并修复任何变形...... 第01步:打破对称性 在你开始构图之前,了解你想要角色的位置是很重要的,特别是如果你在讲故事.姿势将赋予你的角色 ...

  3. mfc 消息消息队列概念_消息队列面试连环问

    最近我一直扎在消息队列实现细节之中无法自拔,已经写了 3 篇Kafka源码分析,还剩很多没肝完.之前还存着RocketMQ源码分析还没整理.今儿暂时先跳出来盘一盘大方向上的消息队列有哪些核心注意点. ...

  4. java重要基础知识点_必看 | 新人必看的Java基础知识点大梳理

    原标题:必看 | 新人必看的Java基础知识点大梳理 各位正在认真苦学Java的准大神,在这烈日炎炎的夏季里,老九君准备给大家带来一个超级大的"冰镇西瓜,"给大家清凉一下,压压惊. ...

  5. 大数据专业考研书_必看|大数据告诉你考研趋势

    原标题:必看|大数据告诉你考研趋势 根据各省级管理部门官网数据,2018年7月30日"中国研究生招生信息网"发布了<2015-2018年全国硕士研究生报考数据分析报告> ...

  6. 字长为16位的计算机_必看!计算机考试基础知识总结1

    必看!计算机考试基础知识总结1 1. 1946年,美国宾夕法尼亚大学研制成功了电子数字积分式计算机ENIAC 2. 美籍匈牙利数学家冯•诺依曼总结并归纳了ENIAC以下3点. •采用二进制:在计算机内 ...

  7. laravel mysql sum查询并排行_必看!PHP常见面试题——MySQL篇(二)

    接上期:<必看!PHP常见面试题--MySQL篇(一)> 11.MySQL的默认事务隔离级别是? 读未提交(RU): 一个事务还没提交时, 它做的变更就能被别的事务看到. 读提交(RC): ...

  8. python运用在哪些地方_必看 | 2020年,Python十大应用领域介绍!

    原标题:必看 | 2020年,Python十大应用领域介绍! python作为一门当下极其火爆的编程语言,得到世界范围内无数编程爱好者和开发者喜欢并不是偶然的,除了要比其他编程语言更容易入门,pyth ...

  9. 求两个不超过200位的非负整数积_必看:初一上册数学考试概念、定义全部公式总结!(两个版本)...

    语文资料 数学资料 英语资料 政史地资料 物化生资料 高中资料 人教版 第一章有理数概念.定义: 1.大于0的数叫做正数(positive number). 2.在正数前面加上负号"-&qu ...

最新文章

  1. PHP退出浏览器程序执行定时任务,PHP执行定时任务
  2. mysql 添加索引
  3. 038_Steps步骤条
  4. git clone github_Git下载速度慢的解决方案汇总
  5. Android底层网络防火墙,详解Android 利用Iptables实现网络黑白名单(防火墙)
  6. ReviewForJob——快速排序(基于插入排序)+快速选择(快速排序变体)
  7. Hibernate 第一个体验程序
  8. kubernetes创建yaml,pod服务一直处于 ContainerCreating状态的原因查找与解决
  9. httping的使用介绍
  10. matlab高通滤波函数,巴特沃斯高通滤波器—matlab实现
  11. 3D动漫游戏建模很难学?教你如何使用3DMax和ZBrush制作卡通角色
  12. Linux上搭建http服务器
  13. [生命科学] snapgene 构建载体方法分享
  14. 惠普暗影精灵4pro安装ubuntu16.04
  15. 网页内引用外部字体方法
  16. Java给PNG透明图片加水印,亲测可用
  17. matlab语言帮助系统题目,西电 matlab语言考试题2009年
  18. Modulation of Lipid Metabolism by Celastrol (文献分享一组-赵倩倩)
  19. 微信小程序反编译及源码抓取(2021最新)
  20. [置顶]       VMWare不能安装64位操作系统原因探析

热门文章

  1. 测度论与概率论有什么关系?为什么要学习测度论?
  2. 设计模式-结构型-适配器
  3. Android Screen Monitor抓取模拟器与真机界面
  4. 对F-score的理解
  5. MySQL 8.0 技术详解
  6. Atom编写Markdown
  7. WPF PRISM开发入门一( 初始化PRISM WPF程序)
  8. XtraReport交叉表自适应行高及最佳列宽(转)
  9. 构造方法和方法的重载。
  10. 网页上加在线客服代码QQ,MSN,skype,goolge TALK,雅虎通,贸易通,淘宝旺旺