消息队列必知必会-RabbitMQ

文章目录

    • RabbitMQ是什么?有什么特点?
    • RabbitMQ架构
    • RabbitMQ消息消费过程
    • 如何保证消息不丢失?可靠性传输?
      • 生产者丢失了数据
      • RabbitMQ(broker)丢失了数据
      • 消费端丢失数据
    • 顺序消息
      • 错乱场景
      • 解决方案
    • 高可用
      • 普通集群模式(非高可用)
      • 在镜像集群模式(高可用)
  • 总结


RabbitMQ是什么?有什么特点?

  • RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。
  • 可靠性(Reliability)
  • 灵活的路由(Flexible Routing):在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ 已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个 Exchange 绑定在一起,也通过插件机制实现自己的 Exchange 。
  • 消息集群(Clustering)多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker 。
  • 高可用(Highly Available Queues):队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
  • 多种协议(Multi-protocol)RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等。
  • 多语言客户端(Many Clients)RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby 等等
  • 管理界面(Management UI)RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面。
  • 跟踪机制(Tracing)如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么。
  • 插件机制(Plugin System)RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。

RabbitMQ架构

  • RabbitMQ 整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息。从计算机术语层面来说, RabbitMQ 模型更像是一种交换机模型。 RabbitMQ主要包含下面几个部分:
    • Producer投递消息
    • Consumer接收消息
    • QueueRabbitMQ不支持队列层面广播消费
    • Exchange生产者将消息发到交换器,交换器再将数据路由到队列。如果路由不到,或许会返回给生产者,或许直接丢弃。包括fanout、direct、topic、headers类型
    • Broker一个Broker可以看做一个RabbitMQ服务节点或者服务实例
    • RoutingKey路由键,指定这个消息的路由规则
    • BindingKey绑定键,关联交换器与队列
    • payload消息体
    • 标签(Label)用来表述消息,比如一个交换器的名称和一个路由键。生产者把消息交由RabbitMO, RabbitMQ 之后会根据标签把消息发送给感兴趣的消费者(Consumer)在消息路由的过程中,消息的标签会丢弃,存入到队列中的消息只有消息体,消费者只会消费到消息体,也就不知道消息的生产者是谁,当然消费者也不需要知道。
      外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

RabbitMQ消息消费过程

  • 生产者发送消息
    • 生产者连接到 RabbitMO Broker,建立一个连接(Connection),开启一个信道(Channel)
    • 生产者声明一个交换器,并设置相关属性,比如交换机类型、是否持久化等
    • 生产者声明一个队列并设置相关属性,比如是否排他、是否持久化、是否自动删除等
    • 生产者通过路由键将交换器和队列绑定起来
    • 生产者发送消息至 RabbitMO Broker,其中包含路由键、交换器等信息
    • 相应的交换器根据接收到的路由键查找相匹配的队列。
    • 如果找到,则将从生产者发送过来的消息存入相应的队列中。
    • 如果没有找到,则根据生产者配置的属性选择丢弃还是回退给生产者
    • 关闭信道。
    • 关闭连接。
  • 消费者接收消息
    • 消费者连接到 RabbitMQ Broker,建立一个连接(Connection),开启一个信道(Channel)。
    • 消费者向 RabbitMQ Broker 请求消费相应队列中的消息,可能会设置相应的回调函数,以及做一些准备工作
    • 等待 RabbitMQ Broker 回应并投递相应队列中的消息,消费者接收消息。
    • 消费者确认(ack)接收到的消息。
    • RabbitMQ 从队列中删除相应已经被确认的消息。
    • 关闭信道。

如何保证消息不丢失?可靠性传输?

生产者丢失了数据

  • RabbitMQ 提供事务功能,就是生产者发送数据之前开启 RabbitMQ 事务channel.txSelect,然后发送消息,如果消息没有成功被 RabbitMQ 接收到,那么生产者会收到异常报错,此时就可以回滚事务channel.txRollback,然后重试发送消息;如果收到了消息,那么可以提交事务channel.txCommit
  • RabbitMQ 提供 confirm 模式,每次写的消息都会分配一个唯一的 id,然后如果写入了 RabbitMQ 中,首先会发送到Exchange,无论成功与否都回调函数confirm()返回ack消息。第二步从Exchange路由分配到Queue中,如果失败则回调函数returnedMessage()。
  • 事务机制和 confirm 机制最大的不同在于,事务机制是同步的,你提交一个事务之后会阻塞在那儿,但是 confirm 机制是异步的,你发送个消息之后就可以发送下一个消息,然后那个消息 RabbitMQ 接收了之后会异步回调你的一个接口通知你这个消息接收到了。所以一般在生产者这块避免数据丢失,都是用 confirm 机制的。

RabbitMQ(broker)丢失了数据

  • 创建 queue 的时候将其设置为持久化保证 RabbitMQ 持久化 queue 的元数据, durable 设置为 true.创建Exchange时设置为持久化
  • 发送消息的时候将消息的 deliveryMode 设置为 2。就是将消息设置为持久化的,此时 RabbitMQ 就会将消息持久化到磁盘上去。

消费端丢失数据

  • RabbitMQ 提供的自动 ack 机制,将acknowledge-mode改为手动模式,业务处理成功后通过一个 api 来调用关闭 RabbitMQ 的自动ack ,如果RabbitMQ认为你还没处理完,这个时候 RabbitMQ 会把这个消费分配给别的 consumer 去处理,消息是不会丢的。

顺序消息

错乱场景

  • 一个queue对应多个consumer,consumer从MQ里面读取数据是有序的,但是无法保证先读到消息的consumer一定先完成操作,这样就会出现消息并没有按照顺序执行,造成数据顺序错误。
  • 一个queue对应一个consumer,但是consumer里面进行了多线程消费

解决方案

  • 根据业务拆分成不同queue,比如同一个订单号用同一个queue,同一个queue使用同一个consumer去消费
  • 一个queue对应一个consumer,然后这个consumer内部用内存队列做排队,分发给不同线程去处理

高可用

普通集群模式(非高可用)

  • 在多台机器上启动多个 RabbitMQ 实例,每个机器启动一个。queue只会放在一个 RabbitMQ 实例上,但是每个实例都同步 queue 的元数据(queue 的一些配置信息包括 queue 所在实例)。消费的时候,实际上如果连接到了另外一个实例,那么那个实例会从 queue 所在实例上拉取数据过来。此时要么消费者每次随机连接一个实例然后拉取数据,要么固定连接那个 queue 所在实例消费数据,前者有数据拉取的开销,后者导致单实例性能瓶颈。而且如果那个放 queue 的实例宕机了,会导致接下来其他实例就无法从那个实例拉取,如果你开启了消息持久化,让 RabbitMQ 落地存储消息的话,消息不一定会丢,得等这个实例恢复了,然后才可以继续从这个 queue 拉取数据。这就没有什么所谓的高可用性,这方案主要是提高吞吐量的,就是说让集群中多个节点来服务某个 queue 的读写操作

在镜像集群模式(高可用)

  • 每个 RabbitMQ 节点都有这个 queue 的一个完整镜像,包含 queue 的全部数据(元数据和消息)。然后每次你写消息到 queue 的时候,都会自动把消息同步到多个实例的 queue 上
  • 在RabbitMQ管理控制台新增一个镜像集群模式的策略,指定的时候是可以要求数据同步到所有节点的,也可以要求同步到指定数量的节点,再次创建 queue 的时候,应用这个策略,就会自动将数据同步到其他的节点上去了
  • 优点,高可用,某个节点宕机不影响集群,别的 consumer 都可以到其它节点上去消费数据
  • 缺点,性能开销太大,消息需要同步到所有机器上,导致网络带宽压力和消耗很重;扩展性可言太差,加的机器也包含了这个 queue 的所有数据,并没有办法线性扩展你的 queue
  • 另外,由于每个节点都保存了副本,所以我们还可以通过HAProxy实现负载均衡

总结

本文介绍了的使用,如有问题欢迎私信和评论

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/44908.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

git提交大文件服务500

错误如图 需保证git服务端能接收大文件 修改项目下.git文件中的config文件,加入 [http] postBuffer 524288000

力扣 160相聚链表

注意 判断是否有交点 用while(A! B) 其中A A nullptr? headb:A->next;B同理 注意,while循环的退出条件是AB指针指向同一个,如果没有相交,仍然可以退出 当AB都为NULLPTR时退出

【信创】信创云规划设计建设方案(2024PPT原件)

信创,即“信息技术应用创新”。我国自主信息产业聚焦信息技术应用创新,旨在通过对IT硬件、软件等各个环节的重构,基于我国自有IT底层架构和标准,形成自有开放生态,从根本上解决本质安全问题,实现信息技术可…

【笔试常见编程题06】最近公共祖先、求最大连续bit数、二进制插入、查找组成一个偶数最接近的两个素数

1. 最近公共祖先 将一棵无穷大满二叉树的结点按根结点一层一层地从左往右编号,根结点编号为1。现给定a,b为两个结点。设计一个算法,返回a、b最近的公共祖先的编号。注意其祖先也可能是结点本身。 测试样例: 2,3 返回&a…

Airtest成功案例分享:KLab连续2年携Airtest私有云产品参加CEDEC大会!

一、KLab株式会社介绍 KLab株式会社是一家位于日本的移动游戏开发公司,成立于2000年。公司以开发和运营基于动漫和漫画IP的手机游戏而闻名,尤其是在音乐节奏游戏领域。KLab的一些知名作品包括《LoveLive!学园偶像祭》、《排球少年:新的征程》…

【中项第三版】系统集成项目管理工程师 | 第 11 章 规划过程组② | 11.3 - 11.5

前言 第 11 章对应的内容选择题和案例分析都会进行考查,这一章节属于10大管理的内容,学习要以教材为准。本章上午题分值预计在15分。 目录 11.3 收集需求 11.3.1 主要输入 11.3.2 主要工具与技术 11.3.3 主要输出 11.4 定义范围 11.4.1 主要输入…

【经典面试题】环形链表

1.环形链表oj 2. oj解法 利用快慢指针: /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; bool hasCycle(struct ListNode *head) {ListNode* slow head, *fast…

如何在 C 语言中进行选择排序?

🍅关注博主🎗️ 带你畅游技术世界,不错过每一次成长机会! 📙C 语言百万年薪修炼课程 通俗易懂,深入浅出,匠心打磨,死磕细节,6年迭代,看过的人都说好。 文章目…

【Python】已解决:AttributeError: target_names(机器学习中查看数据信息报错)

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:AttributeError: target_names(机器学习中查看数据信息报错) 一、分析问题背景 在机器学习的数据处理阶段,我们经常需要查看…

使用pip或conda离线下载安装包,使用pip或conda安装离线安装包

使用pip或conda离线下载安装包,使用pip或conda安装离线安装包 一、使用pip离线下载安装包1. 在有网络的机器上下载包和依赖2. 传输离线安装包 二、在目标机器上离线安装pip包三、使用conda离线下载安装包1. 在有网络的机器上下载conda包2. 传输conda包或环境包3. 在…

每日一练 - 理解IGMP组播组信息

下面是路由器 RTB 的部分输出信息, 关于输出信息描述错误的是A.接口上动态加入的组播组个数是 1 B.加入的组播组地址是 225.1.1.2 C.dsplay igmp group 命令用来查看 IGMP 组播组信息,包括通过成员报告动态加入的组播组和通过命令行静态加入的组播组信息 D.最后发…

汇编语言 第四版 王爽 一二章总结

第一章 基础知识 汇编语言的三类指令 1. 汇编指令 汇编指令是直接被CPU执行的指令,它们在汇编时被转换为对应的机器码。主要包括: 数据传送指令:如MOV,用于在寄存器、内存和I/O端口之间传送数据。 MOV AX, BX ; 将BX中的数据传…

【手把手教你使用cgroup配置,十分钟就会】

手把手教你使用cgroup配置,十分钟就会 什么是cgroupcgroup中的参数概念及原理 以 memory为例看下如何配置配置内存限制写一个内存申请脚本执行脚本测试结束语 什么是cgroup cgroups 是Linux内核提供的一种可以限制单个进程或者多个进程所使用资源的机制&#xff0c…

postgres 的dblink使用,远程连接数据库

一.安装下载 dblink create extension if not exists dblink 查看是否已经安装 select * from pg_extension;二.运行,查询数据 其中,第一个参数是dblink名字,也可以是连接字符串。 第二个参数是要执行的SQL查询语句。AS子句用于指定返回结…

“学习Pandas中时间序列的基本操作“

目录 # 开篇 1. 创建和操作时间序列对象 2. 时间序列数据的读取和存储 3. 时间序列数据的索引和切片 4. 时间序列数据的操作和转换 5. 时间序列数据的可视化 6. 处理时间序列中的缺失值 7. 时间序列数据的聚合和分组 8. 时间序列的时间区间和偏移量操作 示例代码&…

算法训练营day28--134. 加油站 +135. 分发糖果+860.柠檬水找零+406.根据身高重建队列

一、 134. 加油站 题目链接:https://leetcode.cn/problems/gas-station/ 文章讲解:https://programmercarl.com/0134.%E5%8A%A0%E6%B2%B9%E7%AB%99.html 视频讲解:https://www.bilibili.com/video/BV1jA411r7WX 1.1 初见思路 得模拟分析出…

如何抓取和处理天气网站数据

目的 在进行气象研究时,获取准确的历史天气数据是至关重要的。本文将分享如何从天气网站收集数据并将其转化为表格形式,以便于后续分析。然而,在直接抓取数据时,可能会遇到API接口保护的问题。本文将详细解释解决这些问题的步骤&…

“Pandas数据处理与分析:实用技巧与应用“

目录 # 开篇 1. pandas的series的了解 1.1 pd.Series 创建 1.2 pd.series 的索引使用 1.3 pd.series 之字典/索引 1.4 pandas 转换数据类型 1.5 pandas 通过索引或者通过位置来取值 1.6 pandas 指定行取值 1.7 pands之Series 切片和索引 1.8 pands之Series 的索引和值…

Python基础教学之三:函数与模块篇——实现代码重用和模块化

Python基础教学之三:函数与模块篇——实现代码重用和模块化 一、函数的定义与使用 1. 理解函数 函数是组织好的、可重复使用的、用来实现单一或相关联功能的代码块。它可以提高代码的重用性和程序的清晰度。 你可以定义一个由自己想要功能的函数,以下是…

交易伦敦银系统,听说高手都有一套

成功的伦敦银交易者都有一套自己的交易系统,这个系统为他们提供了一个明确的、可重复的决策框架,无论白银市场如何波动,他们都能按照既定的规则和策略进行操作,避免了情绪化决策和随意交易——这样的一致性有助于减少错误和亏损&a…