HelloWord示例
名词
topic
topic中文意思话题,也就是代表该消息跟什么话题有关,相当于这种消息是什么类型的。
topic是生产者传递消息而消费者提取消息的类别。主题与生产者和消费者之间的关系非常松散。具体来说,一个主题可能有零个,一个或多个向其发送消息的生产者。相反,生产者可以发送不同主题的消息。从消费者的角度来看,一个主题可以由零个,一个或多个消费者组订阅。与此类似,消费者组可以订阅一个或多个主题,只要该组的实例保持其订阅一致即可。
group
能够使用同一个ConsumerGroup名字的消费者必须具有完全相同的订阅才能正确实现负载平衡。它是必需的
ProducerGroup在概念上聚合完全相同规则的所有Producer实例,这在涉及事务消息时尤为重要。
tags
Message构造器里面的可能需要传的参数
他代表了一个sub-topic, 为用户提供了额外的灵活性。使用tag,来自同一业务模块的不同的消息可能具有相同的主题和不同的标签。标签还可以简化RocketMQ提供的查询系统。
就是做了第二层分类
keys
Message构造器里面的可能需要传的参数
主要作用是用来查找消息
maven项目
pom.xml
1 |
|
code
1 | //生产消息 |
生产者的api
1 | DefaultMQProducer.class |
生产者的一些其他的api
1 | //这个有空了我会补全 |
批处理
1 | 官网原话: |
消费者API
1 |
|
消费者其他的api
1 |
|
关于tags
要注意同个一消费组,都订阅同一个topic,但是过滤tags的方式不同,此时消费者有可能会收不到消息
因为broker推送消息是按组来推送到其中的一个,但是被过滤了,这一个组就都不会再推送了,
重点:对于客户端的过滤,消费模式是集群模式,broker按组推送消息,一个组保证推送一次(并且只被该组的某一个Consumer消费), 只要该组关注了该消息的topic就会推送
验证
1 | Consumer tag-a |
关于sql
MessageSelector
1 | Producer |
进入虚拟机,
修改broker配置文件
1 | cd /opt/wyz/rocketmq-4.7.1-SNAPSHOT #rocket的安装路径 |
关于事务消息
分布式系统中的事务可以使用TCC(Try、Confirm、Cancel)、2pc来解决分布式系统中的消息原子性
RocketMQ 4.3+提供分布事务功能,通过 RocketMQ 事务消息能达到分布式事务的最终一致
RocketMQ实现方式
Half Message:预处理消息,当broker收到此类消息后,会存储到RMQ_SYS_TRANS_HALF_TOPIC的消息消费队列中
检查事务状态:Broker会开启一个定时任务,消费RMQ_SYS_TRANS_HALF_TOPIC队列中的消息,每次执行任务会向消息发送者确认事务执行状态(提交、回滚、未知),如果是未知,等待下一次回调。
超时:如果超过回查次数,默认回滚消息
TransactionListener
1 | //半事务消息还是一条消息,只不过该消息还不能被消费,由broker维护状态 |
测试
1 |
|
重试机制
producer
默认超时时间
1 | /** |
Consumer
消费超时,单位分钟
1 |
|
发送ack,消费失败
1 | RECONSUME_LATER |
broker投递
只有在消息模式为MessageModel.CLUSTERING集群模式时,Broker才会自动进行重试,广播消息不重试
重投使用messageDelayLevel
默认值
1 | messageDelayLevel 1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h |
总结:
我们使用rocketMQ,那我们就是客户,我们需要知道
怎么投消息,producer 一些列api,投消息很简单
broker怎么推送消息: 这个至关重要,不懂这个,编码会产生重复消费
MessageModel.CLUSTERING集群模式:
broker的推送消息,加入推送消息A,消息A的topic是a
(猜的)大概流程 去访问namesrv,把关注了a这个topic的consumer全部拿过来,所有的consumer按group分开,遍历每一个组 ,每个组用负载均衡的算法选择该组的一个consumer 进行推送
消息模式是广播就不用多说了
- 本文作者: 忘忧症
- 本文链接: https://NepenthesZGW.github.io/2020/06/17/framework/RocketMQ/RocketMQ简单使用/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!