RabbitMQ基础

目录

RabbitMQ的可靠性投递

确保消息正确地发送至 RabbitMQ

确保消息接收方消费了消息

流程分析

1.生产者发送消息给Broker

2.交换机路由消息到队列

3.消息存储在队列

4.消费者订阅并消费消息

三个重要概念

RabbitMQ集群模式


RabbitMQ的可靠性投递

在 RabbitMQ 中,确保消息正确地发送和消息接收方消费消息通常需要采取一些措施。

确保消息正确地发送至 RabbitMQ
  1. 生产者确认:RabbitMQ 支持生产者确认机制,即发布确认(Publisher Confirms)。通过启用生产者确认,生产者可以等待 RabbitMQ 确认消息已成功接收并存储,然后再继续发送下一条消息。

  2. 消息持久性:在发布消息时,确保消息被标记为持久性(persistent)。这意味着消息将被保存到磁盘,即使 RabbitMQ 服务器重启,消息也不会丢失。

  3. 交换机和队列的持久性:确保交换机和队列也被标记为持久性,以防止它们在 RabbitMQ 服务器重启时丢失。

  4. 备份交换机:使用备份交换机(Alternate Exchange)来确保消息在无法路由到目标队列时不会丢失。备份交换机将无法路由的消息路由到备份队列,以供后续处理。

确保消息接收方消费了消息
  1. 消费者确认:在消费者端,您可以使用消费者确认来确保消息已被正确处理。RabbitMQ 支持基本确认模式,消费者可以发送确认给 RabbitMQ,告知它已成功接收和处理消息。如果消费者未发送确认,消息将被重新排队,确保不会丢失。

  2. 消息应答模式:RabbitMQ 支持两种消息应答模式,分为自动应答和手动应答。在手动应答模式下,消费者必须明确发送应答以告知 RabbitMQ 消息已被处理。这提供了更大的控制力和可靠性,因为只有在确认消息处理后才会发送应答。

  3. 消息持久性:如果消费者接收到消息后,将其处理并将结果写入数据库或其他持久性存储,可以确保消息被持久化。这样即使消费者故障,可以在重新启动后重新处理消息。

  4. 幂等性处理:消费者应该实现幂等性处理,以确保多次处理相同消息的效果与一次处理相同消息的效果相同。这样即使消息重复传递,也不会引起问题。

流程分析

1.生产者发送消息给Broker
  • 怎么知道消息发送成功了?

    RabbitMQ 里面提供了两种服务端确认机制进行应答,告知生产者是否发送成功

    • Transaction(事务)模式

      通过一个 channel.txSelect()的方法把信道设置成事务模式,当Broker回复Producer一个Ack(Commit-OK指令)后,才能提交成功。同步阻塞的方式缺点也很明显:需要等待,消耗性能,不建议生产使用。

    • Confirm(确认)模式(总共有三种)

      将信道设置成 confirm 模式(发送方确认模式),则所有在信道上发布的消息都会被指派一个唯一的 ID。 一旦消息被投递到目的队列后,或者消息被写入磁盘后(可持久化的消息),信道会发送一个确认给生产者(包含消息唯一 ID),发送方确认模式通常选择异步的。

      • 普通确认模式:发一条确认一条->缺点就是有点慢

      • 批量确认模式:发一批,没异常默认都接收了->缺点是一批是多少?怎么衡量?

      • 异步确认模式:生产者应用程序在等待确认的同时,可以继续发送消 息。

  • 怎么避免消息重复投递或重复消费?

    • 在消息生产时:MQ 内部针对每条生产者发送的消息生成一个 inner-msg-id,作为去重的依据(消息投递失败并重传),避免重复的消息进入队列。

    • 在消息消费时:要求消息体中必须要有一个 bizId(对于同一业务全局唯一,如支付 ID、订单 ID、帖子 ID 等)作为去重的依据,避免同一条消息被重复消费。

  • 消息基于什么传输?

    由于 TCP 连接的创建和销毁开销较大,且并发数受系统资源限制,会造成性能瓶 颈。RabbitMQ 使用信道的方式来传输数据。信道是建立在真实的 TCP 连接内的 虚拟连接,且每条 TCP 连接上的信道数量没有限制。

2.交换机路由消息到队列
  • 怎么处理消息无法正确路由到队列?

    1. 消息回发的方式:服务端重发给生产者,提供错误码告知路由失败消息。

    2. 消息路由到备份交换机的方式:在创建交换机的时候,指定备份交换机存放以备后续处理。

3.消息存储在队列
  • 没有消费者消费的情况下,队列存储在自身数据库,怎么防止异常情况下(重启、宕机 、关闭等)导致内存中的消息丢失?

    队列持久化、交换机持久化、消息持久化、使用集群多个节点同步备份。

  • 怎么分发消息给消费者?

    若该队列至少有一个消费者订阅,消息将以循环(round-robin)的方式发送给消 费者。每条消息只会分发给一个订阅的消费者(前提是消费者能够正常处理消息并进行确认)。

4.消费者订阅并消费消息
  • 怎么确认接收成功?

    消费者确认机制:自动或手动发送Ack给服务端。Ack设置的三个值:NONE(自动Ack)、MANUAL(手动Ack)、AUTO(没异常就发送Ack)。

三个重要概念

在 RabbitMQ 中,消息的幂等性、顺序性和最终一致性是消息处理的重要概念,用于确保消息系统的可靠性和正确性。

1. 消息的幂等性(Message Idempotence)

  • 概念:消息的幂等性是指无论消息被处理多少次,其效果都与一次处理的效果相同。即使消息重复传递,也不会引发不一致性或错误结果。

  • 实现:为实现消息的幂等性,生产者和消费者可以采用以下方法:

    • 在生产者端为每个消息分配唯一的消息标识符(Message ID),并在消费者端维护已经处理过的消息 ID 列表。在处理消息前,消费者可以检查消息 ID 是否已经存在于列表中,如果存在则不处理。

2. 消息的顺序性(Message Ordering)

  • 概念:消息的顺序性要求消息在传递和处理时保持特定的顺序,即消息按照其发送的顺序进行处理。

  • 实现:RabbitMQ 本身保证单个队列内消息的顺序性,但在分布式系统中,全局顺序性可能更为复杂。为实现全局顺序性,可以采用以下方法:

    • 使用单一队列:将所有相关消息发送到单一队列,这样可以确保它们按顺序处理。

    • 基于分区键(Partition Key):将消息根据某个关键属性(如订单号)分发到不同的队列或分区,然后在消费者端将它们重新排序。

3. 消息的最终一致性(Message Eventually Consistency)

  • 概念:最终一致性指的是在分布式系统中,即使系统出现故障或网络延迟,最终数据仍然达到一致性状态。

  • 实现:实现最终一致性需要以下策略:

    • 异步确认:在消息处理完成后,异步发送确认,即使消费者端出现故障,消息系统也可以在稍后重新传递消息。

    • 消息持久性:将消息和数据持久化,以确保即使系统重启,消息不会丢失。

    • 冗余:使用多个副本以增加系统的可用性和冗余。

综合考虑这些概念,RabbitMQ 中的消息可以通过确保消息的幂等性、维护顺序性和实现最终一致性来处理。这些概念和实现方法可以帮助设计和构建可靠的消息传递系统。

RabbitMQ集群模式

集群主要用于实现高可用与负载均衡。

  • 高可用:如果集群中的某些 MQ 服务器不可用,客户端还可以连接到其他MQ服务器。

  • 负载均衡:在高并发的场景下,单台 MQ 服务器能处理的消息有限,可以分发给多台 MQ 服务器。

RabbitMQ 有两种集群模式:普通集群模式和镜像队列模式。

  • 普通集群模式下,不同的节点之间只会相互同步元数据。普通集群模式不能保证队列的高可用性,因为队列内容不会复制。如果节点失效将导致相关队列不可用,因此我们需要第二种集群模式。

  • 镜像队列模式下,消息内容会在镜像节点间同步,可用性更高。不过也有一定的副作用,系统性能会降低,节点过多的情况下同步的代价比较大。

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

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

相关文章

BUUCTF qr 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 这是一个二维码,谁用谁知道! 密文: 下载附件,得到一张二维码图片。 解题思路: 1、这是一道签到题,扫描二维码得到flag。 flag:…

一文了解Elasticsearch

数据分类 数据按数据结构分类主要有三种:结构化数据、半结构化数据和非结构化数据。 结构化数据 结构化数据具有明确定义数据模型和格式的数据类型。 特点: 数据具有固定的结构和模式。 数据项明确定义数据类型和长度。 适合用于数据查询、过滤和分…

377. 组合总和 Ⅳ 70.魔改爬楼梯

377. 组合总和 Ⅳ 题目: 给一个正整数数组和一个正整数目标值,数组的每个元素可取无限次,求总额达到目标值的最大排列数。 dp[j]含义: dp[j]:达到目标值j的整数组合数为dp[j] 递推公式: 求装满背包有几…

在CARLA中手动开车,添加双目相机stereo camera,激光雷达Lidar

CARLA的使用逻辑: 首先创建客户端 设置如果2秒没有从服务器返回任何内容,则终止 client carla.Client("127.0.0.1", 2000) client.set_timeout(2.0) 从客户端中get world world client.get_world() 设置setting并应用 这里使用固定时…

【C++的OpenCV】第十四课-OpenCV基础强化(三):Mat元素的访问之data和step属性

🎉🎉🎉 欢迎来到小白 p i a o 的学习空间! \color{red}{欢迎来到小白piao的学习空间!} 欢迎来到小白piao的学习空间!🎉🎉🎉 💖 C\Python所有的入门技术皆在 我…

【年终特惠】基于最新导则下生态环评报告编制技术暨报告篇、制图篇、指数篇、综合应用篇系统性实践技能提升

根据生态环评内容庞杂、综合性强的特点,依据生态环评最新导则,将内容分为4大篇章(报告篇、制图篇、指数篇、综合篇)、10大专题(生态环评报告编制、土地利用图的制作、植被类型及植被覆盖度图的制作、物种适宜生境分布图的制作、生物多样性测定、生物量及…

前端Vue页面中如何展示本地图片

<el-table :data"tableData" stripe style"width: 100%"><el-table-column prop"imgUrl" label"图片"><template v-slot"scope"><img :src "http://localhost:8888/image/ scope.row.imgUrl&qu…

R-FCN: Object Detection via Region-based Fully Convolutional Networks(2016.6)

文章目录 AbstractIntroduction当前最先进目标检测存在的问题针对上述问题&#xff0c;我们提出... Our approachOverviewBackbone architecturePosition-sensitive score maps & Position-sensitive RoI pooling Related WorkExperimentsConclusion 原文链接 源代码 Abstr…

飞天使-mysql8.0远程连接允许

mysql -u root -p 查看身份验证类型 mysql> use mysql; Database changed mysql> SELECT Host, User, plugin from user; ------------------------------------------------- | Host | User | plugin | ------------------------------------------------- | % | root …

Sass、Less和Stylus之间有什么主要的区别?

Sass、Less和Stylus是三种常见的CSS预处理器&#xff0c;它们在功能和语法上有一些区别。以下是它们之间的主要区别&#xff1a; 1&#xff1a;语法差异&#xff1a; Sass使用缩进的语法&#xff0c;使用类似于Python的缩进来表示嵌套规则和块级作用域。Less和Stylus使用类似…

大数据之LibrA数据库系统告警处理(ALM-12002 HA资源异常)

告警解释 HA软件周期性检测Manager的WebService浮动IP地址和数据库。当HA软件检测到浮动IP地址或数据库异常时&#xff0c;产生该告警。 当HA检测到浮动IP地址或数据库正常后&#xff0c;告警恢复。 告警属性 告警参数 对系统的影响 如果Manager的WebService浮动IP地址异常…

SSM咖啡点餐管理系统开发mysql数据库web结构java编程计算机网页源码eclipse项目

一、源码特点 SSM 咖啡点餐管理系统是一套完善的信息系统&#xff0c;结合SSM框架完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用SSM框架&#xff08;MVC模式开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主 要采用B/S模式开…

selenium : TypeError: object of type ‘float‘ has no len()

使用selenium时报错 TypeError: object of type float has no len() 。 显然selenium不允许直接输入浮点类型数据&#xff08;字符串与整形可以&#xff09;。 但是问题excel中这个数据值为空&#xff0c;只能猜测不同电脑打开excel时格式不同影响读取数据。 将该数据使用st…

vue3 Suspense组件

在 Vue 3 中&#xff0c;<Suspense> 组件用于处理异步组件加载时的等待状态和错误处理。它允许你在加载异步组件时显示一个自定义的加载指示器&#xff0c;以及在加载失败时显示错误信息。以下是一个详细的 <Suspense> 组件的使用示例&#xff1a; 首先&#xff0…

CSS基础入门04

目录 1.内边距 1.1基础写法 1.2复合写法 2.外边距 2.1基础写法 2.2复合写法 2.3块级元素水平居中 3.去除浏览器默认样式 4.弹性布局 4.1初体验 5.flex 布局基本概念 6.常用属性 6.1justify-content 6.2align-items 1.内边距 padding 设置内容和边框之间的距离. …

java的字符串字面量

在同一个类中&#xff0c;字符串字面量引用同一个字符串对象。例如&#xff1a; package com.thb;public class Demo4 {public static void main(String[] args) {String world "world";System.out.println(world "world");}}运行输出&#xff1a; tru…

01函数的基础

函数是一段功能性代码&#xff0c;可以让python做特殊的事情 函数是代码重用的一种方式&#xff0c;可以让你多次使用函数 abs函数bool函数float函数 绝对值 abs 绝对值 绝对值数值距离原点的位置 0和所有的正数绝对值等于它本身 负数的绝对值等于他的相反数 bool函数 boo…

NewStarCTF2023week4-midsql(利用二分查找实现时间盲注攻击)

大致测试一下&#xff0c;发现空格被过滤了 使用内联注释/**/绕过&#xff0c;可行 1/**/-- 使用%a0替代空格&#xff0c;也可以 1%a0-- 再次测试发现等号也被过滤&#xff0c;我们使用 like 代替 &#xff08;我最开始以为是and被过滤&#xff0c;并没有&#xff0c;如果是…

使用Python批量修改PPT字体和提取全部文字到word

目录 一、修改PPT中每一页的字体二、将文本框中的字都放到word里 将一份PPT的每一页字体、大小、是否加粗都统一&#xff0c;是一个常见需求。特别是字体统一是高频、热点需求。在python操控PPT常用库python-pptx中有一个bug&#xff0c;对字体的修改只能修改数字和英文字母&am…

智慧公厕:提升城市卫生与舒适体验的未来之选

智慧公厕作为城市管理的一项重要创新&#xff0c;已经在环境监测调控、厕位监测引导、自动化清洁、自动灯光控制、远程控制等方面展现出先进而完善的功能。它不仅提升了市民对公共厕所卫生、舒适、安全等方面的使用体验&#xff0c;同时也为城市管理带来了颇具引领性的改革和升…