首页 > 其他分享 >京东面试 rockmq是推消息还是拉消息?他的消息模型是啥?

京东面试 rockmq是推消息还是拉消息?他的消息模型是啥?

时间:2024-07-04 15:27:36浏览次数:18  
标签:请求 轮询 rockmq 模式 消息 服务器 京东 RocketMQ

在消息队列系统中,消费者模型(即消费者获取消息的方式)通常分为“拉”(pull)模式和“推”(push)模式。这两种模式在性能和实用性上有各自的优势和局限性,特别是在处理不同吞吐量和实时性需求的场景中。

RocketMQ的推拉模型
RocketMQ 本质上使用的是拉模式,但它通过长轮询等技术实现了类似推模式的效果,可以减少拉取的延迟,同时保持拉模式的控制优势。这种混合模型试图结合两种模式的优点,提供更灵活的消息消费能力,尤其是在面对不同的业务场景和性能需求时。

在这里插入图片描述

长轮询是一种在客户端和服务器通信中常用的技术,特别是在实时消息传递系统中。它是一种特殊的轮询方式,可以减少普通轮询带来的频繁网络请求的开销,同时提高消息传递的实时性。长轮询在 RocketMQ 中的使用使得其拉(pull)模式表现得更像推(push)模式,以下是如何理解这一点:

长轮询的工作原理

  1. 请求保持开放:在长轮询中,消费者发送一个请求到服务器要求获取消息。如果服务器当前没有可用消息,它不会立即返回空响应,而是将请求保持开放。

  2. 等待消息:服务器保持请求开放,并等待直到有消息可用或者达到某个预设的超时时间。这种等待状态减少了客户端需要发送的请求数量,同时也保证了当消息到达时能够快速传递。

  3. 发送响应:一旦有新消息到达或超时时间到达,服务器立即将消息发送给消费者,或者发送一个表示超时的响应。这样,消费者几乎可以实时地接收到消息。

  4. 重启请求:收到消息或超时响应后,消费者处理完消息然后再次发起新的长轮询请求,循环继续。

类似推模式的效果

长轮询使得 RocketMQ 的拉模式在行为上更接近于推模式,具体表现在:

  • 实时性提升:由于服务器在有消息时立即响应,消费者几乎可以实时地接收消息,这类似于推模式中消息的即时推送。
  • 降低资源消耗:传统的轮询可能需要消费者不断地发送请求以检查是否有新消息,这不仅增加了网络流量,也可能造成服务器处理大量无效请求的负担。长轮询通过减少请求的频率来优化这一点。
  • 提高效率:消费者不需要频繁地进行空请求,只在服务器实际有消息可供发送时才进行通信,这提高了网络和服务器资源的使用效率。

RocketMQ 网络通信协议

RocketMQ 的通信协议基于 Netty 实现,Netty 提供了高性能的网络框架支持,RocketMQ 在此基础上构建了自定义的应用层协议。

  1. 基于 TCP 的实现

    • RocketMQ 使用持久的 TCP 连接来管理客户端和服务器之间的通信,这有助于保持连接的活跃性并减少连接建立和断开的开销。
  2. 利用 Netty 的功能

    • RocketMQ 利用 Netty 提供的异步处理和事件驱动能力,实现了高效的消息编解码、请求响应匹配、心跳检测和数据传输。
  3. 自定义消息协议

    • 包括对消息的编码和解码,请求的类型定义,以及客户端和服务器之间的交互流程。
    • 特别关注于高效的数据传输和减少网络延迟。

总结

通过长轮询,RocketMQ 的拉模式有效地结合了拉模式的控制优势和推模式的实时响应优势。这种方法既保留了消费者按需获取消息的能力,又提高了消息传递的及时性和效率,适合于需要实时性但又想控制消息流的场景。这种技术使得 RocketMQ 在保持高性能的同时,也能适应各种不同的使用需求。

标签:请求,轮询,rockmq,模式,消息,服务器,京东,RocketMQ
From: https://blog.csdn.net/2301_80102608/article/details/140175533

相关文章

  • Log4Net配置详解及输出自定义消息类示例
    1.简单使用实例1.1添加log4net.dll的引用。  在NuGet程序包中搜索log4net并添加,此次我所用版本为2.0.17。如下图:1.2添加配置文件  右键项目,添加新建项,搜索选择应用程序配置文件,命名为log4net.config,步骤如下图:1.2.1log4net.config简单配置示例  下面是一个简单的......
  • 使用Redis实现消息队列:List、Pub/Sub和Stream的实践
    摘要Redis是一个高性能的键值存储系统,它的多种数据结构使其成为实现消息队列的理想选择。本文将探讨如何使用Redis的List、Pub/Sub和Stream数据结构来实现一个高效的消息队列系统。1.消息队列的基本概念消息队列是一种应用程序之间进行通信的机制,允许应用程序以异步的......
  • kafka消息积压处理办法
    首先分析一下它为什么会积压,无非是以下几种情况,写个思路代码中消费者处理消费效率低、kafka参数使用默认、消费者消费能力不足(生产者生产能力过盛)、网络带宽、服务器性能等1、代码质量问题(消费者处理逻辑复杂等)这个问题运维并不好直接验证,处理消费的速度慢,或者说处理的流程相对......
  • 电商案例1-京东搜索商品列表采集||电商大数据之京东关键词采集接口
    采集场景在京东搜索页https://search.jd.com/Search 输入搜索,搜出后得到的多个商品列表数据。采集字段商品名称、价格、评论数、店铺名称、店铺链接等字段。接口采集京东按关键字搜索商品API返回值说明item_search-按关键字搜索商品 jd.item_search公共参数......
  • 企业微信hook,自定义工具,收发消息
    协议版本示例:    企业微信协议开发,配置服务器开启服务端,接口开发企业微信协议接口开发,接收发送json数据即可;接口调用:http请求      接下来拿uuid去调用其他接口即可例:发送位置      请求方式POSTContentType:”application/jso......
  • 使用开源ntfy消息推送服务发布通知实现全平台接收通知
    说明:ntfy源代码:https://github.com/binwiederhier/ntfy.git官方未编译Windows版本,本人编译最新版本:(链接:https://pan.baidu.com/s/1pMsfqNb5FKHawTLUBTgjQA?pwd=f84u提取码:f84u)服务部署系统:WindowsServer2019或其他Windows系统简介ntfy是一个开源的消息通知服务,旨在简化消......
  • Redis Stream 作为消息队列的详尽笔记
    概述RedisStream是Redis5.0版本引入的数据结构,用于消息传递。基础概念结构:消息链表,每个消息有唯一ID和内容。命名:每个Stream有唯一名称,对应RedisKey。消费组(ConsumerGroup):可挂载多个消费组,需手动创建。每个组有游标last_delivered_id,记录消费进度。消费......
  • GGTalk 开源即时通讯系统源码剖析之:聊天消息防错漏机制
    继上篇《GGTalk开源即时通讯系统源码剖析之:客户端全局缓存及本地存储》GGTalk客户端的全局缓存以及客户端的本地持久化存储。接下来我们将介绍GGTalk的聊天消息防错漏机制。GGTalkV8.0 对消息的可靠性,即消息的不丢失和不重复做了一系列优化处理,以保证不会错漏消息。这篇文......
  • 京东商品详情数据接口(JD.item_get)
    京东(JD.COM)作为一个大型电商平台,提供了丰富的API接口供开发者使用,以便实现与京东平台的数据交互。然而,关于你提到的“京东商品详情数据接口(JD.item_get)”,这并不是京东官方直接提供的API接口名称。京东的开放平台(JDP)通常提供了一系列API,如商品查询、订单查询、物流查询等,但具体......
  • 五分钟了解MQ消息集成
    一、MQ消息集成的定义MQ消息集成是通过消息中间件(MessageQueue)实现的一种数据集成方式。它通过将数据发送到中间件中,再从中间件中接收数据,实现不同系统之间的数据交换。在MQ消息集成中,发送者和接收者之间不需要直接建立连接,而是通过消息中间件来实现数据传输。消息中间件......