高可用角度观察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

相关文章

基于Python Playwright进行前端性能测试的脚本实现

《基于PythonPlaywright进行前端性能测试的脚本实现》在当今Web应用开发中,性能优化是提升用户体验的关键因素之一,本文将介绍如何使用Playwright构建一个自动化性能测试工具,希望... 目录引言工具概述整体架构核心实现解析1. 浏览器初始化2. 性能数据收集3. 资源分析4. 关键性能指

使用Redis快速实现共享Session登录的详细步骤

《使用Redis快速实现共享Session登录的详细步骤》在Web开发中,Session通常用于存储用户的会话信息,允许用户在多个页面之间保持登录状态,Redis是一个开源的高性能键值数据库,广泛用于... 目录前言实现原理:步骤:使用Redis实现共享Session登录1. 引入Redis依赖2. 配置R

SpringBoot实现RSA+AES自动接口解密的实战指南

《SpringBoot实现RSA+AES自动接口解密的实战指南》在当今数据泄露频发的网络环境中,接口安全已成为开发者不可忽视的核心议题,RSA+AES混合加密方案因其安全性高、性能优越而被广泛采用,本... 目录一、项目依赖与环境准备1.1 Maven依赖配置1.2 密钥生成与配置二、加密工具类实现2.1

在Java中实现线程之间的数据共享的几种方式总结

《在Java中实现线程之间的数据共享的几种方式总结》在Java中实现线程间数据共享是并发编程的核心需求,但需要谨慎处理同步问题以避免竞态条件,本文通过代码示例给大家介绍了几种主要实现方式及其最佳实践,... 目录1. 共享变量与同步机制2. 轻量级通信机制3. 线程安全容器4. 线程局部变量(ThreadL

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买