RocketMQ(九):消息发送(续)
匠心零度 转载请注明原创出处,谢谢!
RocketMQ网络部署图
- NameServer:在系统中是做命名服务,更新和发现 broker服务。
- Broker-Master:broker 消息主机服务器。
- Broker-Slave: broker 消息从机服务器。
- Producer: 消息生产者。
- Consumer: 消息消费者。
说明: rocketmq系列都将会以rocketmq-4.1.0-incubating进行介绍。
在阅读源码时做了一定的注释,公众号【匠心零度】回复:rocketmq,可获得基于rocketmq4.1.0加详细中文代码注释 。欢迎大家 star、fork !
上篇RocketMQ(八):消息发送主要分析了下一般发送流程,本篇将会介绍下定时发送,顺序发送,批量发送等情况 。
消息发送概述
上面的图大概就是producer发送message到broker的核心逻辑了。
备注:本篇将会介绍下定时发送,顺序发送,批量发送情况 ,这些情况说明都是站在producer角度进行说明,涉及到broker的内容会在分析broker相关内容的时候进行分析。
定时发送
何为定时消息
Producer 将消息发送到 MQ 服务端,但并不期望这条消息立马投递,而是延迟一定时间后才投递到 Consumer 进行消费。
调用形式
与普通的调用发送基本没有什么区别,唯一就是多了一个消息设置setDelayTimeLevel即可。代码调用如图:
那么这里的级别应该填写什么呢?对应什么呢?--->这块后续会分析,今天这里简单说明下:
其他的就和普通发送没有任何区别了,关键处理在broker,后续分析。
顺序发送
何为顺序发送
参考:https://help.aliyun.com/document_detail/49319.html?spm=a2c4g.11186623.2.3.21aKRd
调用形式
我们来看看具体内容实现调用就明白怎么回事了:
获取到所有可发送的信息
发送内容
用来区分(比如订单号,这一类的订单号是有顺序的,但是和其他订单号可以无序)
sendResult = producer.send(msg, new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
Integer id = (Integer) arg;
int index = id % mqs.size();
return mqs.get(index);
}
}, orderId);
这里mqs就是获取到所有可发送的信息,而orderId就是用来区分的,每次拿这个orderId和所有的进行取模(如果所有的没有变化的情况下面)那么一种都是固定的那个队列了(队列就是先进先出了),后续消费在分析消费如何处理这块。
备注:这里的顺序也是相对的,如果添加了broker或者broker减少了,那么取模的信息势必会不一致,所以需要明白下。
批量发送
何为批量发送
批量这个概念我相信大家一定都非常熟悉了,在很多调优的时候,比如数据库批量处理,有些请求进行合并发送等都是类似实现,那么rocketmq批量发送也是为了追求性能,特别在数量量级特别大的时候,批量效果就非常明显了。
备注:既然是批量就是等一批之后发送,那么实时性一定可能就稍微有点点延迟了(可以忽略,特别数据量多的情况)。我一般处理批量的就2个维度,达到一个就可以触发,1.达到给定条数 2.达到给定时间(比如3s一次,如果这个时候数据量还是不够也会进行发送)……
rocketmq只是提供接口,发送一批数据,那么何时发送这一批数据就是根据自己的选择,就是上面说的两条就是一般的做法:
- 达到给定条数 。
- 达到给定时间。
调用形式
rocketmq这里有一个好处,就是在批量发送的时候,会做一个简单的转换,减少网络传输,学习下:
把这些转化为a、b、c等形式。
我们来看看rocketmq给我们的批量发送的例子,为什么会给我们2个例子呢?需要思考!!!,下面我会来为大家讲解下:
备注: 批量发送需要相同的topic以及相同的waitStoreMsgOK 和不支持定时发送。
Messages of the same batch should have: same topic, same waitStoreMsgOK and no schedule support。
这种发送就是批量(这里的批量不是特别大),就自己发送走了。
这里的批量(批量的数据太多),所以进行分割之后发送了。最后调用的方法还是一样的。
我们知道目前rocketmq默认支持4M发送消息内容(不管是一条还是批量),假如需要调整也可以调整,那么会一直没有上限吗?还有很多人说调整了10M为什么没有生效(这里是需要Producer和服务端broker都调整才行,后续说明解释,还有由于是基于netty网络传输,可能你需要看看RocketMQ(二):RPC通讯,这里进行了说明)
这里决定了最大最大只能是16M,如果需要就需要修改了,一般也不建议修改,就和批量发送的第二个方式一样就行,进行拆开批量发送就是了。
如果读完觉得有收获的话,欢迎点赞、关注、加公众号【匠心零度】,查阅更多精彩历史!!!
加入知识星球,一起探讨!
RocketMQ(九):消息发送(续)的更多相关文章
- RocketMQ的消息发送及消费
RocketMQ消息支持的模式: 消息支持的模式分为三种:NormalProducer(普通同步),消息异步发送,OneWay. 消息同步发送: 普通消息的发送和接收在前面已经演示过了,在前面的案例中 ...
- rocketmq简单消息发送
有以下3种方式发送RocketMQ消息 可靠同步发送 reliable synchronous 可靠异步发送 reliable asynchronous 单向发送 one-way transmissi ...
- 基于Jmeter实现Rocketmq消息发送
在互联网企业技术架构中,MQ占据了越来越重要的地位.系统解耦.异步通信.削峰填谷.数据顺序保证等场景中,到处都能看到MQ的身影. 而测试工程师在工作中,也经常需要和mq打交道,比如构造测试数据,触发某 ...
- RocketMQ之九:RocketMQ消息发送流程解读
在讨论这个问题之前,我们先看一下Client的整体架构. Producer与Consumer类体系 从下图可以看出以下几点:(1)Producer与Consumer的共同逻辑,封装在MQClientI ...
- Kafka、RabbitMQ、RocketMQ消息中间件的对比 —— 消息发送性能-转自阿里中间件
引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,前段时间我们自家的产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注. ...
- RocketMQ源码 — 三、 Producer消息发送过程
Producer 消息发送 producer start producer启动过程如下图 public void start(final boolean startFactory) throws MQ ...
- RocketMQ源码 — 九、 RocketMQ延时消息
上一节消息重试里面提到了重试的消息可以被延时消费,其实除此之外,用户发送的消息也可以指定延时时间(更准确的说是延时等级),然后在指定延时时间之后投递消息,然后被consumer消费.阿里云的ons还支 ...
- 转 Kafka、RabbitMQ、RocketMQ等消息中间件的对比 —— 消息发送性能和优势
Kafka.RabbitMQ.RocketMQ等消息中间件的对比 —— 消息发送性能和优势 引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,前 ...
- Kafka、RabbitMQ、RocketMQ消息中间件的对比 —— 消息发送性能
引言 分布式系统中,我们广泛运用消息中间件进行系统间的数据交换,便于异步解耦.现在开源的消息中间件有很多,前段时间我们自家的产品 RocketMQ (MetaQ的内核) 也顺利开源,得到大家的关注. ...
随机推荐
- 利用 urandom 生成随机密码
cat /dev/urandom | LC_ALL=C tr -dc "[:alnum:]" | fold -w 16 |head -3 说明: fold -w 16 指定密 ...
- 威联通212P 在admin用户密码正确情况下仍然无法登录WEB页面解决办法
*登录 telnet 执行以下语句: [~] # cp /etc/default_config/passwd /mnt/HDA_ROOT/.config/passwd[~] # cp /etc/def ...
- React开发实时聊天招聘工具 -第二章
2-1 介绍React开发环境 npm install -g create-react-app xxx npm run eject 来配置webpack 2-2 ES6常用语法 其他 还有一些特性 ...
- Cocos2d-x--iOS平台lua加密成luac资源方法和Jsc文件<MAC平台开发试用--windows平台暂未研究>
首先要说.近期真的是太忙了.好久没写博客了,今天正好有空,就写一下近期在写游戏中的一些发现: 话说,基于Cocos2dx 引擎 + 脚本写游戏,至今的感触就是能够进行增量更新和即时编译 ...
- Android 经常使用的adb命令
1.安装APK(假设加 -r 參数,保留已设定数据.又一次安装filename.apk) adb install xxx.apk adb install -r xxx.apk 2.卸载APK(假设加 ...
- Excel显示当前日期
https://zhidao.baidu.com/question/431460329693825764.html 直接选中单元格,在公示栏输入=now()
- CSS Text
http://www.runoob.com/css/css-text.html 文本颜色 颜色属性被用来设置文字的颜色. 颜色是通过CSS最经常的指定: 十六进制值 - 如: #FF0000 一个RG ...
- 谈谈iframe的优缺点
iframe是一种框架,也是一种很常见的网页嵌入方式,零度今天给大家分析分析它的优缺点. iframe的优点: 1.iframe能够原封不动的把嵌入的网页展现出来. 2.如果有多个网页引用iframe ...
- mount---挂载文件系统
挂载概念 Linux中的根目录以外的文件要想被访问,需要将其“关联”到根目录下的某个目录来实现,这种关联操作就是“挂载”,这个目录就是“挂载点”,解除次关联关系的过程称之为“卸载”. 注意:“挂载点” ...
- python django的单元测试
# TestCase 基类的使用 django.test.TestCase # 测试依赖于数据库访问,创建或查询模型 unittest.TestCase #没有与数据库交互 避免刷新数据库的成本