RocketMQ消息订阅有两种模式:

  1. 一种是Push模式,即MQServer主动向消费端推送;
  2. 另外一种是Pull模式,即消费端在需要时,主动到MQServer拉取。

但在具体实现时,Push和Pull模式都是采用消费端主动拉取的方式。

区别

  1. push方式里,consumer把轮询过程封装了,并注册MessageListener监听器,取到消息后,唤醒MessageListener的consumeMessage()来消费,对用户而言,感觉消息是被推送过来的。
  2. pull方式里,取消息的过程需要用户自己写,首先通过打算消费的Topic拿到MessageQueue的集合,遍历MessageQueue集合,然后针对每个MessageQueue批量取消息,一次取完后,记录该队列下一次要取的开始offset,直到取完了,再换另一个MessageQueue。

从下面这张简单的示意图也可以大致看出其中的差别,相当于是说,push的方式是:消息发送到broker后,如果是push,则broker会主动把消息推送给consumer即topic中,而pull的方式是:消息投递到broker后,消费端需要主动去broker上拉消息,即需要手动写代码实现

两种方式的优缺点对比:

  1. push:实时性高,但增加服务端负载,消费端能力不同,如果push的速度过快,消费端会出现很多问题
  2. pull:消费者从server端拉消息,主动权在消费端,可控性好,但是时间间隔不好设置,间隔太短,则空请求会多,浪费资源,间隔太长,则消息不能及时处理

消费端负载均衡

消费端会通过RebalanceService线程,10秒钟做一次基于topic下的所有队列负载:

  1. 遍历Consumer下的所有topic,然后根据topic订阅所有的消息
  2. 获取同一topic和Consumer Group下的所有Consumer
  3. 然后根据具体的分配策略来分配消费队列,分配的策略包含:平均分配、消费端配置等

消费端的负载均衡

如同上图所示:如果有 5 个队列,2 个 consumer,那么第一个 Consumer 消费 3 个队列,第二 consumer 消费 2 个队列。这里采用的就是平均分配策略,它类似于分页的过程,TOPIC下面的所有queue就是记录,Consumer的个数就相当于总的页数,那么每页有多少条记录,就类似于某个Consumer会消费哪些队列。

通过这样的策略来达到大体上的平均消费,这样的设计也可以很方面的水平扩展Consumer来提高消费能力。

消费端的Push模式是通过长轮询的模式来实现的,就如同下图:

Push模式示意图

Consumer端每隔一段时间主动向broker发送拉消息请求,broker在收到Pull请求后,如果有消息就立即返回数据,Consumer端收到返回的消息后,再回调消费者设置的Listener方法。如果broker在收到Pull请求时,消息队列里没有数据,broker端会阻塞请求直到有数据传递或超时才返回。

当然,Consumer端是通过一个线程将阻塞队列LinkedBlockingQueue中的PullRequest发送到broker拉取消息,以防止Consumer一致被阻塞。而Broker端,在接收到Consumer的PullRequest时,如果发现没有消息,就会把PullRequest扔到ConcurrentHashMap中缓存起来。broker在启动时,会启动一个线程不停的从ConcurrentHashMap取出PullRequest检查,直到有数据返回。

和push的区别_RocketMQ的消息订阅push和pull的区别相关推荐

  1. RocketMQ 消息订阅Subscribe—— Push Pull 模式

    2019独角兽企业重金招聘Python工程师标准>>> RocketMQ 消息订阅Subscribe-- Push & Pull 模式 RocketMQ消息订阅的两种模式 R ...

  2. Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)

    前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于SignalR Core的文章了. 先介绍一下SignalR吧,如下: ASP.NET S ...

  3. 如何订阅MQTT服务器历史消息,MQTT协议之消息订阅

    序 在MQTT协议中,最重要的就是发布/订阅,下面重点分析下消息订阅. SUBSCRIBE 一般来讲,客户端在成功建立TCP连接之后,发送CONNECT消息,在得到服务器端授权允许建立彼此连接的CON ...

  4. php artisan nohup,artisan命令生成和redis消息订阅和任务调度

    提示,本文章是针对5.3版本 执行命令生成一个artisan命令,文件会在1app/Console/Commands目录下 php artisan make:command Tcm --command ...

  5. Web技术(七):如何使用并实现MQTT 消息订阅-发布模型?

    文章目录 一.什么是发布-订阅消息模型? 二.订阅-发布消息模型有哪些应用? 2.1 应用于IP 物联网络中的消息传递 2.2 应用于操作系统进程间的消息传递 2.3 应用于MESH 自组网中的消息传 ...

  6. 微信平台 和服务器什么区别,微信公众平台是选择服务号还是订阅号?两者有什么区别?...

    作为微信营销和微信运营人员,必须对微信营销基础和微信营销的一些技巧都要有所了解;不然,新手将难以从微信入手开始微信营销之路.下面小编为大家介绍微信公众平台是选择服务号还是订阅号以及两者的区别,一起来看 ...

  7. 公众号、订阅号与服务号区别(微信5.0以上)

    微信5.0升级后分成了服务号和订阅号,分别是什么意思?区别是什么? 一.服务号.订阅号的介绍(区别) 微信公众平台现在已分成订阅公众号和服务公众号两种类型. 公众平台服务号,是公众平台的一种帐号类型, ...

  8. 嵌入式消息订阅发布模式软件框架

    文章目录 一.总体框架 二.基于RT-Thread的SoftBus 2.1 SoftBus的由来 2.2 消息订阅者模式 2.3 静态订阅关系与动态订阅关系 2.4 C/S模式 2.5 消息订阅者模式 ...

  9. 浅谈iOS和Android后台实时消息推送的原理和区别

    http://www.52im.net/thread-286-1-1.html 前言 iOS和Android上的实时消息推送差异很大,往小了说是技术实现的差异,往大了说是系统实现理念的不同.实时消息推 ...

最新文章

  1. 【转】每天一个linux命令(44):top命令
  2. 箭头函数中的this的使用
  3. AnkhSVN 1.0.2778 简体中文版发布
  4. 杭州内推 | 阿里巴巴达摩院自然语言基础研究组招聘研究型实习生
  5. socket编程中常见的概念问题!
  6. jQuery实现获取选中复选框的值
  7. TAPI 电话应用程序接口
  8. 远程连接server问题
  9. 流放之路材质过滤怎么设置_松下除湿机怎么样 松下除湿机款式有哪些型号【详解】...
  10. 服务器ios文件,ios 文件到服务器
  11. 《机器学习实战》学习笔记第七章 —— AdaBoost元算法
  12. 51nod 1286 三段子串(树状数组+拓展kmp)
  13. Codeforces Round #417 (Div. 2) B. Sagheer, the Hausmeister
  14. Hadoop数据读写原理
  15. SPSS中介效应与调节效应插件Process简介(1)
  16. extjs表格编辑、EditorGridPanel
  17. Dem地形数据转换为cass支持的dat格式教程
  18. Horizon8桌面虚拟化(一)
  19. php ajax 考试倒计时,基于Ajax技术实现考试倒计时并自动提交试卷
  20. linux下twm切换gn,检测快速用户切换Linux

热门文章

  1. Spring Cloud Netflix Zuul 1.0 简化说明
  2. 分布式应用中的一致性协议
  3. Portworx副总裁Eric Han接受InfoQ采访,介绍超融合容器市场的现状
  4. 玩转Docker镜像
  5. 聊聊数据权限哪些事儿
  6. visual studio installer 卸载时不能删除安装目录问题
  7. MySQL数据库学习笔记(二)----MySQL数据类型
  8. 一个C/S结构的优秀例子: 延迟补偿在C/S架构游戏协议设计和优化中的应用
  9. 转载-C#委托之多播委托( 二)
  10. pda连接电脑无法存取文件_手机无法连接电脑怎办