RocketMQ应用:
springboot+zookeeper+dubbo+Rocketmq+mysql ,微服务架构
下单-》支付业务
springboot集成rocketmq
依赖:
org.apache.rocketmq
rocketmq-spring-boot-starter
2.0.3
Dubbo分布式系统:
保证多模块(分别请求不同服务器提供的服务),操作的事务原子性。(用RocketMQ监听机制实现)
Rocketmq高级特性
1持久化存储:
数据库存储:mysql
文件系统:
RocketMQ使用文件系统存储。
rocketmq使用顺序写,保证文件系统消息存储写速度。读使用 “零拷贝” 技术
MQ消息一般流程:
1消息生产者发送消息
2MQ收到消息,将消息进行持久化,在存储中新增一条记录
3返回ACK给生产者
4MQ push消息给对应的消费者,然后等待消费者返回ACK
5如果消息消费者在指定时间内成功返回ACK,那么MQ认为消息消费成功,
在存储中删除消息,即执行第6步;如果MQ在指定时间内没有收到ACK,
则认为消息消费失败,会尝试重新push消息,重复执行4,5,6步骤。
6 MQ删除消息。
RocketMQ持久化数据结构:
commitlog 消息持久化文件
consumequeue 消息持久化文件访问索引
index 消息持久化文件访问索引:依据时间区,和key查找数据。
RocketMQ持久化机制(数据持久化机制):
同步刷盘
异步刷盘
RocketMQ集群,没有选举机制。所有搭建集群时,需保证主节点有多个。
RocketMQ消费者,会优先从主节点消费数据,如遇特殊情况,有自动切换机制,从slave节点消费数据。
主从复制(主从节点数据备份机制):
同步复制,异步复制。
消费者负载均衡:
1 集群模式:每个消费者,依次轮询消费消息(每条消费不重复消息 )
2 广播模式:类似 发布/订阅模式。
消息重试机制
死信队列
消息消费幂等性:同一条消息多次消费,产生的结果是一样的。
出现重复消息时,处理方式:
因为Message ID有可能出现冲突(重复)的情况,所以真正安全的幂等处理,不建议以Message ID作为处理依据。
最好的方式是以业务唯一标识作为幂等处理的关键依据,而业务的唯一标识可以通过消息key进行设置:
Message message=new Message();
message.setKey(“唯一性ID”);
SendResult sendResult=producer.send(message);
订阅方收到消息时,可以依据消息的Key进行幂等处理:
consumer.subscribe(“ons_test”,"*",new MessageListener(){
public Action consume(Message message,ConsumeContext context){
String key=message.getKey();
//根据业务唯一标识的key做幂等处理
}
});