收藏Java大数据

RocketMQ 原理:消息存储、高可用、消息重试、消息幂等性

2022-01-19  本文已影响0人  Java弟中弟

目录

消息存储

消息存储方式

非持久化

RocketMQ 原理:消息存储、高可用、消息重试、消息幂等性
  1. 消息生成者发送消息到 MQ
  2. MQ 返回 ACK(Acknowledge Character)给生产者
  3. MQ push 消息给对应的消费者
  4. 消息消费者返回 ACK 给 MQ

持久化

RocketMQ 原理:消息存储、高可用、消息重试、消息幂等性
  1. 消息生成者发送消息到 MQ
  2. MQ 收到消息,将消息进行持久化,存储该消息
  3. MQ 返回 ACK 给生产者
  4. MQ push 消息给对应的消费者
  5. 消息消费者返回 ACK 给 MQ
  6. MQ 删除消息

注意:

①第 5 步 MQ 在指定时间内接到消息消费者返回 ACK,MQ 认定消息消费成功,执行 6 。

②第 5 步 MQ 在指定时间内未接到消息消费者返回 ACK,MQ 认定消息消费失败,重新执行 4、5、6 。

消息存储介质

RocketMQ 原理:消息存储、高可用、消息重试、消息幂等性

数据库

文件系统

消息存储与读写方式

SSD(Solid State Disk):固态硬盘

Linux 系统发送数据的方式

RocketMQ 原理:消息存储、高可用、消息重试、消息幂等性

消息存储结构

RocketMQ 原理:消息存储、高可用、消息重试、消息幂等性

如图所示,MQ 数据存储区域包含如下内容:

刷盘机制

同步刷盘

RocketMQ 原理:消息存储、高可用、消息重试、消息幂等性
  1. 生产者发送消息到 MQ,MQ 接到消息数据
  2. MQ 挂起生产者发送消息的线程
  3. MQ 将消息数据写入内存
  4. 内存数据写入硬盘
  5. 磁盘存储后返回 SUCCESS
  6. MQ 恢复挂起的生产者线程
  7. 发送 ACK 到生产者

异步刷盘

RocketMQ 原理:消息存储、高可用、消息重试、消息幂等性
  1. 生产者发送消息到 MQ,MQ 接到消息数据
  2. MQ 将消息数据写入内存
  3. 发送 ACK 到生产者

小结

# 刷盘方式
#- ASYNC_FLUSH 异步刷盘
#- SYNC_FLUSH 同步刷盘
flushDiskType=SYNC_FLUSH

高可用

高可用实现

nameserver

消息服务器

消息生产

消息消费

主从复制

同步复制:

异步复制:

配置方式:

#Broker 的角色
#- ASYNC_MASTER 异步复制Master
#- SYNC_MASTER 同步双写Master
#- SLAVE
brokerRole=SYNC_MASTER

负载均衡

Producer 负载均衡:

Consumer 两种负载均衡策略:

消息重试

当消息消费后未正常返回消费成功的信息将启动消息重试机制

两种消息重试机制:

顺序消息重试

RocketMQ 原理:消息存储、高可用、消息重试、消息幂等性

无序消息重试

RocketMQ 原理:消息存储、高可用、消息重试、消息幂等性

死信队列

概念:

死信队列的特征:

死信队列中的消息的特征:

死信处理:

消息幂等

消息重复消费

消息重复消费原因:

RocketMQ 原理:消息存储、高可用、消息重试、消息幂等性

消息幂等

对同一条消息,无论消费多少次,结果保持一致,称为消息幂等性。

解决方案:

  1. 使用业务 id 作为消息的 key 。
  2. 在消费消息时,客户端对 key 做判定,未使用过放行,使用过抛弃。

常见的幂等方法示例:

上一篇 下一篇

猜你喜欢

热点阅读