RocketMQ系列之pull(拉)消息模式(七)

Stella981
• 阅读 571

Eureka精品源码

Quartz系列全集

xxl-job系列

sharding-jdbc精品源码合集

构建sleuth+zipkin全链路监控系统(完结篇)

前言

在rocketMQ里面一般有两种获取消息的模式,一种是push, 一种是pull ,其实本质上都是pull ,只不过在于两者实现的机制不太一样,在之前的文章中介绍过push模式,此处不再做赘述。

pull消息模式呢,取消息的过程需要用户自己写,获取topic的消息队列,然后循环队列获取消息,上报offset, 直到最后取完了,换下一个队列,

官方demo

public static void main(String[] args) throws MQClientException {        DefaultMQPullConsumer consumer = new DefaultMQPullConsumer("please_rename_unique_group_name");        consumer.setNamesrvAddr("localhost:9876");        consumer.start();                // 获取消费者的队列        Set<MessageQueue> mqs = consumer.fetchMessageQueuesInBalance("TopicTest");        for (MessageQueue mq : mqs) {            System.out.printf("Consume from the queue: %s%n", mq);            SINGLE_MQ:            while (true) {                try {                    // 获取消息                    PullResult pullResult =                        consumer.pullBlockIfNotFound(mq, null, getMessageQueueOffset(mq), 32);                    System.out.printf("%s%n", pullResult);                      // 更新offset                    putMessageQueueOffset(mq, pullResult.getNextBeginOffset());                    switch (pullResult.getPullStatus()) {                        case FOUND:                            break;                        case NO_MATCHED_MSG:                            break;                        case NO_NEW_MSG:                            break SINGLE_MQ;                        case OFFSET_ILLEGAL:                            break;                        default:                            break;                    }                } catch (Exception e) {                    e.printStackTrace();                }            }        }        consumer.shutdown();    }

如果看过笔者之前写的一篇文章RocketMQ系列之push(推)消息模式(六) 应该就会很明显的感受到,pull模式下的消息就是用户自己写,自己拿topic的messageQueue的集合去broker里面拉取消息,而push模式下全部是rocketMq帮我们做好了

RocketMQ系列之pull(拉)消息模式(七)

image-20201107111124853

pull模式是获取当前consumer里面负载到的messageQueue, 然后循环拉取每个消息队列里面的消息内容,上报offset的进度,

RocketMQ系列之pull(拉)消息模式(七)

image-20201107111508985

push模式以每个messageQueue构建一个队列任务,后台线程异步的去拉取, 根据borker阻塞的时间可以实现长轮询和短轮询,

优缺点对比

在此对比一下push和pull两种模式的优缺点

push

优点:

1.push模式采用长轮询阻塞的方式获取消息,实时性非常高,用户体验好

2.rocketMq处理了获取消息的细节,使用起来比较简单方便

缺点:

1.当消费者能力远远低于生产者能力的时候,会产生一定的消费者消息堆积,消息堆积会占用消费者服务的资源,主要在于内存资源

解决方案:

rocketMq针对push模式提供了流量控制,有三种,单个队列消息数量(默认1000),单个队列内存中的大小(默认100M), 消息跨度(2000), 通过这三种控制,可以有效的控制消息对消费者的影响,各位可以根据自己项目的实际情况进行调整。

pull

优点:

1.想消费多少就消费多少,想怎么消费就怎么消费,哈哈,灵活性较大,不存在过多占用消费者资源的问题

缺点:

1.实时性很低

2.拉取消息的间隔不好设置,太短则borker压力大,太长则实时性很低。

在实际生产环境中,笔者一直使用的push消息模式,pull模式这里随手写下,不做重点描述啦!


欢迎关注我的微信公众号:【sharedCode】

RocketMQ系列之pull(拉)消息模式(七)

回复:“资源”、“架构”等关键词获取海量免费学习资料。

本文分享自微信公众号 - sharedCode(sharedCode)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Flutter高内聚组件怎么做?阿里闲鱼打造开源高效方案!
fish\_redux(https://www.oschina.net/action/GoToLink?urlhttps%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU4MDUxOTI5NA%3D%3D%26mid%3D2247484265%26idx%3D1%26sn%3Dab8aafada4a9e8e0ac43
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Stella981 Stella981
3年前
RocketMq系列之Producer普通消息发送(三)
往昔源码Eureka精品源码(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp.weixin.qq.com%2Fs%3F__biz%3DMzU2MTYyMDY1NA%3D%3D%26mid%3D2247483828%26idx%3D1%26sn%3Daf3ba8d12973
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这