深入浅出消息队列----【阶段总结篇】

news2024/9/17 7:46:38

深入浅出消息队列----【阶段总结篇】

  • 总览
    • nameSrv
    • Broker
    • producer(生产者)
    • consumer(消费者)
  • 串联起来

本文仅是文章笔记,整理了原文章中重要的知识点、记录了个人的看法
文章来源:编程导航-鱼皮【yes哥深入浅出消息队列专栏】

总览

nameSrv

它会保存 Topic 与 Broker 的关联信息,Broker 将自己的信息上报给 nameSrv。

生产者从 nameSrv 获得它要发送的 Topic 对应的 Broker 信息。

消费者从 nameSrv 获取它要消费的 Topic 对应的 Broker 信息。

nameSrv 虽然有集群的概念,但是集群内的 nameSrv 互不通信,他们都是独立的存在

生产者会随机跟一个 nameSrv 建连交互,每 30s 从 nameSrv 拉取最新的 Topic 相关数据。

消费者会随机跟一个 nameSrv 建连交互,每 30s 从 nameSrv 拉取最新的 Topic 相关数据。

Broker 需要跟集群里面所有的 nameSrv 建立交互,每 30s 上报自身信息给 nameSrv。

nameSrv 会维护 Broker 的信息,如果 Broker 下线了,会移除对应的 Broker 信息,这样生产者和消费者拉取 Topic 相关信息时就能感知到 Broker 下线了。

请添加图片描述

Broker

Broker 启动之后会跟 nameSrv 集群里面的每一台 nameSrv 建立连接,并且定时上报自己的信息给 nameSrv,包含自己的 IP 信息、Topic 信息等。

Broker 存储 Topic 消息,而 Topic 会分多个队列,如果有 Broker 集群,那么一个 Topic 的多个队列会分散在一个 Broker 集群的不同的 Broker 中。

比如 TopicA 有 4 个队列,那么此时 Broker 集群里,BrokerA 存 1、2 两个队列,BrokerB 存 3、4 两个队列。

请添加图片描述

Broker 会将不同的 Topic 消息都写入到同一个文件,即 commitlog 里,所有的消息追加写入到一个文件,这叫顺序写,根据磁盘的物理结构,顺序写的效率很高。

请添加图片描述

Broker 会有一个后台线程,一直将新加入的 commitlog 里面的消息,映射到 consumerQueue 中:

请添加图片描述

consumerQueue 对应的就是 Topic 队列的概念,消费者直接消费的对象也是 consumerQueue。

consumerQueue 里面存储的是消息在 commitlog 里面的起始物理地址、长度、taghash。

消费者消费的时候先找到对应的 consumerQueue,再根据 consumerQueue 里面的数据,找到 commitlog 得到对应的消息内容。

除了 commitlog 和 consumerQueue,broker 还有个 IndexFile,即消息的索引文件。

我们在发送消息时,可以给消息设置索引,这样方便我们通过 key 直接查询对应的消息:

请添加图片描述

producer(生产者)

producer 启动之后就会选择一台 nameSrv 进行建连,从 nameSrv 拉取自己想要发送的 Topic 对应的 Broker 信息。

紧接着跟 Broker 建立连接,后续发送消息直接跟 Broker 进行交互。

按照消息的类别可以分为 5 大;类,分别是

  • 普通消息
  • 顺序消息
    • 全局顺序
    • 局部顺序
  • 延迟消息
  • 批量消息
  • 事务消息

然后是发送消息的三种方式,分别是

  • 同步发送
  • 异步发送
  • 单向发送

consumer(消费者)

consumer 启动之后就会选择一台 nameSrv 进行建连,从 nameSrv 拉取自己想要消费的 Topic 对应的 Broker 信息。

跟 Broker 建立连接后,后续的消费消息就直接跟 Broker 进行交互。

消费者从 Broker 获取消息有两种方式:

  • Broker 推给 consumer
  • consumer 主动从 Broker 拉取

现在主流的消息队列都是采取拉的方式来实现消息的获取,因为推消息不容易把控消费者的消费情况,如果消费不过来还使劲推送消息,容易导致消费者直接挂掉。

当然朴素的拉消息也存在问题,比如拉取的不及时,或者忙拉取的情况,因此拉消息的时候都是基于长轮询拉取,即消费者向 Broker 发送拉取请求,如果当前有消息则立马返回,如果没有消息那么 Broker 会先 hold 住这个请求。

然后等着,如果此时有生产者发送消息过来,则立马响应这些消息给消费者。

如果没有消息则等待一定时间后返回消费者无消息的响应,然后消费者立马再次请求,如此循环往复。

对了,RocketMQ 虽然对应的消费者实现类有 pullConsumer、pushConsumer,但是底层都是用的拉模式,无非是封装的看着像推的罢了。

consumer 还有重平衡的操作来实现消费的负载均衡,consumer 消费某个 Topic 的消息,实际是去 Topic 下的某个队列去拉取消息。

而一个 Topic 往往会有多个队列,也同时会有一个消费组一起来消费这个 Topic 的消息,一个消费组往往由多个消费者组成。

请添加图片描述

消费组里面的消费者们会瓜分消费 Topic 的队列们,正常情况下瓜分结束后不需要有什么变动。

但是如果当前有消费者挂了,这时候需要重新瓜分下队列的归属,留存的消费者需要顶上挂了的消费者负责的队列,也就是需要重平衡。

请添加图片描述

当然,不仅仅是挂了之后要重平衡,新的消费者加入也会触发这个动作。

Broker 知晓新消费者上线后,会通知一个组的消费者进行重平衡,默认每个消费者 20s 也会主动进行一次重平衡。

这是属于客户端的负载均衡

重平衡后,每个消费者指定自己需要拉取哪个队列消息,构建对应的请求去 Broker 拉取即可。

然后还有个消费进度的概念。

由于集群模式下,Topic 下的UIlie是被消费组内的消费者瓜分的,如果发送老的消费者下线,或者新的消费者上线都需要重平衡,即每个 consumer 负责的队列会发生变化。

因此接手新队列的 consumer 需要知道老 consumer 对当前队列的消费进度,总不能发送重平衡后让 consumer 从这个队列的最早的一条消息开始消费吧?

所以集群模式下,消费进度需要保存在 Broker 中,这样重平衡之后 consumer 可以从 Broker 知晓消费进度。

消费进度的更新时 consumer 去 Broker 拉取请求时顺带将当前的消费进度带上给 Broker 的。

广播模式下,消费者之间没有互帮互助的关系,各管各的,所以消费进度仅保存在他们本地。

如果消费失败了怎么办?

consumer 会将消息发回给 Broker,消息的 Topic 为 %RETRY% + ConsumerGroupName,后续会重新消费这个消息。

如果一直消费失败,默认重试 16 次后,消息回进入死信队列,不会再进行重试。

串联起来

nameSrv 启动后,待命。

Broker 启动,将自身的信息包括 IP、端口、Topic 等上传给 nameSrv,等待 producer 发送消息,等待 consumer 消费消息。

producer 启动,连上 nameSrv,从它身上获取 Broker 信息,跟对应的 Broker 建立连接,建立连接后发送消息给 Broker。

Broker 将消息存储到 commitlog 文件中,并分发到 consumerQueue,等待 consumer 来消费拉取消息。

consumer 启动,连上 nameSrv,从它身上获取 Broker 信息,跟对应的 Broker 建立连接,建立连接后发送拉取请求给 Broker。

Broker 根据对应的 Topic、队列ID、消息点位,找到 consumerQueue 的消息,再解析找到对应 commitlog 得到消息内容,然后返回给 consumer。

consumer 消费消息,随后上报自己的消费进度给 Broker。

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

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

相关文章

小间距 LED 显示屏:引领显示技术新潮流

在现代显示技术领域,小间距LED显示屏以其先进的像素点控技术和卓越的显示效果,正逐渐成为市场的新宠。在此为您详细解析小间距LED显示屏相较于传统DLP背投显示屏的优势所在。 1、显示像素的完整性更高 在室内中高端显示市场中,DLP背投显示曾占…

PHP西陆招聘求职系统小程序源码

🔥【职场新宠】西陆招聘求职系统,你的职场加速器🚀 🎉【开篇安利:一站式求职新体验】🎉 还在为找工作焦头烂额吗?是时候告别传统招聘网站的繁琐与低效了!今天给大家种草一个超赞的…

1480. 找字典码最小的字符串

问题描述 编写程序,针对输入的 N 个不同的字符串,输出其中字典码最小的字符串。 输入 输入第一行给出正整数 N ; 随后 N 行,每行给出一个长度小于 80 的非空字符串,其中不会出现换行符,空格&#xff0c…

用Python打造精彩动画与视频.2.1 Python基础语法概述

2.1 Python基础语法概述 Python作为一门功能强大且易于学习的编程语言,其基础语法简单直观,非常适合初学者入门。这一节将带你了解Python的基本语法规则,为后续制作动画和视频打下坚实的基础。 1. 变量与数据类型 Python的变量不需要提前声…

【初阶数据结构篇】实现链式结构二叉树(二叉链)下篇

文章目录 实现链式结构二叉树(二叉链)下篇前言二叉树实现方法二叉树查找值为x的结点二叉树的销毁二叉树的层序遍历判断是否为完全二叉树 二叉树性质选择题二叉树遍历选择题 实现链式结构二叉树(二叉链)下篇 前言 接上一篇 实现链…

一文弄懂北斗RTK差分​高精度定位技术原理

北斗RTK差分定位技术是一种高精度定位技术,它的原理基于北斗卫星导航系统。北斗RTK差分定位技术需要三个接收器:基站接收器、移动接收器和校正接收器。基站接收器从北斗导航卫星系统接收信号,并将这些信号传输到校正接收器。移动接收器接收来…

【AI大模型】-- 应用部署

一、GPU价格参考 有些在京东就能买到:https://item.jd.com/10065826100148.html美国商务部限制 GPU 对华出口的算力不超过 4800 TOPS 和带宽不超过 600 GB/s,导致最强的 H100 和 A100 禁售。英伟达随后推出针对中国市场的 A800 和 H800。 H100 与 A100&…

打造重庆市数字化教育“新名片”,广阳湾珊瑚中学凭实力“出圈”!

分布于教学楼连廊顶部的智能照明设备,根据不同的时间和场景需求自动调节灯光亮度和开关状态;安装于各个教室内的智能黑板、学校同步时钟、学生互动设备,在极简以太全光网的赋能下,为师生提供丰富的教学体验与学习支持......行走于重庆市广阳湾珊瑚中学,像是与充满科技感的“校园…

开源数据结构存储系统Redis的内部数据结构详解(下)

目录 1、整数集合 1.1、整数集合的定义 1.2、升级 1.3、降级 2、压缩列表 2.1、压缩列表定义 2.2、压缩列表节点 2.3、压缩列表对象 3、总结 C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/de…

【大数据】虚拟机前置准备

前言: 我们了解了大数据Hadoop是分布式体系。 所以, 为了能确保正常部署好大数据的集群,我们需要做好提前的准备: 准备多台Linux虚拟机 准备基础的Linux操作环境(SSH免密、防火墙、JDK等) 配置多台Linux…

testRigor-基于人工智能驱动的无代码自动化测试平台

1、testRigor介绍 简单来说,testRigor是一款基于人工智能驱动的无代码自动化测试平台,它能够通过分析应用的行为模式,智能地生成测试用例,并自动执行这些测试,无需人工编写测试脚本。可以用于Web、移动、API和本机桌面…

MongoDB 基础知识

一、为什么学习MongoDB MongoDB解决Mysql 的“三高”问题: 1.对数据库高并发写入需求 2.对海量数据高效率存储访问需求 3.对数据库高扩展和高可用的需求 MongoDB 实际应用: 1.社交场景,比如朋友圈,附近的人的地点的存储 2.…

常用七大公司加密软件排行榜|2024年好用高效加密软件最新推荐

加密软件对于保护公司数据和确保信息安全至关重要。本文分享七款公司加密软件,每款软件的功能和优势都有所不同,可以根据企业的具体需求选择合适的解决方案。 1. 固信软件 功能: 固信软件提供全面的数据保护解决方案,透明加密、智…

Java开发者LLM实战——使用LangChain4j构建本地RAG系统

1、引言 由于目前比较火的chatGPT是预训练模型,而训练一个大模型是需要较长时间(参数越多学习时间越长,保守估计一般是几个月,不差钱的可以多用点GPU缩短这个时间),这就导致了它所学习的知识不会是最新的&…

Stable Diffusion参数 - 步数、采样方法、提示词引导系数

1 迭代步数 一张图片的生成它需要多次迭代才能达到我们想要的一个效果。 理论上迭代步数越高,那生成的最终的这个图片的效果就越好,它质量更高。 实际在应用的时候迭代步数达到20以上,它的效果在提升的就不是十分明显了,而更多的…

基于python的百度迁徙迁入、迁出数据分析(三)

百度迁徙定义 百度迁徙释义: 百度迁徙以用户常住地所在地市或停留超过一天的非常住地定义为出发城市,以用户离开出发城市,并在非出发城市停留超过4 h以上定义为到达城市。采用4h阈值,排除了城际出行中的途经地。 定义参考来源…

当年很流行,现在已经淘汰的Java技术,请不要学了!【建议收藏】

在Java技术的发展历程中,确实有一些曾经流行但现在已经被淘汰或不再推荐使用的技术。了解这些技术可以帮助你避免学习过时的知识,从而更高效地提升自己的技能。 以下是一些曾经流行但现在已经不太推荐学习的Java技术: 1. Servlet 2.x&#x…

日程管理多源归一,服务场景一键直达

时间对于每个人来说都是非常宝贵的,曾经我们使用台历、挂历来标记和查看重要日程,通过翻页来见证时光的流逝,随着信息化时代的不断发展,更加灵活简洁的电子日历成为主流,日历也从一个最简单的日期看板,慢慢…

RuntimeError: No CUDA GPUs are available

RuntimeError: No CUDA GPUs are available 目录 RuntimeError: No CUDA GPUs are available 【常见模块错误】 【解决方案】 解决步骤如下: 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科…

如何利用代理ip探索外国新闻视角?

引言 在日常的网络使用中我们常常会遇到诸多难题,让我们无法获取到想要的信息或服务,若访问速度很慢还会影响好的在线工作和娱乐体验。其次,随着网络安全问题的频发,个人隐私泄露成为了一个不容忽视的问题。这些痛点,…