RocketMQ读书笔记2——生产者
【生产者的不同写入策略】
生产者向消息队列里写入数据,不同的业务需要生产者采用不同的写入策略:
同步发送、异步发送、延迟发送、发送事务消息等。
【DefaultMQProduce示例】
public class ProducerQuickStart {
public static void main(String[] args) throws MQClientException,InterruptedException {
/**1.设置Producer的GroupName**/
DefaultMQProducer producer = new DefaultMQProducer("GROUP_B");
/**2.设置Instance**/
producer.setInstanceName("instanceB");
/**3.设置发送失败的重试次数**/
producer.setRetryTimesWhenSendFailed();
/**4.设置NameServer的地址**/
producer.setNamesrvAddr("127.0.0.1:9876;127.0.0.2:9876");
/**5.启动Producer**/
producer.start();
for (int i = ; i < ; i++) {
try{
/**6.组装消息并发送**/
Message msg = new Message("TopicTest","TagA",
("Hello HigginCui:"+i).getBytes(RemotingHelper.DEFAULT_CHARSET));
producer.send(msg, new SendCallback() {
@Override
public void onSuccess(SendResult sendResult) {
System.out.println("sendResultStatus:" + sendResult.getSendStatus());
}
@Override
public void onException(Throwable e) {
e.printStackTrace();
}
});
}catch (Exception e){
e.printStackTrace();
Thread.sleep();
}
}
producer.shutdown();
}
}
[ 提示:设置Instance ]
当一个JVM需要启动多个Producer的时候,通过设置不同的InstanceName来区分,不设置的话系统使用默认名称“DEFAULT”。
[ 提示:设置发送失败的重试次数 ]
当网络出现异常的时候,这个次数影响消息的重复投递次数。想保证消息不丢失,可以设置多重试几次。
【消息发送的返回值】
FLUSH_DISK_TIMEOUT
刷盘超时(需要Broker设置为SYNC_FLUSH同步刷盘才会报这个错)
FLUSH_SLAVE_TIMEOUT
主从同步超时(在主备方式,且Broker设置为SYNC_MASTER情况下)
SLAVE_NOT_AVALIABLE
没有找到被设置成SLAVE的Broker。(在主备方式,且Broker设置成SYNC_MASTER的情况下)
SEND_OK
发送成功(需要结合所配置的 刷盘策略、主从策略来定)
【延迟消息】
RocketMQ支持延迟消息,Broker收到这类消息后,延迟一段时间再处理,使消息在规定的一段时间内生效。
延迟消息使用方法:
在创建Message对象时,调用setDelayTimeLevel(int level)方法设置延迟时间,然后再把这个新消息发送出去。
目前延迟消息不支持任意设置,仅支持预设值的时间长度(1s/5s/10s/30s/1m/2m/3m/4m/5m/6m/7m/8m/9m/10m/20m/30m/1h/2h)。如setDelayTimeLevel(3)表示延迟10s。
【自定义消息发送规则】
一个Topic下会有多个MessageQueue,如果使用Producer的默认配置,这个Producer会轮流向各个MessageQueue发送消息。Consumer消费的时候,会根据负载均衡策略,消费分配到的MessageQueue。不经过特定设置,某条消息发往哪个MessageQueue,被哪个Consumer消费都是未知的,
[ 如果把同一类型的消息发往相同的MessageQueue? ]
想把同一类型的消息发往相同的MessageQueue,可以用MessageQueueSelector。
代码示例:
public class OrderMessageQueueSelector implements MessageQueueSelector {
/**
* 根据订单的id值平均分配对应的MessageQueue
* @param mqs 消息队列
* @param msg 消息
* @param orderKey
* @return
*/
@Override
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object orderKey) {
int id = Integer.parseInt(orderKey.toString());
int idMainIndex = id/;
int size = mqs.size(); //MessageQueue的总数
int index= idMainIndex /size ;
return mqs.get(index); //返回选中的MessageQueue
}
}
在发送消息的时候,把MessageQueueSelector的对象作为参数,使用
MQProducer接口的自定义发送方法:
SendResult send(final Message msg, final MessageQueueSelector selector, final Object arg)
在MessageQueueSelector的实现中,根据传入的Object参数,或者根据Message消息内容确定把消息发往哪个MessageQueue,返回被选中的MessageQueue。
【事务消息】
RocketMQ的事务消息:发送消息事件和其他事件需要同时成功或失败。
如转账操作:A账户转账1W到B账户,A发送"B账户加1W"的消息,要和"A账户扣除1W"的这个操作同时成功或失败。
[ 关键词 ]
两阶段提交。
[ 大致流程 ]
RocketMQ采用两阶段提交的方式实现事务消息。
TransactionMQProducer处理流程如下:
1.先发一个"B账户增加1W"的待确认消息。
2.发送成功后做"A账户扣除1W"的操作
3.根据"A账户扣除1W"的操作成功与否,决定之前"B账户增加1W"的消息是commit还是rollback。
[ 具体流程 ]
1.Producer向MQ发送"B账户增加1W"的待确认消息。
2.RocketMQ将这个待确认消息持久化成功后,向Producer回复消息发送成功,此时第一阶段消息发送完成。
3.执行本地事件逻辑,即"A账户扣除1W"的操作。
4.Producer根据本地事件执行结果向RocketMQ发送二次确认(Commit或RollBack)消息:
如果收到Commit状态则将第一阶段的待确认消息标记为“可投递”,Consumer将收到该消息;
如果收到RocketBack状态则删除第一阶段的待确认消息,Consumer无法收到该消息。
5.若中途出现异常,步骤4提交的二次确认最终未到达RocketMQ,服务器在经过固定的时间会对“待确认”消息发起回查请求。
6.Producer收到回查请求后,通过检查本地对应消息的本地事件执行结果返回Commit或RockBack状态(如果发送第一阶段待确认消息的Producer不能工作,回查请求将被发送到和Producer在同一个Group里的其他Producer)。
【为什么RocketMQ4.x版本删除事务消息】
虽然上述的方案很好地实现了事务消息功能,也是RocketMQ之前的版本实现事务消息的逻辑,因为RocketMQ依赖将数据顺序写到磁盘的这个特征来提高性能,步骤4需要更改第一阶段待确认消息的状态,这样会导致磁盘Catch的脏页过多,降低了系统性能,所以RocketMQ在4.x版本将这部分功能去除了。
RocketMQ读书笔记2——生产者的更多相关文章
- RocketMQ读书笔记7——吞吐量优先的场景
[Broker端进行消息过滤] 在Broker端进行消息过滤,可以减少无效消息发送到Consumer,少占用网络宽带从而提高吞吐量. [过滤方式1——通过Tag过滤] [ 关于Tag和Key ] 对一 ...
- RocketMQ读书笔记6——可靠性优先的使用场景
[顺序消息] 顺序消费是指消息的产生顺序和消费顺序相同. 比如订单的生成.付款.发货,这三个消息必须按顺序处理才可以. [顺序消息的分类] 全局顺序消息和部分顺序消息. 上面订单的例子,其实是部分顺序 ...
- RocketMQ读书笔记5——消息队列的核心机制
[Broker简述] Broker是RocketMQ的核心,大部分“重量级”的工作都是由Broker完成的,包括: 1.接受Producer发过来的消息: 2.处理Consumer的消费信息请求: 3 ...
- RocketMQ读书笔记4——NameServer(MQ的协调者)
[NameServer简述] 对于一个消息队列集群来说,系统由很多机器组成,每个机器的角色.IP地址都不相同,而且这些信息是变动的(如在某些情况下,会有新的Producer或Consumer加入). ...
- RocketMQ读书笔记3——消费者
[不同类型的消费者] DefaultMQPushConsumer 由系统控制读取操作,收到消息后自动调用传入的处理方法来处理. DefaultMQPullConsumer 读取操作中的大部分功能由使用 ...
- RocketMQ读书笔记1——简述
[消息队列的功能介绍] 分布式消息队列可以提供应用解耦.流量削峰.消息分发.保证最终一致性.方便动态扩容等功能. [MQ使用场景1——应用解耦] 复杂的系统如电商系统,会存在多个子系统,如订单系统.库 ...
- how tomcat works 读书笔记四 tomcat的默认连接器
事实上在第三章,就已经有了连接器的样子了,只是那仅仅是一个学习工具,在这一章我们会開始分析tomcat4里面的默认连接器. 连接器 Tomcat连接器必须满足下面几个要求 1 实现org.apache ...
- <<操作系统精髓与设计原理>>读书笔记(一) 并发性:互斥与同步(1)
<<操作系统精髓与设计原理>>读书笔记(一) 并发性:互斥与同步 并发问题是所有问题的基础,也是操作系统设计的基础.并发包括很多设计问题,其中有进程间通信,资源共享与竞争,多个 ...
- 《Apache kafka实战》读书笔记-管理Kafka集群安全之ACL篇
<Apache kafka实战>读书笔记-管理Kafka集群安全之ACL篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想必大家能看到这篇博客的小伙伴,估计你对kaf ...
随机推荐
- JVM理解
在阅读本文之前,先向大家强烈推荐一下周志明的<深入理解Java虚拟机>这本书. 前些天面试了阿里的实习生,问到关于Dalvik虚拟机能不能执行class文件,我当时的回答是不能,但是它执行 ...
- 128th LeetCode Weekly Contest Pairs of Songs With Total Durations Divisible by 60
In a list of songs, the i-th song has a duration of time[i] seconds. Return the number of pairs of s ...
- CentOS&.NET Core初试-3-Nginx的安装和配置
系列目录 CentOS的安装和网卡的配置 安装.NET Core SDK和发布网站 Nginx的安装和配置 安装守护服务(Supervisor) Nginx简介 Nginx是一个免费的,开源的,高 ...
- element-ui多层嵌套表格数据删除
很多表格都要一个移除的功能,所谓移除,就是前端把表格的数据删除,普通的表格删除很简单,调用数据的删除方法就行.但是当表格是多层的嵌套类型时,就不能再使用普通的删除方法了.下面介绍一种自己在项目中用的方 ...
- 如何让一个div居于页面正中间
如何让一个div居于页面正中间 如何让一个div居于页面中间,我今天说的是让一个div水平居中同时垂直居中,而不是简单的top:50%,left:50%.当然,我们就按一开始的思路写一下:top,le ...
- APP的功能分类及打包与发布的分类方式
智能手机的出现改变了我们的生活,同时各种各样的APP充斥在我们的手机当中.那么我先现在在来熟悉一下APP的分类及其用途:工具类.社交类.信息类.娱乐类.生活类等几大类.我么了解了APP的用途分类,那么 ...
- MySQL限制查询结果返回的数量limit
1限制查询结果 [limit {[offset,] row_count | row_count offset}] row_count 起始行(第一行是0) offset 偏移量 输出几行记录
- 说说移动端web开发中的点击穿透问题
最近一直在忙于一个无线端的项目,由于之前主要工作都是在桌面端,移动端接触的比较少,所以中间遇到了很多的坑,做一个简单的记录. 问题背景 需求中有这样的一个功能,点击取件信息的时候会弹出一个地址列表的浮 ...
- 关于游标嵌套时@@FETCH_STATUS的值
游标嵌套使用时,@@FETCH_STATUS的值有时会从内部游标影响到外部的游标,使外部的游标只循环一次.这时要检查游标的使用方法.要先移动游标,然后就开始判断,为真进行进行业务逻辑处理,然后移动游标 ...
- pointer-events属性值详解
其实早知道这个属性,但是一直没有去研究过.今天正好在twitter看到这个词,就去研究了下,正好解决了目前遇到的一个小难题,所以分享下.嗯,其实这是个比较简单的CSS3属性. 在某个项目中,很多元素需 ...