高可用角度观察RabbitMQ、Kafka、RocketMQ各自的实现思路

2023-10-18 08:38

本文主要是介绍高可用角度观察RabbitMQ、Kafka、RocketMQ各自的实现思路,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文从高可用的角度观察一下 RabbitMQ、Kafka、RocketMQ,看看它们各自的实现思路。

1. RabbitMQ

RabbitMQ 有 3 种部署模式:

  • 单机模式
  • 普通集群模式
  • 镜像集群模式

单机模式与高可用完全没关系,咱就不说了,直接看看这2种集群模式。

1.1 普通集群模式

高可用角度观察RabbitMQ、Kafka、RocketMQ各自的实现思路

某一个 Queue 是在集群中的某一个 Broker 上,各个 Broker 会同步元数据,但不会同步 Queue 的消息数据。

如果某一个 Broker 故障了,其中的 Queue 便无法使用。如果消息没有配置消息持久化,则消息丢失。

可以看到,这种方式并没有实现高可用,只是扩展性比较好,扩充 Broker 可以容纳更多的 Queue,提高吞吐量。

1.2 镜像集群模式

高可用角度观察RabbitMQ、Kafka、RocketMQ各自的实现思路

一个 Broker 中 Queue 的元数据和消息数据都会同步到其他 Broker 上,就是做了全量备份,所以称为 “镜像模式”。

实现了高可用,如果一个 Broker 故障了,没关系,可以使用其他 Broker 继续工作,消息数据不会丢失。

可用性上去了,但扩展性没有了。

一个 Queue 的数据是全量存在 Broker 中的,所以 Queue 的消息容量、消息处理能力,都受限于 Broker。

普通集群模式 没有达到高可用,扩展性较好。

镜像集群模式 实现了高可用,但扩展性差。

2. Kafka

高可用角度观察RabbitMQ、Kafka、RocketMQ各自的实现思路

Kafka 把 Topic(主题/队列)分为了多个 Partition(分区),Topic 只是逻辑概念,Partition 才是实际的消息存储单元。

一个 Topic 的多个 Partition 分散在多个 Broker 中,每个 Partition 存放 Topic 的一部分数据。

有了 Partition 之后,Topic 就具有了极强的扩展性,可以指定 N 个 Partition。

高可用角度观察RabbitMQ、Kafka、RocketMQ各自的实现思路

可以为 Partition 指定多个“副本”,分散在不同的 Broker,从而实现其高可用。

当某个 Broker 故障的时候,其中存放的 Partition 不可用,但没有关系,可以使用其他 Broker 上的副本。

高可用角度观察RabbitMQ、Kafka、RocketMQ各自的实现思路

Partition 的多个副本分为两种角色,Leader 和 Follower。

Leader 是由 Kafka 选举出来的,负责处理消息的读写。Leader 收到新消息后,会同步给 Follower。

Follower 的作用是候选人,当 Leader 出事儿之后,Kafka 会从 Follower 中选举出新的 Leader。

可以配置消息写入完成的标准:

  • 写入 Leader 既可 -- 速度快,但可能会有消息丢失,例如在同步到 Follower 之前 Broker 故障了,则消息丢失。
  • Follower 同步完成之后才算写入成功 -- 消息可靠性极高,但影响写入速度。

3. RocketMQ

高可用角度观察RabbitMQ、Kafka、RocketMQ各自的实现思路

这是 RocketMQ 的官方结构图,左右是 Producer 和 Consumer,中间是 RocketMQ,分为两个部分:

  • NameServer 集群 -- 存放元数据
  • Broker 集群 -- 存放队列数据

这两部分都需要保证高可用。

高可用角度观察RabbitMQ、Kafka、RocketMQ各自的实现思路

NameServer 是独立运行的,保存着集群完整的集群元数据,例如路由信息、Broker信息、数据信息。

为了保证其高可用,可以运行多个 NameServer,之间完整的同步数据即可。

这样只要有一个 NameServer 是可用的,就不会影响集群的正常工作。

Broker 集群的部署方式可以分为 3 种。

  • 多 Master

高可用角度观察RabbitMQ、Kafka、RocketMQ各自的实现思路

部署多个 Broker,角色都是 Master,Topic 的数据会分散存储在这些 Broker 中。

单个 Master 故障会导致其中数据无法使用,需要等待修复。

如果想保障数据的可靠性,可以使用【RAID10 + 同步刷盘】机制。

  • 多 Master 多 Slave

高可用角度观察RabbitMQ、Kafka、RocketMQ各自的实现思路

为 Master 配置了 Slave,Master 会把数据同步到 Slave。

当 Master 故障之后,可以用 Slave 顶上去,数据和服务都不影响,但会有短暂的停顿,需要修改配置并重启才能完成切换动作。

数据同步的方式分为:

1)异步 -- Master 写入完成即可,异步同步给 Slave。写入速度快,但同步会有延迟,可能会丢数据。

2)同步 -- Master 与 Slave 都写入之后才算成功。不会丢消息,但写入速度降低。

  • Dledger Group

高可用角度观察RabbitMQ、Kafka、RocketMQ各自的实现思路

Dledger 模式要求为 Master 配置 2 个 Slave,3 者组成一个 Dledger Group。

Dledger 也是 Master-Slave 同步的方式,好处在于可以实现自动选举 Master,自动切换。

当 Master 故障的时候,RocketMQ 可以从组内选出一个新的 Master,完成自动切换,这样更进一步提高了集群的可用性。

最后小结一下。

高可用角度观察RabbitMQ、Kafka、RocketMQ各自的实现思路

高可用角度观察RabbitMQ、Kafka、RocketMQ各自的实现思路

高可用角度观察RabbitMQ、Kafka、RocketMQ各自的实现思路

原文链接:
https://mp.weixin.qq.com/s?__biz=MzA4Nzc4MjI4MQ==&mid=2652404437&idx=1&sn=dfb5da9071300344f273589baffad788

如果觉得本文对你有帮助,可以转发关注支持一下

这篇关于高可用角度观察RabbitMQ、Kafka、RocketMQ各自的实现思路的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/231454

相关文章

pytorch自动求梯度autograd的实现

《pytorch自动求梯度autograd的实现》autograd是一个自动微分引擎,它可以自动计算张量的梯度,本文主要介绍了pytorch自动求梯度autograd的实现,具有一定的参考价值,感兴趣... autograd是pytorch构建神经网络的核心。在 PyTorch 中,结合以下代码例子,当你

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient

JS+HTML实现在线图片水印添加工具

《JS+HTML实现在线图片水印添加工具》在社交媒体和内容创作日益频繁的今天,如何保护原创内容、展示品牌身份成了一个不得不面对的问题,本文将实现一个完全基于HTML+CSS构建的现代化图片水印在线工具... 目录概述功能亮点使用方法技术解析延伸思考运行效果项目源码下载总结概述在社交媒体和内容创作日益频繁的

深入理解Apache Kafka(分布式流处理平台)

《深入理解ApacheKafka(分布式流处理平台)》ApacheKafka作为现代分布式系统中的核心中间件,为构建高吞吐量、低延迟的数据管道提供了强大支持,本文将深入探讨Kafka的核心概念、架构... 目录引言一、Apache Kafka概述1.1 什么是Kafka?1.2 Kafka的核心概念二、Ka

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

通过Spring层面进行事务回滚的实现

《通过Spring层面进行事务回滚的实现》本文主要介绍了通过Spring层面进行事务回滚的实现,包括声明式事务和编程式事务,具有一定的参考价值,感兴趣的可以了解一下... 目录声明式事务回滚:1. 基础注解配置2. 指定回滚异常类型3. ​不回滚特殊场景编程式事务回滚:1. ​使用 TransactionT

Android实现打开本地pdf文件的两种方式

《Android实现打开本地pdf文件的两种方式》在现代应用中,PDF格式因其跨平台、稳定性好、展示内容一致等特点,在Android平台上,如何高效地打开本地PDF文件,不仅关系到用户体验,也直接影响... 目录一、项目概述二、相关知识2.1 PDF文件基本概述2.2 android 文件访问与存储权限2.

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S