谈谈消息队列

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

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

消息队列的优点

我们先从消息队列的优点讲起:解耦、异步、削峰。我们想想假如没有消息队列会怎么样?当生产者生产一条消息时,生产者会与消费者建立直接的联系,这会导致生产者和消费者进行强耦合。假如现在我想加一个消费者,那我不仅要写增加消费者的代码,还要对生产者的代码进行修改,这是很糟糕的。所以我们就引入消息队列,放在生产者和消费者中间,让生产者和消费者彻底解耦开来。从这个角度来理解,其实会发现消息队列和 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 的数据,这样三两下数据就被消费完了。

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

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

相关文章

Ubuntu系统设置静态固定IP保姆级教程

1、查看网络接口信息 ifconfig 首先需要确认要设置固定IP的网络接口。在大多数情况下,这通常是ens33 2、查看路由网关信息 route -n # 查看打印 路由表 网关地址 3、备份文件 为了防止防止出现意外问题。Ubuntu中的网络配置文件通常存储在/etc/netplan/目录下&…

微服务概述

微服务 概述1.单体架构2.分布式架构3.微服务的架构特征: 服务拆分和远程调用提供者与消费者 概述 1.单体架构 单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。 单体架构的优缺点如下: 优点: 架构…

RPA使用Native Messaging 协议实现浏览器自动化

RPA 即机器人流程自动化,是一种利用软件机器人或人工智能来自动化业务流程中规则性、重复性任务的技术。RPA 技术可以模拟和执行人类在计算机上的交互操作,从而实现自动化处理数据、处理交易、触发通知等任务。帮助企业或个人实现业务流程的自动化和优化…

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

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:Uni…

2015年认证杯SPSSPRO杯数学建模B题(第一阶段)替换式密码全过程文档及程序

2015年认证杯SPSSPRO杯数学建模 B题 替换式密码 原题再现: 历史上有许多密码的编制方法。较为简单的是替换式密码,也就是将文中出现的字符一对一地替换成其它的符号。对拼音文字而言,最简单的形式是单字母替换加密,也就是以每个…

金蝶云星空和管易云·奇门单据接口对接

金蝶云星空和管易云奇门单据接口对接 ​​ ​​ 对接源平台:管易云奇门 管易云是上海管易云计算软件有限公司旗下的专注提供电商企业管理软件服务的品牌,总部位于中国上海张江高科技产业园区。管易云旗下拥有管易云C-ERP、EC-OMS、EC-WMS、B2C/B2B/BBC/微商城开发…

速通数据结构第二站 顺序表

文章目录 速通数据结构与算法系列 1 速通数据结构与算法第一站 复杂度 http://t.csdnimg.cn/sxEGF 感谢佬们支持! 目录 系列文章目录 前言一、顺序表 0 结构体 1 接口声明 2 初始化和销毁 3 扩容函数 4 打印和判空 5 尾插 …

基于51单片机的拔河游戏Proteus仿真

地址:https://pan.baidu.com/s/18LMEo-_WYcoyTOkWYJ0NUg 提取码:1234 仿真图: 1)设计一个能进行拔河游戏的电路,通过按键控制游戏开始和复位。 2)电路使用9个发光二极管排成一行,中间的LED为拔…

ElasticSearch之数据建模

写在前面 本文看下es数据建模相关的内容。 1:什么是数据建模 数据建模是对真实数据的一种抽象,最终映射为计算机形式的表现。其包括如下三个阶段: 1:概念模型 2:逻辑模型 3:数据模型2:es数据…

python爬虫基础-----运算符(第三天)

🎈🎈作者主页: 喔的嘛呀🎈🎈 🎈🎈所属专栏:python爬虫学习🎈🎈 ✨✨谢谢大家捧场,祝屏幕前的小伙伴们每天都有好运相伴左右,一定要天天…

纹理压缩算法

一、什么是纹理压缩 我们知道游戏中对于3D物体表面细节的表现最重要的还是靠贴图来实现的,那么越是高分辨率越是真彩色的贴图自然表现力也是越强,但是同时带来的问题是所需占用的内存会成倍的上升,而节省内存这一点在目前的游戏中还是非常非…

实时通讯技术实现

实时通讯技术实现 前言 在CS架构中,经常会有实时通信的需求。客户端和服务端建立连接,服务端实时推送数据给客户端。本文介绍几种常见的实现方式,希望能给读者们一点点参考。 实时通讯的主要实现技术 长轮询(Long Polling) WebSocket 服务器发…

牛客周赛 Round 38(A,B,C,D,E,F,G)

比赛链接 官方讲解(不分P不分段直接两小时怼上来是坏文明 ) 这场的题很棒,思维有难度,考察的知识点广泛,有深度,很透彻。感觉学到了很多。建议补题。 A 小红的正整数自增 思路: 签到。 可以…

6.5 Batch Normalization

在训练神经网络时,往往需要标准化(normalization)输入数据,使得网络的训练更加快速和有效。 然而SGD(随机梯度下降)等学习算法会在训练中不断改变网络的参数,隐藏层的激活值的分布会因此发生变…

VTK对属性参数的设置,以及用vtkFieldData存储属性数据的方法

数据集的属性(属性数据)是与数据集结构相关联的。而数据集又是建立在点和单元的基础上,所以数据属性很自然地是与点和单元相关联。即每个点或每个单元都有与其对应的数据属性。 数据属性的值称为属性数据。属性数据一般设置为一些有实际意义的…

学生宿舍智能控电柜安装调试技术

学生宿舍智能控电柜安装调试石家庄光大远通电器有限公司宿舍控电限电管理系统是一种用于管理学生宿舍用电的智能系统,主要功能包括: 1.实时监控和控制:该系统能够实时监测和记录宿舍的用电情况,包括电器使用情况、电量消耗等。管理人员可以通过电脑或手机…

探索酷开科技独特魅力|加入酷开会员让观影之旅更畅快|酷开系统

你是否渴望一场震撼心灵的观影之旅?不妨走进酷开系统的世界,徜徉在剧集的海洋,满足无限观影的渴望!还在担心剧荒吗?还在为无聊的周末发愁吗酷开系统为你赶走无聊,它拥有海量的影视资源,4大片库、…

nginx详解(持续更新)

nginx定义 nginx安装 nginx目录 程序相关命令 服务相关命令 虚拟主机(server) 路由匹配(location) 代理(proxy_pass) 正向代理 反向代理 负载均衡(upstream) 负载均衡策略 动静分…

C++ 简单模拟实现 STL 中的 list 与 queue

目录 一,list 1, list 的节点与迭代器 2,list 的数据结构、一些简单的功能、构造函数 3,list 的对元素操作 4,C 11 的一些功能 5,完整代码: 二,queue 一,list std…

开源 OLAP 及其在不同场景下的需求

目录 一、开源 OLAP 综述 二、OLAP场景思考 2.1 面向客户的报表 2.2 面向经营的报表 2.3 末端运营分析 2.4 用户画像 2.5 订单分析 2.6 OLAP技术需求思考 三、开源数据湖/流式数仓解决方案 3.1 离线数仓体系——Lambda架构 3.2 实时数据湖解决方案 3.3 实时分析解决…