【MQ 系列】RabbitMq 核心知识点小结

这篇具有很好参考价值的文章主要介绍了【MQ 系列】RabbitMq 核心知识点小结。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【MQ 系列】RabbitMq 核心知识点小结,rabbitmq,分布式,java,学习

RabbitMQ 是一个基于 AMQP 协议实现的企业级消息系统,想要顺畅的玩耍的前提是得先了解它,本文将主要介绍 rabbitmq 的一些基本知识点

  • 特点

  • 基本概念

  • 消息投递消费的几种姿势

  • 事务

  • 集群

I. 基本知识点

它是采用 Erlang 语言实现的 AMQP(Advanced Message Queued Protocol)的消息中间件,最初起源于金融系统,用在分布式系统存储转发消息,目前广泛应用于各类系统用于解耦、削峰

1.特点

首先得了解一下 rabbitmq 的特点,看看是否满足我们的系统需求(毕竟学习一个框架也是要不少时间的)

主要特点,大致可以归纳为以下几个

  • 可靠性:通过支持消息持久化,支持事务,支持消费和传输的 ack 等来确保可靠性

  • 路由机制:支持主流的订阅消费模式,如广播,订阅,headers 匹配等

  • 扩展性:多个 RabbitMQ 节点可以组成一个集群,也可以根据实际业务情况动态地扩展集群中节点。

  • 高可用性:队列可以在集群中的机器上设置镜像,使得在部分节点出现问题的情况下队仍然可用。

  • 多种协议:RabbitMQ 除了原生支持 AMQP 协议,还支持 STOMP,MQTT 等多种消息中间件协议。

  • 多语言客户端:RabbitMQ 几乎支持所有常用语言,比如 Jav a、Python、Ruby、PHP、C#、JavaScript 等。

  • 管理界面:RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息、集群中的节点等。

  • 插件机制:RabbitMQ 提供了许多插件,以实现从多方面进行扩展,当然也可以编写自己的插件。

2. 基本概念

下图为 rabbitmq 的内部结构图

【MQ 系列】RabbitMq 核心知识点小结,rabbitmq,分布式,java,学习

从上图也可以发现几个基本概念(Message, Publisher, Exchange, Binding, Queue, Channel, Consuer, Virtual host)

下面逐一进行说明

a. Message

具体的消息,包含消息头(即附属的配置信息)和消息体(即消息的实体内容)

由发布者,将消息推送到 Exchange,由消费者从 Queue 中获取

b. Publisher

消息生产者,负责将消息发布到交换器(Exchange)

c. Exchange

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

d. Binding

绑定,用于给 Exchange 和 Queue 建立关系,从而决定将这个交换器中的哪些消息,发送到对应的 Queue

e. Queue

消息队列,用来保存消息直到发送给消费者

它是消息的容器,也是消息的终点

一个消息可投入一个或多个队列

消息一直在队列里面,等待消费者连接到这个队列将其取走

f. Connection

连接,内部持有一些 channel,用于和 queue 打交道

g. Channel

信道(通道),MQ 与外部打交道都是通过 Channel 来的,发布消息、订阅队列还是接收消息,这些动作都是通过 Channel 完成;

简单来说就是消息通过 Channel 塞进队列或者流出队列

h. Consumer

消费者,从消息队列中获取消息的主体

i. Virtual Host

虚拟主机,表示一批交换器、消息队列和相关对象。

虚拟主机是共享相同的身份认证和加密环境的独立服务器域。

每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。

vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 /

可以理解为 db 中的数据库的概念,用于逻辑拆分

j. Broker

消息队列服务器实体

3. 消息投递消费

从前面的内部结构图可以知晓,消息由生产者发布到 Exchange,然后通过路由规则,分发到绑定 queue 上,供消费者获取消息

接下来我们看一下 Exchange 支持的四种策略

a. Direct 策略

【MQ 系列】RabbitMq 核心知识点小结,rabbitmq,分布式,java,学习

消息中的路由键(routing key)如果和 Binding 中的 binding key 一致, 交换器就将消息发到对应的队列中

简单来讲,就是rounting keybinding key完全匹配

  • 如果一个队列绑定到交换机要求路由键为dog

  • 只转发routing key 标记为dog的消息,

  • 不会转发dog.puppy,也不会转发“dog.guard”等等

  • 它是完全匹配、单播的模式

举例说明

【MQ 系列】RabbitMq 核心知识点小结,rabbitmq,分布式,java,学习

Exchange 和两个队列绑定在一起:

  • Q1 的 bindingkey 是 orange

  • Q2 的 binding key 是 black 和 green.

  • 当 Producer 发布一个消息,其routing keyorange时, exchange 会把它放到 Q1 上, 如果是blackgreen就会到 Q2 上, 其余的 Message 被丢弃

注意

  • 当有多个队列绑定到同一个 Exchange,且 binding key 相同时,这时消息会分发给所有满足条件的队列

b. Topic 策略

【MQ 系列】RabbitMq 核心知识点小结,rabbitmq,分布式,java,学习

这个策略可以看成是 Direct 策略的升级版,通过routing key与 bingding key的模式匹配方式来分发消息

简单来讲,直接策略是完全精确匹配,而 topic 则支持正则匹配,满足某类指定规则的(如以 xxx 开头的路由键),可以将消息分发过去

  • # 匹配 0 个或多个单词

  • * 匹配不多不少一个单词

一个更直观的实例如下

【MQ 系列】RabbitMq 核心知识点小结,rabbitmq,分布式,java,学习

Producer 发送消息时需要设置 routing_key,

  • Q1 的 binding key 是*.orange.*

  • Q2 是 *.*.rabbit 和 lazy.#

  • 发布一个routing keytest.orange.mm 消息,则会路由到 Q1;

    • 注意: 如果是routng key是 test.orange则无法路由到 Q1,

    • 因为 Q1 的规则是三个单词,中间一个为 orange,不满足这个规则的都无效

  • 发布一个routing keytest.qq.rabbit或者lazy.qq的消息 都可以分发到 Q2;即路由 key 为三个单词,最后一个为 rabbit 或者不限制单词个数,主要第一个是 lazy 的消息,都可以分发过来

  • 如果发布的是一个test.orange.rabbit消息,则 Q1 和 Q2 都可以满足

    • 注意: 这时两个队列都会接受到这个消息

c. Fanout 策略

【MQ 系列】RabbitMq 核心知识点小结,rabbitmq,分布式,java,学习

广播策略,忽略routing key 和 binding key,将消息分发给所有绑定在这个 exchange 上的 queue

d. Headers 策略

这个实际上用得不多,它是根据 Message 的一些头部信息来分发过滤 Message,忽略 routing key 的属性,如果 Header 信息和 message 消息的头信息相匹配

II. 消息一致性问题

在进入 rabbitmq 如何保证一致性之前,我们先得理解,什么是消息一致性?

1. 一致性问题

数据的一致性是什么[2]

按照我个人的粗浅理解,我认为的消息一致性,应该包含下面几个

  • 生产者,确保消息发布成功

    • 消息不会丢

    • 顺序不会乱

    • 消息不会重复(如重传,导致发布一次,却出现多个消息)

  • 消费者,确保消息消费成功

    • 有序消费

    • 不重复消费

发送端

为了确保发布者推送的消息不会丢失,我们需要消息持久化

  • broker 持久化消息

为了确定消息正确接收

  • publisher 需要知道消息投递并成功持久化

2. 持久化

这里的持久化,主要是指将内存中的消息保存到磁盘,避免 mq 宕机导致的内存中消息丢失;然而单纯的持久化,只是保证一致性的其中一个要素,比如 publisher 将消息发送到 exchange,在 broker 持久化的工程中,宕机了导致持久化失败,而 publisher 并不知道持久化失败,这个时候就会出现数据丢失,为了解决这个问题,rabbitmq 提供了事务机制

3. 事务机制

事务机制能够解决生产者与 broker 之间消息确认的问题,只有消息成功被 broker 接受,事务才能提交成功,否则就进行事务回滚操作并进行消息重发。但是使用事务机制会降低 RabbitMQ 的消息吞吐量,不适用于需要发布大量消息的业务场景。

注意,事务是同步的

4. 消息确认机制

RabbitMQ 学习(六)——消息确认机制(Confirm 模式)[3]

消息确认机制,可以区分为生产端和消费端

生产端

  • 生产者将信道设置成 Confirm 模式,一旦信道进入 Confirm 模式,所有在该信道上面发布的消息都会被指派一个唯一的 ID(以 confirm.select 为基础从 1 开始计数),

  • 一旦消息被投递到所有匹配的队列之后,Broker 就会发送一个确认给生产者(包含消息的唯一 ID),这就使得生产者知道消息已经正确到达目的队列了,

  • 如果消息和队列是可持久化的,那么确认消息会将消息写入磁盘之后发出,

  • Broker 回传给生产者的确认消息中 deliver-tag 域包含了确认消息的序列号(此外 Broker 也可以设置 basic.ack 的 multiple 域,表示到这个序列号之前的所有消息都已经得到了处理)

Confirm 模式属性异步,publisher 发布一条消息之后,在等信道返回确认的同时,依然可以继续发送下一条消息,所以小概率会出现投递的消息顺序和 broker 中持久化消息顺序不一致的问题

一般从编程角度出发,Confirm 模式有三种姿势

  • 普通 Confirm 模式:发送一条消息之后,等到服务器 confirm,然后再发布下一条消息(串行发布)

  • 批量 Confirm 模式:发送一批消息之后,等到服务器 confirm,然后再发布下一批消息(如果失败,这一批消息全部重复,所以会有重复问题)

  • 异步 Confirm 模式:提供一个回调方法,服务器 confirm 之后,触发回调方法,因此不会阻塞下一条消息的发送

消费端

ACK 机制是消费者从 RabbitMQ 收到消息并处理完成后,反馈给 RabbitMQ,RabbitMQ 收到反馈后才将此消息从队列中删除。

  • 如果一个消费者在处理消息出现了网络不稳定、服务器异常等现象,那么就不会有 ACK 反馈,RabbitMQ 会认为这个消息没有正常消费,会将消息重新放入队列中

  • 如果在集群的情况下,RabbitMQ 会立即将这个消息推送给这个在线的其他消费者。这种机制保证了在消费者服务端故障的时候,不丢失任何消息和任务

  • 消息永远不会从 RabbitMQ 中删除,只有当消费者正确发送 ACK 反馈,RabbitMQ 确认收到后,消息才会从 RabbitMQ 服务器的数据中删除

 

III. 集群

按照目前的发展趋势,一个不支持集群的中间件基本上是不会有市场的;rabbitmq 也是支持集群的,下面简单的介绍一下常见的 4 种集群架构模式

以下内容来自网上博文,详情请点击右边:RabbitMQ 的 4 种集群架构[4]

1. 主备模式

这个属于常见的集群模式了,但又不太一样

主节点提供读写,备用节点不提供读写。如果主节点挂了,就切换到备用节点,原来的备用节点升级为主节点提供读写服务,当原来的主节点恢复运行后,原来的主节点就变成备用节点

2. 远程模式

远程模式可以实现双活的一种模式,简称 shovel 模式,所谓的 shovel 就是把消息进行不同数据中心的复制工作,可以跨地域的让两个 MQ 集群互联,远距离通信和复制。

  • Shovel 就是我们可以把消息进行数据中心的复制工作,我们可以跨地域的让两个 MQ 集群互联。

【MQ 系列】RabbitMq 核心知识点小结,rabbitmq,分布式,java,学习 

如上图,有两个异地的 MQ 集群(可以是更多的集群),当用户在地区 1 这里下单了,系统发消息到 1 区的 MQ 服务器,发现 MQ 服务已超过设定的阈值,负载过高,这条消息就会被转到 地区 2 的 MQ 服务器上,由 2 区的去执行后面的业务逻辑,相当于分摊我们的服务压力。

3. 镜像模式

非常经典的 mirror 镜像模式,保证 100% 数据不丢失。在实际工作中也是用得最多的,并且实现非常的简单,一般互联网大厂都会构建这种镜像集群模式。

【MQ 系列】RabbitMq 核心知识点小结,rabbitmq,分布式,java,学习

如上图,用 KeepAlived 做了 HA-Proxy 的高可用,然后有 3 个节点的 MQ 服务,消息发送到主节点上,主节点通过 mirror 队列把数据同步到其他的 MQ 节点,这样来实现其高可靠

4. 多活模式

也是实现异地数据复制的主流模式,因为 shovel 模式配置比较复杂,所以一般来说,实现异地集群的都是采用这种双活 或者 多活模型来实现的。这种模式需要依赖 rabbitMQ 的 federation 插件,可以实现持续的,可靠的 AMQP 数据通信,多活模式在实际配置与应用非常的简单

rabbitMQ 部署架构采用双中心模式(多中心),那么在两套(或多套)数据中心各部署一套 rabbitMQ 集群,各中心的 rabbitMQ 服务除了需要为业务提供正常的消息服务外,中心之间还需要实现部分队列消息共享。

【MQ 系列】RabbitMq 核心知识点小结,rabbitmq,分布式,java,学习

federation 插件是一个不需要构建 cluster ,而在 brokers 之间传输消息的高性能插件,federation 插件可以在 brokers 或者 cluster 之间传输消息,连接的双方可以使用不同的 users 和 virtual hosts,双方也可以使用不同版本的 rabbitMQ 和 erlang。federation 插件使用 AMQP 协议通信,可以接受不连续的传输。federation 不是建立在集群上的,而是建立在单个节点上的,如图上黄色的 rabbit node 3 可以与绿色的 node1、node2、node3 中的任意一个利用 federation 插件进行数据同步。文章来源地址https://www.toymoban.com/news/detail-819254.html

到了这里,关于【MQ 系列】RabbitMq 核心知识点小结的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 206、SpringBoot 整合 RabbitMQ 的自动配置类 和 对应的属性处理类 的知识点

    ▲ Spring Boot 提供了一个 spring-boot-starter-amqp 的Starter来支持RabbitMQ,只要添加该Starter,它就会添加 spring-rabbit 依赖库(它有传递依赖了amqp-client.jar) ▲ 只要类加载路径下包含了 spring-rabbit 依赖库, Spring Boot 会自动配置 CachingConnectionFactory (CachingConnectionFactory:带缓存的连接工

    2024年02月07日
    浏览(42)
  • 分布式消息队列RabbitMQ-Linux下服务搭建,面试完腾讯我才发现这些知识点竟然没掌握全

    vim /usr/lib/rabbitmq/lib/rabbitmq_server-3.6.5/ebin/rabbit.app 5.修改配置文件 这里面修改{loopback_users, [“guest”]}改为{loopback_users, []} {application, rabbit, %% - - erlang - - [{description, “RabbitMQ”}, {id, “RabbitMQ”}, {vsn, “3.6.5”}, {modules, [‘background_gc’,‘delegate’,‘delegate_sup’,‘dtree’,‘file_han

    2024年04月14日
    浏览(55)
  • unity开发知识点小结02

    虚拟轴就是一个数值在-1 1内的轴,这个数轴上重要的数值就是-1,0和1。当使用按键模拟一个完整的虚拟轴时需要用到两个按键,即将按键1设置为负轴按键,按键2设置为正轴按键。在没有按下任何按键的时候,虚拟轴的数值为0;在按下按键1的时候,虚拟轴的数值会从0 -1进行

    2024年02月07日
    浏览(47)
  • 高等数学重积分知识点笔记小结

    (1)首先知道什么叫曲顶柱体。(这里不多讲,不会百度)。 (2)定义:设f(x,y)是有界闭区域D上的有界函数,将闭区域D任意分成n个小闭区域oi,在每个小区域上取一点f(ai,bi),做乘积f(ai,bi)oi,并作和。如果当各个闭区域的直径中的最大值max趋近于0时,这和的极限总存在,且

    2024年02月05日
    浏览(47)
  • 消息队列-RabbitMQ:MQ作用分类、RabbitMQ核心概念及消息生产消费调试

    1)什么是 MQ MQ (message queue),从字面意思上看, 本质是个队列,FIFO 先入先出 ,只不过队列中存放的内容是 message 而已,还是一种 跨进程的通信机制 , 用于上下游传递消息 。在互联网架构中,MQ 是一种非常常见的上下游 “ 逻辑解耦 + 物理解耦” 的消息通信服务 。 使用了

    2024年02月20日
    浏览(47)
  • PyFlink核心知识点

    四层 说明 备注 SteamGraph 代码生成的最初的图 表示程序的拓扑结构 JobGraph 将多个符合条件的节点,链接为一个节点 可以减少数据在节点之间流动所需要的序列化/反序列化/传输消耗 ExecutionGraph JobGraph的并行化版本 是调度层最核心的数据结构 PhysicalGraph JobManager根据ExecutionGra

    2024年04月27日
    浏览(54)
  • Vue入门——核心知识点

    Vue是一套用于 构建用户界面 的 渐进式 JS框架。 构建用户界面:就是将后端返回来的数据以不同的形式(例如:列表、按钮等)显示在界面上。 渐进式:就是可以按需加载各种库。简单的应用只需要一个核心库即可,复杂的应用可以按照需求引入各种Vue插件。 采用组件化模式

    2024年02月06日
    浏览(53)
  • 垃圾回收的核心知识点解析

    Java运行时内存中的程序计数器、虚拟机栈、本地方法栈这三部分区域其生命周期与相关线程有关,随线程而生,随线程而灭。而程序计数器就是一个单纯存地址的整数也不需要关心,因此我们GC(垃圾回收)的主要目标就是堆(堆中存放着几乎所有实例对象)! 一个对象,如

    2024年02月16日
    浏览(42)
  • JavaSE核心基础-循环-知识点

    1.循环概念 循环是在满足条件的情况下,反复的做同一件事。 Java语言中的循环语句有三种,分别是for语句、while语句和do-while语句。程序中需要循环处理时,程序员要根据实际问题,选择适当的循环语句。解决循环问题时一定要找到循环条件和循环操作。 2.for循环语句格式

    2024年02月22日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包