当前位置: 首页 > news >正文

网站建立时间软件开发5个过程

网站建立时间,软件开发5个过程,项目建设表态发言稿,强化门户网站建设消息队列的推(Push)模式和拉(Pull)模式是两种核心的消息投递方式。现在有个疑问: 推模式下,消费者只需要从自己的内存缓存区取消息,响应速度不是更快吗?那为什么 Kafka、RocketMQ 这…

消息队列的推(Push)模式拉(Pull)模式是两种核心的消息投递方式。现在有个疑问:

  • 推模式下,消费者只需要从自己的内存缓存区取消息,响应速度不是更快吗?
  • 那为什么 Kafka、RocketMQ 这些高性能 MQ 都采用拉模式,而 RabbitMQ 却用推模式呢?

一、定义

  • 推模式(Push)
    Broker 主动把消息推送给消费者,消费者只需要处理并返回 ACK。

  • 拉模式(Pull)
    消费者主动从 Broker 拉取消息,决定什么时候拉、一次拉多少。


二、推模式的优缺点

优点

  1. 低延迟:消息一到,Broker 立即推送,消费者第一时间收到。
  2. 客户端逻辑简单:消费者只要处理消息,不需要主动拉取逻辑。

缺点

  1. 浪费性能:一条一条的推送,网络效率低,磁盘IO 频繁。
  2. 流控难:Broker 不知道消费者的处理能力,如果大量消息发过来,可能把消费者“压垮”。
  3. OOM 风险:消费者处理慢时,大量消息在消费者的缓冲区存着,本地内存缓存区可能爆掉。
  4. Broker 堆积:如果消费者消息在本地堆积,迟迟不 ACK,MQ也不能删掉消息,所以消息也会卡在 Broker。

👉 不过对于OOM,RabbitMQ 的解决方案是:

  • basic.qos(prefetch=N) 控制 Broker 最多同时推 N 条未 ACK 的消息,之后不让推了。

三、拉模式的优缺点

优点

  1. 天然流控:消费者有多大能力就拉多少,不会被淹死。
  2. 支持批量拉取:一次拉一批,提升磁盘 IO 和网络效率。
  3. 模型简单:消费者只需记住自己的 offset,从 Broker 顺序拉取。

缺点

  1. 看似延迟更高:需要主动拉,拉不到就白费性能。

👉 但 Kafka、RocketMQ 有解决方案,采用了 长轮询(Long Polling) 技术:

  • 没消息时,服务端挂起请求,不占 CPU;
  • 一旦有新消息,立即被唤醒,立刻返回;
  • 延迟几乎和推模式一样。
  • 如果长轮询的多了,用 IO多路复用,挂起大量 socket,内核帮你监控 socket 是否有事件(比如新消息写入)。

四、为什么 Kafka / RocketMQ 用拉模式?

  1. 流控更自然:消费者自己决定速率,避免被 Broker 压垮。
  2. 批量高吞吐:一次拉一批,磁盘顺序读 + 网络批量传输,效率极高。
  3. 存储模型适配:Kafka、RocketMQ 的消息是顺序日志(append-only log),消费者只需根据 offset 拉取。
  4. 多消费者组支持:不同组各自维护 offset,拉模式更简单。
  5. 延迟不输推模式:长轮询让拉模式几乎和推一样实时。

五、为什么 RabbitMQ 用推模式?

  1. AMQP 协议语义:RabbitMQ 遵循 AMQP,规定 Broker 负责“投递消息”。
  2. 定位不同:RabbitMQ 更偏向中小规模消息传递、低延迟场景(如金融、微服务通信)。
  3. 路由复杂性:RabbitMQ 的 Exchange、Binding、Routing Key 等路由规则,交由 Broker 统一处理后推送,比让消费者自己拉更合理。

六、对比总结

特性推模式(RabbitMQ)拉模式(Kafka/RocketMQ)
定位低延迟、复杂路由、中小规模通信高吞吐、日志流、大数据场景
延迟极低长轮询优化后 ≈ 推模式
流控需要额外机制(prefetch)天然支持,消费者自控
吞吐量单条为主,批量弱批量拉取,高吞吐
存储模型队列(需要 ACK 管理状态)顺序日志(消费者自己管理 offset)

七、结论

  • RabbitMQ 用推模式:因为它定位在 低延迟、强路由能力 的消息分发,消息量可控,推模式能更快送达。
  • Kafka/RocketMQ 用拉模式:因为它们面向 海量日志流和大数据处理,需要批量、高吞吐和强流控,拉模式天然适配。
http://www.dtcms.com/a/405929.html

相关文章:

  • 【微实验】激光测径系列(六)MATLAB 实现 CCD 图像像素与实际距离标定
  • 设计模式之代理模式-骆驼与巴巴羊的故事
  • Linux安全机制--系统层安全机制
  • 大模型之bert变种
  • 华为HCIE认证-“天花板”级考试的难度解析
  • 【网络协议】数字签名与证书
  • LinkedList模拟实现
  • 如何自己做淘宝网站网页设计策划
  • 神奇的位运算——力扣136.只出现一次的数字
  • 【征文计划】深度剖析 Rokid SLAM 算法:从传感器融合到空间重建的完整技术链路
  • Pygame中实现图像旋转效果-高级2-2
  • 高新苏州网站建设wordpress首页等待画面
  • 两学一做知识问答网站施工企业招标领导小组组长的职责
  • Spring AI:RAG函数调用
  • 基于Amazon S3设置AWS Transfer Family Web 应用程序
  • 稳石氢能出席AEM电解水学术与产业化论坛,大标方AEM制氢设备批量化生产荣获技术卓越奖。
  • 渲染 Python 中用 LaTeX 语法定义的数学公式 - 例子
  • 菊风金融智能双录:为金融业务合规与信任保驾护航
  • Debian安装PVE
  • 云计算实验2——CentOS中zookeeper的安装
  • 网络管理实验1:ASN.1软件应用
  • 前端开发用什么工具?前端开发工具推荐清单、实用对比与我的使用心得
  • 做亚马逊有什么网站可以借鉴大连城市建设档案馆官方网站
  • 协议不通,数据何通?耐达讯自动化Modbus TCP与Profibus网关技术破解建筑自动化最大瓶颈
  • 新零售模式下仓储变化与发展趋势
  • Stable Video Diffusion:将潜在视频扩散模型扩展到大规模数据集——论文阅读
  • [linux仓库]解剖ELF:从文件头到进程地址空间的完美映射
  • Lisp 与 C# 交互中,类型码(TypeCode)的映射关系
  • Java基础(十四):枚举类详解
  • python+springboot+uniapp基于微信小程序的任务打卡系统