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

目录

消息存储

消息存储方式

非持久化

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 原理:消息存储、高可用、消息重试、消息幂等性

数据库

  • 实现:ActiveMQ
  • 缺点:数据库瓶颈将成为 MQ 瓶颈

文件系统

  • 实现:RocketMQ/Kafka/RabbitMQ
  • 解决方案:采用消息刷盘机制进行数据存储
  • 缺点:硬盘损坏的问题无法避免

消息存储与读写方式

SSD(Solid State Disk):固态硬盘

  • 随机写(100 KB/s)
  • 顺序写(600 M B/s):1秒1部电影

Linux 系统发送数据的方式

  • “零拷贝”技术数据传输由传统的 4 次复制简化成 3 次复制,减少 1 次复制过程Java 语言中使用 MappedByteBuffer 类实现了该技术要求:预留存储空间,用于保存数据(1G 存储空间起步)
RocketMQ 原理:消息存储、高可用、消息重试、消息幂等性

消息存储结构

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

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

  • 消息数据存储区域topicqueueIdmessage
  • 消费逻辑队列minOffsetmaxOffsetconsumerOffset
  • 索引key 索引创建时间索引……

刷盘机制

同步刷盘

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

  • 无状态 + 全服务器注册

消息服务器

  • 主从架构(2M-2S)

消息生产

  • 生产者将相同的 topic 绑定到多个 group 组,保证即使 broker master 挂掉,其他 master 仍可正常进行消息接收。

消息消费

  • RocketMQ 自身会根据 broker master 的压力确认是否由 master 承担消息读取的功能,当 master 繁忙时候,自动切换由 slave 承担数据读取的工作。

主从复制

同步复制:

  • master 接到消息后,先复制到 slave,然后反馈给生产者写操作成功
  • 优点:数据安全,不丢数据,出现故障容易恢复
  • 缺点:影响数据吞吐量,整体性能低

异步复制:

  • master 接到消息后,立即返回给生产者写操作成功,当消息达到一定量后再异步复制到slave
  • 优点:数据吞吐量大,操作延迟低,性能高
  • 缺点:数据不安全,会出现数据丢失的现象,一旦 master 出现故障,从上次数据同步到故障时间的数据将丢失

配置方式:

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

负载均衡

Producer 负载均衡:

  • 内部实现了不同 broker 集群中对同一 topic 对应消息队列的负载均衡

Consumer 两种负载均衡策略:

  • 平均分配
  • 循环平均分配

消息重试

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

两种消息重试机制:

  • 顺序消息重试
  • 无序消息重试

顺序消息重试

  • 当消费者消费消息失败后,RocketMQ 会自动进行消息重试(每次间隔时间为 1 秒)。
  • 注意:应用会出现消息消费被阻塞的情况,因此,要对顺序消息的消费情况进行监控,避免阻塞现象的发生。
RocketMQ 原理:消息存储、高可用、消息重试、消息幂等性

无序消息重试

  • 无序消息包括普通消息、定时消息、延时消息、事务消息。
  • 无序消息重试仅适用于负载均衡(集群)模型下的消息消费,不适用于广播模式下的消息消费。
  • 为保障无序消息的消费,MQ 设定了合理的消息重试间隔时长。
RocketMQ 原理:消息存储、高可用、消息重试、消息幂等性

死信队列

概念:

  • 当消息消费重试到达了指定次数(默认 16 次)后,MQ 将无法被正常消费的消息称为死信消息(Dead-Letter Message)。
  • 死信消息不会被直接抛弃,而是保存到了一个全新的队列中,该队列称为死信队列(Dead-Letter Queue)。

死信队列的特征:

  • 归属某一个组(Gourp Id),而不归属 Topic,也不归属消费者。
  • 一个死信队列中可以包含同一个组下的多个 Topic 中的死信消息。
  • 死信队列不会进行默认初始化,当第一个死信出现后,此队列首次初始化。

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

  • 不会被再次重复消费。
  • 死信队列中的消息有效期为 3 天,达到时限后将被清除。

死信处理:

  • 在监控平台中,通过查找死信,获取死信的 messageId,然后通过 id 对死信进行精准消费。

消息幂等

消息重复消费

消息重复消费原因:

  • 生产者发送了重复的消息网络闪断生产者宕机
  • 消息服务器投递了重复的消息网络闪断
  • 动态的负载均衡过程网络闪断/抖动broker重启订阅方应用重启(消费者)客户端扩容客户端缩容
RocketMQ 原理:消息存储、高可用、消息重试、消息幂等性

消息幂等

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

解决方案:

  1. 使用业务 id 作为消息的 key 。
  2. 在消费消息时,客户端对 key 做判定,未使用过放行,使用过抛弃。
  • 注意:messageId 由 RocketMQ 产生,messageId 并不具有唯一性,不能作用幂等判定条件。

常见的幂等方法示例:

  • 新增(不幂等):insert into order values(……)
  • 查询(幂等)
  • 删除(幂等):delete from 表 where id=1
  • 修改(不幂等):update account set balance = balance+100 where no=1
  • 修改(幂等):update account set balance = 100 where no=1
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容