rocketmq源码-关于消费者push模式和pull模式的对比

news2025/1/16 2:55:51

在rocketmq中,对于消费者而言,有两种模式,push和pull

我在没有看源码之前,看其他博客的时候,大部分的说法是:

mq中有两种获取消息的模式,一种是push,一种是pull;pull这种模式是消费者自己去拉取消息,根据自己的消费能力去拉取;而push模式是mq接收到消息之后,会推送给consumer

去翻了下官网的文档,确实也是这么说的
rocketmq官方文档

在这里插入图片描述

但是这里要看怎么去理解,根据看源码,如果我们在源码层面上去看,不管是pull模式还是push模式,都是consumer自己去broker拉取消息的,并且从源码上也可以证明(我这里并没有说服务端和客户端,而是consumer和broker)

因为站在broke的角度去考虑,broker为什么需要关心consumer是pull模式还是push模式呢?按照网上大部分的说法,对于push模式是broker自己推送消息给consumer,如果这个推断成立,那broker设计我认为是有问题的,因为对于broker而言,我只是去存储消息的,我不关心你是push还是pull,我只需要提供接口,让client来查询消息就可以了,如果broker还需要关心consumer的模式,那系统就太耦合了;所以这个说法一定是不成立的(一定不是broker主动推送消息给consumer)

但是官方上说的是服务端和客户端,所以要看怎么理解服务端和客户端的概念:
如果我们认为client、broker、nameSrv这几个组件组成的mq是服务端,而业务系统是客户端,那这个说法确实也没有问题。因为对于push模式,如果作为业务系统来说,就是被动的,被mq调度的,当消息拉取到之后,会调用业务系统注册的messageListener方法,此时对于业务系统来说,主需要被动的等待被调用就可以了

但是,如果说服务端和客户端指的是nettyServer和nettyClient,那这个说法就不对了
如果有看过前面两篇拉取消息push和pull模式的博客,我们会发现,对于pull和push模式,大致的逻辑是这样的:
在这里插入图片描述

所以总结来看,如果站在业务系统和rocketmq的角度来看,push模式确实是mq主动把消息推送给业务系统的;pull模式是业务系统根据自己的消费能力,去拉取消息

但是实际上,我们把rocketmq这个框架,掰开,仔细去看的话,

对于consumer来说,有push和poll模式,
对于push模式,是client通过netty请求去broker拉取消息,拉取到消息之后,去回调业务上注册的messageListener方法执行,只是在回调注册的messageListener方法的时候,分为了顺序消费和并行消费,所谓的并行消费,就是同时有多个线程去处理消息,回调messageListener

对于pull模式,是通过netty请求去broker拉取消息,拉取到消息之后,将消息存入到了内存中的一个队列中,存入到队里中之后,立即发起下次请求;而消费者会调用queue.poll()方法,如果queue中没有消息,就返回空,当消息被写入到queue中之后,消费者会立即执行;对于pull模式来说,消息是堆积在了queue中,各个消费者按照自己的消费能力,去queue中消费消息

所以,对于官网上的这个说法,我们要明白什么是服务端什么是客户端

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

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

相关文章

技术人员必备的便携版卸载清理工具 - Uninstall Tool 3 便携版直接U盘中启动软件,专为单个用户在多台电脑上使用而设计的。

Uninstall Tool ,快速、强大的卸载清理软件,可完全彻底删除已安装软件。彻底删除不需要的应用程序,实时安装监视器。控制在系统启动时运行的应用。有效,强大的应用程序,具有简单而直观的界面。 删除不需要的软件&#…

马斯克都不懂的 GraphQL,API 网关又能对其如何理解?

作者,罗泽轩 上个月马斯克评论 Twitter App 滥用 RPC 后,与一些 Twitter 的技术主管发生了矛盾 —— 直言马斯克不懂技术。那这个马斯克都不懂的 GraphQL 到底是什么? 什么是 GraphQL?它有多流行? GraphQL 是一套由 F…

【javascript】值,类型,变量,函数,noi103题目,if语句,调试

❤️ Author: 老九 ☕️ 个人博客:老九的CSDN博客 🙏 个人名言:不可控之事 乐观面对 😍 系列专栏: 文章目录基本类型NumberStringboolean例子变量求二元一次方程函数1.3题目if例子1.4题目调试下面我们会随着…

SpringMVC:SpringMVC五种类型参数传递(4)

请求参数1. 环境准备2. 参数传递2.1 GET请求2.1.1 GET发送一个参数2.1.2 GET发送多个参数2.1.3 GET请求中文乱码2.2 POST请求2.2.1 POST发送一个参数2.2.2 POST发送多个参数2.2.3 POST请求中文乱码问题3. 五种类型参数传递3.1 普通参数3.2 POJO类型参数3.3 嵌套POJO类型参数3.4…

HashMap(二)扩容

想要了解HashMap的扩容机制你要有这两个问题 1、什么时候才需要扩容 2、HashMap的扩容是什么 1、什么时候才需要扩容 当HashMap中的元素个数超过数组大小(数组长度)* loadFactor(负载因子)时,就会进行数组扩容,loadFactor的默认值…

Pytest框架运行常用参数解析

-s:表示输出调试信息,用于显示测试函数中print()打印的信息。我们在用例中加上一句 print(driver.title),我们再运行一下我们的用例看看,调试信息输出-v:未加前只打印模块名,加v后--verbose打印类名、模块名…

Java中的八大包装类(Wrapper)

目录 一、八大包装类 1、八大包装类的体系图: 二、装箱和拆箱 三、intValue()和valueOf()方法 1、intValue() 2、valueOf() 四、包装类型和String类型的相互转换 五、包装类的常用方法(以Integer和Character为例) 一、八大包装类 包装…

Scala环境搭建

目录1)安装步骤2)测试3)IDEA安装Scala 插件1)安装步骤 1.首先确保 JDK1.8 安装成功 2.下载对应的 Scala 安装文件 scala-2.x.zip 3.解压 scala-2.12.11.zip,我这里解压到 F:\software 4.配置 Scala 的环境变量 …

使用Python和GDAL处理遥感影像数据超详细教程

提示:文章末尾有强化学习代码资源 : ) 前言 在本教程中,我们将学习使用 Python 和地理空间数据抽象库 GDAL 自动处理栅格数据的基本技术。 栅格文件通常用于存储地形模型和遥感数据及其衍生产品,例如植被指数和其他环境数据集。 栅格文件往往…

windows 连接蓝牙耳机失败 解决方法

windows 连接蓝牙耳机失败 解决方法 如果我们在windows7或windows10电脑中连接蓝牙却出现了连接失败的状况,这要怎么办呢,可能是我们没有打开电脑的蓝牙功能,这时我们点击打开蓝牙网络的属性,勾选Bluetooth设置的选项即可&#x…

安卓某通讯协议环境算法浅谈

所有的tlv组包都在 oicq.wlogin_sdk.tlv_type加密算法可以hook oicq.wlogin_sdk.tools Tlv144 是由5个tlv组成 然后用TGTkey进行 TEA加密 tlv_109 AndroidIDtlv_52d 系统内核信息tlv_124 平台网络信息tlv_128 手机设备信息tlv_16e 手机品牌TLV544 是设备id&#xff0…

MySQL-复合查询

文章目录复合查询基础查询多表查询自连接子查询单行子查询多行子查询多列子查询合并查询uion会自动去重union all就是不去重union all就是不去重复合查询 基础查询 查询工资高于500或者岗位为MANAGER的员工,同时名字首字母是J select * from emp where (sal>500…

ADI Blackfin DSP处理器-BF533的开发详解54:CVBS输出(含源码)

硬件准备 ADSP-EDU-BF533:BF533开发板 AD-HP530ICE:ADI DSP仿真器 软件准备 Visual DSP软件 硬件链接 CVBS OUT 视频输出 硬件实现原理 CVBS_OUT 子卡板连接在 ADSP-EDU-BF53x 开发板的扩展端口 PORT3 和 PORT4 上,板卡插入时&#xff0…

pytest + yaml 框架 -14.钉钉机器人通知测试结果

前言 当用例执行完成后,希望能给报告反馈,常见的报告反馈有:邮箱/钉钉群/飞书/企业微信 等。 pip 安装插件 pip install pytest-yaml-yoyo钉钉机器人通知测试结果功能在v1.1.1版本实现 钉钉机器人设置 钉钉机器人的设置请参考官方API文档…

实验2 VLAN的划分及VLAN间通信的配置

实验2 VLAN的划分及VLAN间通信的配置一、实验目的二、实验要求三、实验步骤,数据记录及处理四、实验总结一、实验目的 掌握VLAN的划分及VLAN间通信的配置方法 二、实验要求 交换机在没有划分虚拟网络时,都默认属于VLAN1,可以相互通信。通过…

【链表面试题】——剑指 Offer : 复杂链表(带随机指针)的复制

文章目录前言1.题目介绍2. 题目分析3. 思路讲解思路1思路2步骤1步骤2步骤34. 分析图及源码展示前言 这篇文章,我们一起来解决一道与链表相关的经典面试题:复杂链表(带随机指针)的复制。 1.题目介绍 我们先来一起了解一下这道题&…

Java的继承到底是怎么回事?看这篇让你明明白白

一. 引言 在学习面向对象后,我们就可以使用类来描述对象共有的特征(属性)和行为举止(方法),如果我们用类来描述猫、狗和企鹅,可以进行如下编码: public class Cat {private String name;//名字private int age;//年龄private St…

操作系统,计算机网络,数据库刷题笔记11

操作系统,计算机网络,数据库刷题笔记11 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql&#xf…

kubelet源码分析 syncLoopIteration(一) configCh

kubelet源码分析 syncLoopIteration syncLoopIteration里有四个chan管道。分别是configCh、plegCh、syncCh、housekeepingCh。这篇主要聊一下这四个管道的由来。 一、configCh configCh是通过list&watch的API SERVER获得的数据。然后在本地进行比对,推送到c…

Qt-Web混合开发-QtWebChannel实现Qt与Web通信交互-进阶功能(6)

Qt-Web混合开发-QtWebChannel实现Qt与Web通信交互-进阶功能🥬 文章目录Qt-Web混合开发-QtWebChannel实现Qt与Web通信交互-进阶功能🥬1、概述🌽2、实现效果🍆3、实现功能🍒4、关键代码🥝5、源代码&#x1f9…