环境搭建我的文档里有,可参考,本文档更新中。。。。
创建springboot导入依赖
<dependency>
<groupId>org.apache.rocketmq</groupId>
<artifactId>rocketmq-client</artifactId>
<version>4.4.0</version>
</dependency>
发送消息(生产者)
发送同步消息
得到发送结果,通常发送重要消息使用,比方短信等
发送异步消息
异步有回调函数
发送单向消息
通过以下方法即可,没有返回值。
一般场景比方日志等。一般用的少,一般不用这种
produer.sendOneWay(message);
消费消息(消费者)
默认消费模式是负载均衡
消费者广播模式
每个消费者消费一样的消息
//广播模式,默认是负载均衡模式
consumer.setMessageModel(MessageModel.BROADCASTING);
负载均衡模式
所有消费者共同承担消息的处理
顺序消息
消费顺序和发送顺序一致
我们将消息发送给broker,但是broker不止一个队列。多个队列为了提高效率
broker内部有多个队列,消息进入哪一个队列。broker轮询放入消息
我们将一组消息放入一个队列,然后用一个线程去处理消息,保证局部消息顺序
通过订单标识id,选择队列。同一个订单发送到同一个队列
生产者
消费者
延时消息
延迟一段时间
级别,只能选择延迟多久
message.setDelayTimeLevel(3);
批量发送消息
直接发送消息集合即可
每次不能超过4M
如果超过需要进行消息分割
SendResult result = producer.send(messages);
过滤消息
消费者根据条件进行过滤
第一种根据tag进行过滤,通过||符号过滤
tag1 || tag2
第二种通过sql语法来过滤,但是感觉一般通过tag区分好就行了
发送
message.putUserProperty("i",String.valueOf(i));
接收
consumer.subscribe("OrderTopic", MessageSelector.bySql("i>5"));
事务消息
分布式事务一致性(最终一致性)
生产者进行事务提交,如果没有提交都是不能消费的
事务消息状态:提交状态,回滚状态,中间状态
异常如何处理
监听消息,进行数据回退
出现异常,捕获异常,在异常catch里面进行处理,发送失败消息到mq
将一些信息放入发送类中(订单id,用户id,金额,商品id,数量,等等一些信息)
如何保证消息幂等性
通常,消息id去保证,但是mq不报证id的唯一性
最好使用业务标识id,发送消息,设置key,消费方通过业务key判断是否被处理,把key保存到数据库,每次消费去查询,看是否这个消息被消费过,
还有就是保存到redis中
消息失败处理,默认重试16次后进入死信队列
消息重试几次,可以持久化到消息记录表,通过定时任务去跑这个消息记录表