匠心零度 转载请注明原创出处,谢谢!html
说明: rocketmq系列都将会以rocketmq-4.1.0-incubating进行介绍。数据库
在阅读源码时作了必定的注释,公众号【匠心零度】回复:rocketmq,可得到基于rocketmq4.1.0加详细中文代码注释 。欢迎你们 star、fork !服务器
上篇RocketMQ(八):消息发送主要分析了下通常发送流程,本篇将会介绍下定时发送,顺序发送,批量发送等状况 。网络
上面的图大概就是producer发送message到broker的核心逻辑了。并发
备注:本篇将会介绍下定时发送,顺序发送,批量发送状况 ,这些状况说明都是站在producer角度进行说明,涉及到broker的内容会在分析broker相关内容的时候进行分析。ide
Producer 将消息发送到 MQ 服务端,但并不指望这条消息立马投递,而是延迟必定时间后才投递到 Consumer 进行消费。性能
与普通的调用发送基本没有什么区别,惟一就是多了一个消息设置setDelayTimeLevel便可。代码调用如图:学习
那么这里的级别应该填写什么呢?对应什么呢?--->这块后续会分析,今天这里简单说明下:3d
其余的就和普通发送没有任何区别了,关键处理在broker,后续分析。netty
参考: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,若是须要就须要修改了,通常也不建议修改,就和批量发送的第二个方式同样就行,进行拆开批量发送就是了。
若是读完以为有收获的话,欢迎点赞、关注、加公众号【匠心零度】,查阅更多精彩历史!!!
加入知识星球,一块儿探讨!