32张图带你解决RocketMQ所有场景问题

一、RocketMQ的基本原理

「RocketMQ基本架构图如下」

image.png

从这个架构图上我们可以知道,RocketMQ有4块核心部分:

  • NameServer:管理Broker的信息,让使用MQ的系统感知到集群里面的broker

  • Broker:主从架构实现数据多副本存储和高可用

  • producer:生产者

  • consumer:消费者

二、NameServer

2.1 Broker信息注册到哪个NameServer?

每台broker机器需要向所有的NameServer机器上注册自己的信息,防止单台NameServer挂掉导致Broker信息不全,保证NameServer的集群高可用。

2.2 Broker信息怎么注册?

基于Netty的网络通信。

2.3 Broker挂了如何感知?

  • 「NameServer感知:30s心跳机制和120s故障感知机制」

image.png

broker会每隔30秒向NameServer发送一个的心跳 ,NameServer收到一个心跳会更新对应broker的最近一次心跳事件,然后NamServer会每隔十秒运行一个任务,去检查一下各个broker的最近一次心跳的时间,如果超过120s没有收到相应broker的心跳,则判定对应的broker已经挂掉。

三、Broker

3.1 Master-Slave模式

为了保证MQ的数据不丢失而且具备一定的高可用性,我们采用的是主从复制模式。

「RocketMQ自身的Master-Slave模式主采取的是Slave主动从Master拉取消息。」

3.2 究竟是如何从Master-Slave中进行读写呢?

image.png

  • 生产者在写入消息时,一般写入到Master

  • 消费者在拉取消息时,可能从Master拉取,也可能从Slave拉取,「根据Master的负载情况和Slave的同步情况,」 由Master给出建议

    • Master负载过高,建议下次从Slave获取消息

    • Slave未同步完全,建议下次从Master获取消息

3.3 Broker宕机分析

3.3.1 Slave宕机

对系统会存在一点影响,但是影响不大,只不过少了Slave Broker,「会导致所有的读写压力都集中在Master Broker上」

3.3.2 Master宕机:基于Dledger实现RocketMQ高可用自动切换

选举方式这里不做重点介绍。

image.png

四、生产者

4.1 MessageQueue是什么?

我们先看看Topic、Broker、Message之间的关系。

如图比如说一个TopicA有n条消息,然后一个TopicA中的n条数据分配放入给4个MessageQueue1-4。

image.png

「所以本质上来说就是一个数据分片机制,通过MessageQueue将一个Topic的数据拆分为很多数据分片,在每个Broker机器上都存储一些MessageQueue。通过这个方法可以实现分布式存储。」

4.2 生产者发送消息写入哪个MessageQueue?

image.png

因为从前面我们知道,生产者会跟NameServer通信获取相应Topic的路由数据,从而知道,「一个Topic有几个MessageQueue,哪些MessageQueue在哪台Broker机器上,通过对应的规则写入对应的MessageQueue。」

4.2.1 Master Broker故障分析

当MasterBroker宕机,此时SlaveBroker正在切换过程中,有一组Broker就没有Master可以写入。

此时我们可以打开Producer的「自动容错机制开关:sendLatencyFaultEnable」,比如说访问其中一个Broker发现网络延迟有1000ms还无法访问,我们会自动回避这个Broker一段时间,比如接下来3000ms内,就不会访问这个Broker。

过一段时间之后,MasterBroker修复好了,或者说SlaveBroker选举成功了,就可以提供给别人访问了。

image.png

4.3 Broker数据存储(核心环节)

「Broker数据存储实际上是MQ最核心的环节:」

  • 消息吞吐量

  • 消息不丢失

4.3.1 磁盘日志文件CommitLog

image.png

首先,Producer发送消息给Broker,「Broker接收到消息后,把这个消息直接顺序写入写入到磁盘上的一个日志文件,叫做CommitLog。」

  • CommitLog是由很多磁盘文件组成

  • 每个文件限定最多1GB

4.3.2 ConsumeQueue存储对应消息的偏移量

「在Broker中,每一个Topic下的每一个MessageQueue都会有对应一系列的ConsumeQueue文件。」

「Broker磁盘存储类似于文件树的形式存在:」

image.png

「ConsumeQueue中存储着对应MessageQueue中的消息在CommitLog中的物理偏移量地址offset。」

image.png

「如图:」

  1. Broker接受消息,顺序写入消息到CommitLog中

  2. 同时找到对应的TopicA/MessageQueue1/Cons

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Docker是一种流行的容器化技术,通过轻量级、隔离性强的容器来运行应用程序。下面我将通过十张图你深入理解Docker容器和镜像。 1. 第一张图展示了Docker容器和镜像的关系。镜像是Docker的基础组件,它是一个只读的模板,包含了运行应用程序所需的所有文件和配置。容器是从镜像创建的实例,它具有自己的文件系统、网络和进程空间。 2. 第二张图展示了Docker容器的隔离性。每个容器都有自己的文件系统,这意味着容器之间的文件互不干扰。此外,每个容器还有自己的网络和进程空间,使得容器之间的网络和进程相互隔离。 3. 第三张图展示了Docker镜像和容器的可移植性。镜像可以在不同的主机上运行,只需在目标主机上安装Docker引擎即可。容器也可以很容易地在不同的主机上迁移,只需将镜像传输到目标主机并在其上创建容器。 4. 第四张图展示了Docker容器的快速启动。由于Docker容器与主机共享操作系统内核,启动容器只需几秒钟的时间。这使得快速部署和扩展应用程序成为可能。 5. 第五张图展示了Docker容器的可重复性。通过使用Dockerfile定义镜像构建规则,可以确保每次构建的镜像都是相同的。这样,可以消除由于环境差异导致的应用程序运行问题。 6. 第六张图展示了Docker容器的资源隔离性。Docker引擎可以为每个容器分配一定数量的CPU、内存和磁盘空间,确保容器之间的资源不会互相干扰。 7. 第七张图展示了Docker容器的可扩展性。通过使用Docker Swarm或Kubernetes等容器编排工具,可以在多个主机上运行和管理大规模的容器群集。 8. 第八张图展示了Docker镜像的分层结构。镜像由多个只读层组成,每个层都包含一个或多个文件。这种分层结构使得镜像的存储和传输变得高效。 9. 第九张图展示了Docker容器的生命周期。容器可以通过创建、启动、停止和销毁等命令来管理。这使得容器的维护和管理变得简单。 10. 第十张图展示了Docker容器的应用场景。Docker容器广泛应用于开发、测试、部署和运维等领域。它可以提供一致的开发和运行环境,简化了应用程序的管理和交付过程。 通过这十张图,希望能让大家更深入地理解Docker容器和镜像的概念、特性和应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值