谈谈消息队列

这篇文章我们来聊聊消息队列。我一直在想,能不能用一篇文章就把消息队列的所有内容给串联起来。然后,之后每次看到这篇文章的时候,我就能够立马回忆起来这个大知识的所有知识点。所以我想尝试一下用这种长文的方式,将我自己对于消息队列的理解,用一篇长文章串联起来所有知识点。

消息队列的思维导图如下:

消息队列的优点

我们先从消息队列的优点讲起:解耦、异步、削峰。我们想想假如没有消息队列会怎么样?当生产者生产一条消息时,生产者会与消费者建立直接的联系,这会导致生产者和消费者进行强耦合。假如现在我想加一个消费者,那我不仅要写增加消费者的代码,还要对生产者的代码进行修改,这是很糟糕的。所以我们就引入消息队列,放在生产者和消费者中间,让生产者和消费者彻底解耦开来。从这个角度来理解,其实会发现消息队列和 SpringIOC 有点像。回到刚才说的,消息队列除了有解耦的作用,还有异步的作用。假如没有消息队列,生产者在生产一条消息给消费者,要等消费者消费完,生产者才可以继续生产。但是引入了消息队列,生产者只需要将消息放到消息队列里就可以继续转头生产了,消费者想什么时候拿就什么时候拿,这样子就实现了异步。消息队列的优点还有削峰。假如某一段时间有几千万条消息涌入进来,如果没有消息队列的话,消费者根本消费不了几千万条消息,会很容易死的。但是假如引入了消息队列,就可以把几千万条消息放到消息队列里存着,消费者从消息队列里慢慢拉出来消费,有点像“漏斗”的感觉。不过话说回来,消息队列也不全是优点,它还是有缺点的。因为生产者和消费者现在都直接与消息队列挂钩了,一旦消息队列挂了,那整个系统就废了。

消息队列各种名词含义

之前我一直搞不懂activemq、rabbitmq、rocketmq、kafka、MQ、消息队列、中间件是什么意思。也不是搞不清楚咯,只是对这些名词有点搞混乱,我没有真正的去区分它们是什么意思。后来我查阅了很多资料,然后结合自己的理解,总结成以下文字:MQ就是消息队列,它是消息队列的英文表达,我们说 MQ 其实就是说消息队列,说消息队列其实就是 MQ 。而 activemq、rabbitmq、rocketmq、kafka这几个东西我理解成实现消息队列的系统。消息队列就是一种中间件,中间件还有Nginx,redis,Tomcat 这些。

各种消息队列的优缺点

activemq、rabbitmq、rocketmq、kafka 这几个实现消息队列的系统,其实都有各自的优缺点,但是这里我先不展开说明,因为有点啰嗦。

kafka 消息队列的内部架构

因为我做项目用的都是 kafka,对 kafka 我是最熟悉的,所以我就通过 kafka 来讲一下消息队列吧。

我先从 kafka 的内部架构讲起。你想想,最原始的消息队列是如何做的?是不是就是一条队列。假如有多个消费者,你一条队列的话包含着不同类型的数据,从消费者的角度考虑,其实他可能只需要一种类型的消息,但是由于只有一条队列,迫于无奈,他只好硬着头皮拿到了很多它根本不想要的消息,所以有人就对这个原始的消息队列进行改进,改进成多条队列,每条队列叫一个 topic,不同 topic 之间都是存放不同类型的数据,同一 topic 的数据类型都是相同的,这样,消费者需要哪种数据类型就订阅哪一个 topic 既可。其实这种思路已经很好了,但是后来,人们又发现这样子其实并不快,因为假如有很多个消费者同时订阅一个 topic 的话,是串行拉消息的,这样子就不太快。所以他们就把 topic 分成很多个分区(partition),不同的消费者可以同时从不同的 partition 中拉消息,这就实现了并行,这样,消费者消费的速度就大大增加。消费同一个 topic 的消费者我们叫他们为消费者组。举个例子来说明以上我提到的这些名词:假如现在有一个 topic,这个 topic 有三个 partition,分别是 partition1、partition2、partition3。那么假如有2个消费者,消费者1和消费者2,他们都订阅了这个 topic,那我们就叫消费者1和消费者2为一个消费组。消费者1消费 partition1和 partition3,消费者2消费 partition2。

kafka 消息队列的特点

再来讲讲 kafka 的特点。其实最显而易见的特点就3个:保证数据不丢失、保证数据不被重复消费、保证数据消费的有序性。

kafka 怎么保证数据不丢失?那我们应该先想想 kafka 数据丢失有可能在哪里发生?无非就是生产者丢失了数据,或者消息队列丢失了数据,或者消费者丢失了数据。解决生产者丢失数据的方法是:假如生产者往 topic 中的 partition 写数据时,leader 接受到消息后,必须要等待它所有的 follower 都同步到这条消息,生产者才认为发送成功了,否则就一直重发,重发无限次。假如消息队列丢失了数据怎么办?解决办法是用 leader-follower。消费者丢失数据怎么办?消费者丢失数据情况就一个,就是消费者刚拿到消息后,消费者自己自动提交了 offset,让消息队列误以为消费者消费完数据,其实消费者刚准备消费,突然挂了,这条消息就没了。解决办法是你把那个自动提交 offset 的那个东西给关掉,改成自己手动提交既可。

kafka 怎么保证数据不被重复消费?这个很简单,具体做法是你每消费完一条数据,就往内存set中写一条日志,记录了你消费了这条数据,等下次你又消费到这条数据时,就可以用内存set去一下重,假如发现这条数据被消费过,那就直接扔掉。

kafka 还可以用来保证消息队列的有序性。其实有序性要靠生产者和消费者来共同完成。生产者怎么保证消息队列的有序性呢?比如说你有很多张订单表,就可以用订单表的id作为 key,这样就能保证同一个订单的所有数据都被放入一个 topic 中。等消费者从topic中取出数据后,假如这个消费者是单线程的,那数据肯定被有序消费。但是假如消费者是多线程的,就有可能导致数据不一致的问题,解决的办法是每个线程都搞一个内存队列,相同 key 的就被放在同一个内存队列中,那这样就可以保证消息有序被消费了。

假如几千万条消息堆积在消息队列中怎么办?

讲完 kafka 的特点后,我们最后来讲讲假如 kafka 消息队列积压了几千万条数据,那我们应该如何处理?比如你有一个 topic,积压了很多数据,一种有效的方法是将数据全部转移到一个新建的topic 中,然后把这个 topic 分成几十个 partition,每个 partition 安排一个消费者,这个消费者唯一的任务就是消费你这个 partition 的数据,这样三两下数据就被消费完了。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

财富池指标公式--通达信资金进场买入提示指标公式

1、“准备现金”信号出现,可开始关注该个股,等待合适价位介入,较为激进的投资者也可在此时介入,更稳健的做法是,等到“买入股票”信号出现后再介入。 2、“见顶清仓”信号出现,预示着即将见顶,是…

Matlab从入门到精通课程

教程介绍 MATLAB是美国MathWorks公司出品的商业数学软件,用于数据分析、无线通信、深度学习、图像处理与计算机视觉、信号处理、量化金融与风险管理、机器人,控制系统等领域。 学习地址 链接:https://pan.baidu.com/s/1PxGarBwQusMzwPVqcE…

【JavaScript】JavaScript 程序流程控制 ⑥ ( while 循环概念 | while 循环语法结构 )

文章目录 一、while 循环1、while 循环概念2、while 循环语法结构 二、while 循环 - 代码示例1、打印数字2、计算 1 - 10 之和 一、while 循环 1、while 循环概念 在 JavaScript 中 , while 循环 是一种 " 循环控制语句 " , 使用该语句就可以 重复执行一段代码块 , …

如何使用 ArcGIS Pro 制作三维建筑

三维地图已经逐渐成为未来地图的趋势,对于大范围应用,只需要普通的建筑体块就行,如果有高程数据,还可以结合地形进行显示,这里为大家介绍一下 ArcGIS Pro 制作三维建筑的方法,希望能对你有所帮助。 数据来…

Kimi是什么?免费Kimi chat介绍

1. Kimi是什么? Kimi是由月之暗面科技有限公司(Moonshot AI)开发的人工智能助手,专注于提供高质量的对话和信息处理服务。 月之暗面公司创立于2023年3月,创始团队核心成员参与了Google Gemini、Google Bard、盘古NLP、…

Java面试篇:Redis使用场景问题(缓存穿透,缓存击穿,缓存雪崩,双写一致性,Redis持久化,数据过期策略,数据淘汰策略)

目录 1.缓存穿透解决方案一:缓存空数据解决方案二:布隆过滤器 2.缓存击穿解决方案一:互斥锁解决方案二:设置当前key逻辑过期 3.缓存雪崩1.给不同的Key的TTL添加随机值2.利用Redis集群提高服务的可用性3.给缓存业务添加降级限流策略4.给业务添加多级缓存 4.双写一致性…

✮✮✮宁波CE认证,CE认证,CE产品检测✮✮✮

✮✮✮🌈宁波CE认证,🌈CE认证,🌈CE产品检测🌈✮✮✮ ❀热点:😘CE认证什么意思 ❀优势:😜CE认证的目的 ✎🍒CE认证定义和目的 ✎🍐CE认…

李宏毅深度强化学习导论——演员-评论员

引言 本文主要介绍演员-评论员(Actor-Critic)算法。 Critic 给定Actor θ \theta θ,Critic评估当观测到 s s s(或进一步地采取行动 a a a)的好坏。 价值函数(Value function),记为 V θ ( s ) V^\theta(s) Vθ(s),就是一种Critic。 它的…

蓝桥杯刷题(十四)

1.小平方 代码 n int(input()) count0 def f(x)->bool: # 判断条件return True if x**2%n<n/2 else False for i in range(1,n): # 遍历[1,n-1]&#xff0c;符合题意计数加一if f(i):count1 print(count)2.3的倍数 代码 a int(input()) b int(input()) c int(input…

【python】flask各种版本的项目,终端命令运行方式的实现

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Java:ArrayList与顺序表

一、线性表 线性表是n个具有相同特征的数据元素的有限序列&#xff0c;它是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表有&#xff1a;顺序表、链表、栈、队列...... 如图&#xff1a;顺序表与链表的区别看了标题的伙伴就应该知道&#xff0c;我们这次要讲解的主…

【浏览器渲染-输入Url到页面渲染全流程】

概述 在面试题中有一道经典面试题就是浏览器输入url之后发送了什么&#xff0c;看了下网上的大多数文章都感觉不太全&#xff0c;所以这里梳理了比较全的流程&#xff0c;如果有误&#xff0c;欢迎评论指正。本文大致是从以下内容概览入手&#xff0c;有需要的可以跳转到感兴趣…

初识C++(三)构造函数和析构函数

目录 一、构造函数&#xff1a; 1.构造函数的概念&#xff1a; 2.构造函数的特性&#xff1a; 3.构造函数的形式&#xff1a; 4.为什么要引出构造函数这一概念 5.默认构造函数包括&#xff1a; 6.对默认生成的构造函数不处理内置类型的成员这事的解决办法&#xff1a; …

docker可视化界面 - portainer安装

目录 一、官方安装说明 二、安装portainer 2.1拉取镜像 2.2运行portainer容器 2.3登录和使用portainer 一、官方安装说明&#xff1a; Install PortainerChoose to install Portainer Business Edition or Portainer Community Edition.https://www.portainer.io/install…

stm32待机模式被意外唤醒之原因分析

1. 故障现象 客户在项目中使用 STM32G0B1, 由产品内置电池供电. 客户在程序中有使用到 standby 模式, 通过 WKUP2(PC13), WKUP6 引脚唤醒. 除此之外并没有其它唤醒源. 代码中有使用到 RTC,但只是用来记录日期和时间, 并没有参与 standby 的唤醒. 有两种故障现象 : 第一种 : …

Typora结合PicGo + Github搭建个人图床

目录 一 、GitHub仓库设置 1、新建仓库 2、创建Token 并复制保存 二、PicGo客户端配置 1、下载 & 安装 2、配置图床 三、Typora配置 一 、GitHub仓库设置 1、新建仓库 点击主页右上角的 号创建 New repository 填写仓库信息 2、创建Token 并复制保存 点击右上角…

【Unity人机交互】人工智能之爬虫开章

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;Uni…

如何在内网访问其他电脑?

网络的发展使得人与人之间的通信变得更加便捷&#xff0c;而在公司或者家庭中&#xff0c;也经常遇到需要内网访问其他电脑的需求。内网访问其他电脑可以实现在局域网内部进行数据共享、文件传输、远程控制等操作&#xff0c;提高工作效率和便利性。本文将介绍内网访问其他电脑…

(已解决)vue运行时出现Moudle Bulid error: this.getoptios is not a function at........

1.首先查看你的less-loader版本 点击package.json 即可查看less-loader版本&#xff0c;我之前的版本是12.0&#xff0c;太高了&#xff0c;出现了不兼容的问题 2、卸载less-loader ctrlshift~ 打开项目终端 &#xff0c;输入&#xff1a; npm uninstall less-loader 3.重…

浙江省某市监局 API 敏感数据保护与全链路数据安全管控实践

背景 随着政务服务数字化转型的加速&#xff0c;政府信息化建设、大数据分析应用以及智慧监管建设等现代化、智能化转型持续推进&#xff0c;新的数据安全风险也暗藏其中。为加强公共数据安全体系建设&#xff0c;提升数据安全主动防御能力、监测预警能力、应急处置能力、协同…