首页 > 其他分享 >RocketMQ知识总结(基本原理)

RocketMQ知识总结(基本原理)

时间:2024-07-30 09:55:26浏览次数:17  
标签:总结 PULL 消费 基本原理 Broker 拉取 消息 RocketMQ 客户端

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

文章收录在网站:http://hardyfish.top/

在这里插入图片描述

基本原理

总体架构图

在这里插入图片描述

零拷贝

零拷贝技术是一个思想,指的是指计算机执行操作时,CPU不需要先将数据从某处内存复制到另一个特定区域。

  • RocketMQ内部使用基于mmap实现的零拷贝,用来读写文件。

mmap():

mmap(memory map)是一种内存映射文件的方法。

  • 即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。

简单地说就是内核缓冲区和应用缓冲区共享,从而减少了从读缓冲区到用户缓冲区的一次CPU拷贝。

消息存储

CommitLog:

CommitLog,消息存储文件,所有主题的消息都存储在 CommitLog 文件中。

业务系统向 RocketMQ 发送一条消息,最终这条消息会被持久化到CommitLog文件。

一台Broker服务器只有一个CommitLog文件(组),RocketMQ会将所有主题的消息存储在同一个文件中,这个文件中就存储着一条条Message,每条Message都会按照顺序写入。

在这里插入图片描述

ConsumeQueue:

它是为了高效检索主题消息的。

通过ConsumerQueue可以知道消息的长度和偏移量,那么查找消息就比较容易了。

消息偏移量的差值等于 = 消息长度 * 队列长度

Index:

除了通过消息偏移量来查找消息的方式,还提供了其他几种方式可以查询消息:

  • 通过Message Key查询
  • 通过Unique Key查询
  • 通过Message Id查询

Message Key和Unique Key都是在消息发送之前,由客户端生成的。

可以自己设置,也可以由客户端自动生成,Message Id是在Broker端存储消息的时候生成。

消费方式

在RocketMQ里消费方式虽有PUSH与PULL两种,但实现机制实为 PULL 模式,PUSH 模式是一种伪推送,是对 PULL 模式的封装,每拉去一批消息后,提交到消费端的线程池(异步),然后马上向 Broker 拉取消息,即实现类似 推 的效果。

在这里插入图片描述

拉取式消费(Pull Consumer):

Consumer消费的一种类型,应用通常主动调用Consumer的拉消息方法从Broker服务器拉消息、主动权由应用控制。

一旦获取了批量消息,应用就会启动消费过程。

  • Pull指的是客户端主动向服务端请求,拉取数据。

由消费者客户端主动向消息中间件(MQ消息服务器代理)拉取消息。

采用Pull方式,如何设置Pull消息的频率需要重点去考虑:

举个例子来说,可能1分钟内连续来了1000条消息,然后2小时内没有新消息产生(消息延迟与忙等待)。

如果每次Pull的时间间隔比较久,会增加消息的延迟,即消息到达消费者的时间加长,MQ中消息的堆积量变大。

若每次Pull的时间间隔较短,但是在一段时间内MQ中并没有任何消息可以消费,那么会产生很多无效的Pull请求的RPC开销,影响MQ整体的网络性能。

推动式消费(Push Consumer):

该模式下Broker收到数据后会主动推送给消费端,该消费模式一般实时性较高。

Push指的是客户端与服务端建立好网络长连接,当服务端有数据时立即通过连接将数据推送给客户端。

由消息中间件(MQ消息服务器代理)主动地将消息推送给消费者。

采用Push方式,可以尽可能实时地将消息发送给消费者进行消费。

但是,在消费者的处理消息的能力较弱的时候(比如,消费者端的业务系统处理一条消息的流程比较复杂,其中的调用链路比较多导致消费时间比较久:慢消费问题),而MQ不断地向消费者Push消息,消费者端的缓冲区可能会溢出,导致异常。

长轮询:

在PULL模式下为了保证消费的实时性,采起了长轮询消息服务器拉取消息的方式,每隔一定时间客户端向服务端发起一次请求。

如果有数据则取回进行消费,如果服务端没数据客户端线程会阻塞,阻塞时间为15S,有数据了就会被唤醒。

长轮询还是由Consumer发起的,因此就算Broker端有大量数据也不会主动推送给Consumer。

RocketMQ 中 PULL 模式和 PUSH 模式的区别:

PULL 模式是从 Broker 拉取消息后放入缓存,然后消费端不停地从缓存取出消息来执行客户端定义的处理逻辑,而 PUSH 模式是在死循环中不停的从 Broker 拉取消息,拉取到后调用回调函数进行处理,回调函数中调用客户端定义的处理逻辑。

  • 消费者订阅主题,然后自动进行集群内消息队列的动态负载,自动拉取消息,准实时。

PUSH 模式拉取消息依赖死循环来不停唤起业务,而 PULL 模式拉取消息是通过 MessageQueue 监听器来触发消息拉取线程,消息拉取线程会在拉取完一次后接着下一次拉取。

  • 消费者无需订阅主题,由业务方(应用程序)直接根据MessageQueue拉取消息。

标签:总结,PULL,消费,基本原理,Broker,拉取,消息,RocketMQ,客户端
From: https://blog.csdn.net/qq_35508033/article/details/140789167

相关文章

  • 经常使用的第三方类库总结
    1.概述在项目开发过程中,一般我们都会用到很多类库,比如spring,guava,hutool,apacheio/commons等等等等相关一堆类库。本文就来介绍一下常见的类库以及使用方式,以作备忘和学习。1.1为什么学习类库?1.1.1提高效率这是使用类库最重要的原因!使用别人写好的类库可以很大程......
  • 7.27号每周总结
    本周我的主要任务是制作上课用的课件,内容涵盖了数据结构、基础算法、数论以及进制转换等知识。此外,我还积极参加了多场算法比赛,排名和积分都有显著提升。首先,我在制作课件方面花了大量时间和精力。课件的内容包括以下几个方面:1.**数据结构**:-线性数据结构:数组、链表、栈和......
  • 7.20日每周总结
    本周我主要完成了Hadoop与IntelliJIDEA的集成,通过IDEA连接到虚拟机上的Hive,并通过前端页面插入数据到Hive中。这一过程涉及多个步骤和技术的应用。首先,我在虚拟机上安装并配置了Hadoop和Hive。确保Hadoop的分布式文件系统(HDFS)和YARN资源管理器正常运行。接下来,我配置了Hive,创建......
  • 2024年7.26-7.29学习总结/day29-32
    2024年7.26-7.29学习总结部署上线乐泡泡用户中心项目开坑伙伴匹配系统项目刷牛客刷leetcode部署上线​ 域名备案已申请,但是还没通过,让我周三再申请一次,难受。系统上线之后查询系统还有点bug不过别的功能基本上没有问题。这个项目很简单,就算是从0到1走通了全栈开发的一......
  • LLM并行训练7-混合并行总结
    概述根据前面的系列文章,对预训练大模型里用到的主要并行加速技术做了一系列拆分分析.但是在实际的训练里往往是多种并行混合训练.我们要怎么配置这些并行策略才能让训练框架尽可能的减少通信瓶颈,提升GPU计算利用率呢?这里的变量太多了,以最简单的3D并行为例:硬件层面有......
  • Pinely Round 4 (Div. 1 + Div. 2) 赛后总结
    PinelyRound4(Div.1+Div.2)赛时提交情况:CF1991A.MaximizetheLastElement赛时思路首先,CF判断了足足2min确定我是真人,看到题目时首先想到的是,最后保留的数字之前及之后必然有偶数个数字,且\(n\)为奇数,所以我们可以确定若\(a_i\)是最后保留的数字,\(i\)必然为奇......
  • STL用法总结(二)(deque,map,set)
    4.deque(双端队列)1.介绍首尾都可插入和删除的队列为双端队列#include<deque>//初始化定义deque<int>dq;2.方法函数代码含义q.push_back(x)/pusu_front(x)把x插入队尾/队首q.back()/front()返回队尾/队首元素q.pop_back()/pop_front()删除队尾/队首元素q.erase(ite......
  • 【前端 · 面试 】HTTP 总结(十一)—— HTTPS 概述
    最近我在做前端面试题总结系列,感兴趣的朋友可以添加关注,欢迎指正、交流。争取每个知识点能够多总结一些,至少要做到在面试时,针对每个知识点都可以侃起来,不至于哑火。HTTPS前言通过前面内容的学习,相信大家对HTTP的概念、特点、请求方法及缓存等的......
  • 基于Docker安装RocketMQ
    1、拉取RocketMQ镜像代码:dockerpullapache/rocketmq成功示例:Usingdefaulttag:latestlatest:Pullingfromapache/rocketmq2d473b07cdd5:Pullcomplete23700610a3bb:Pullcompleteb58ea7c35511:Pullcompletea5224a1908d3:Pullcompleteb4d9fb37957c:Pull......
  • 2024.7.25 模拟赛总结
    T1icanStatement:给定一个有\(n(1\len\le10^7)\)个元素的序列\(a(a_i\le10^9)\),求满足\(i<j\)且\(a_i<a_j\)的点对\((i,j)\)中\(j-i\)的最大值。Solution:考虑什么样的\(a_i\)可能作为点对中较靠左边的元素出现。显然对于一个\(k>i\)且\(a_k......