中间件优解——RabbitMQ和Kafka的高可用集群原理

本文涉及的产品
函数计算FC,每月15万CU 3个月
容器镜像服务 ACR,镜像仓库100个 不限时长
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 大家对当前比较常用的RabbitMQ和Kafka是否有一些了解呢,了解的多一些也不是坏事,面试或者跟人聊技术的时候也会让你更有话语权嘛。今天就跟大家聊一聊RabbitMQ和Kafka在处理高可用集群时的原理,看看它们与RocketMQ有什么不同。小伙伴们可以重新温习一下常见的消息中间件有哪些?你们是怎么进行技术选型的?这篇文章,了解一下他们之间的区别。

前言

大家对当前比较常用的RabbitMQ和Kafka是否有一些了解呢,了解的多一些也不是坏事,面试或者跟人聊技术的时候也会让你更有话语权嘛。

今天就跟大家聊一聊RabbitMQ和Kafka在处理高可用集群时的原理,看看它们与RocketMQ有什么不同。小伙伴们可以重新温习一下常见的消息中间件有哪些?你们是怎么进行技术选型的?这篇文章,了解一下他们之间的区别。

RabbitMQ的高可用

之前我们的文章讲过,RabbitMQ是ActiveMQ的一个很好的替代产品,它是基于主从实现的高可用集群,但它是非分布式的。

RabbitMQ一共有三种模式:单机模式、普通集群模式、镜像集群模式

单机模式没什么可说的,自己开发练手玩玩就行,我们主要说一下两种集群模式的区别。

普通集群模式

普通集群模式,其实就是将RabbitMQ 部署到多台机器上,每个机器启动一个,它们之间进行消息通信。你创建的 queue,只会放在一个 RabbitMQ 的实例上,其他的实例会同步 queue 的元数据(元数据里包含有 queue 的一些配置信息,通过元数据,可以找到 queue 所在的位置)。你消费的时候,实际上如果连接到了另外一个实例,那么那个实例会通过元数据定位到 queue 所在的位置,然后访问queue所在的实例,拉取数据过来发送给消费者。

整体过程见下图:

这种方式很麻烦,只是一个普通的集群,而且数据并没有副本,只存储在了一台机器上,只要真实存储数据的机器宕机,系统直接崩溃,因为没有数据可以获取了。

所以可以得出一个结论,这种模式的集群根本不能实现高可用,只能通过负载均衡提高一些MQ的吞吐量,生成环境下是不会使用的。

镜像集群模式

那么真正用于生产环境,实现高可用的方式是什么呢?没错就是接下来要说的镜像集群模式。

它和普通集群模式最大的区别在于,queue数据和原数据不再是单独存储在一台机器上,而是同时存储在多台机器上。也就是说每个RabbitMQ实例都有一份镜像数据(副本数据)。每次写入消息的时候都会自动把数据同步到多台实例上去,这样一旦其中一台机器发生故障,其他机器还有一份副本数据可以继续提供服务,也就实现了高可用。

整个过程看下图:

那么如何开启镜像集群模式呢?

RabbitMQ是有强大的管理控制台的,通过管控台可以很容易的配置,具体操作自行百度吧,我们本篇的目的是弄懂原理。

对于一般小型公司,小型项目来讲,这套架构已经可以支持了,但是对于海量大数据的要求,如果每台机器都要有一份镜像副本,而且互相之间还要不停的同步数据,它是很难支持的,因为它不是分布式的。所以我们还是使用RocketMQ吧。

Kafka的高可用

再来聊聊Kafka的高可用,再聊高可用之前,我们先要简单了解下它的基本架构。

它是由多个Broker组成的,每个Broker都是一个节点,小伙伴们是不是想到了RocketMQ的Broker呢。当我们创建Topic的时候,这个Topic是会划分成多个partition的,每个partition又可以存在不同的Broker上,这里的每个partition都会放一部分数据,可以把它理解成一个分片。

由此可见,Kafka是一个天然的分布式消息队列,它的Topic是分成多个partition分布到多个Broker上存储的。

既然讲到这里,可能有很多小伙伴会好奇RocketMQ的Topic是怎么存储的呢?难道RocketMQ的Topic就不会分片了吗?

答案是否定的,RocketMQ也是借鉴了Kafka分片存储的机制,引入了一个新的概念ConsumeQueue用来代替partition,原先kafka,里面partition存储的是整个消息,但是现在ConsumeQueue里面是存储消息的存储地址,但是不存储消息了。现在每个ConsumeQueue存储的是每个消息在commitlog这个文件的地址,但是消息存在于commitlog中。
也就是所有的消息体都写在了一个文件里面,每个ConsumeQueue只是存储这个消息在commitlog中地址。

好了,有关RocketMQ的原理我们之后再单独讲解,现在我们继续看Kafka的高可用实现。

Kafka 0.8 以后,才正式开始支持高可用的,它提供了 HA 机制,就是 replica(复制品) 副本机制。每个 partition 的数据都会同步到其它机器上,形成自己的多个 replica 副本。所有 replica 会选举一个 leader 出来,那么生产和消费都跟这个 leader 打交道,然后其他 replica 就是 follower。写的时候,leader 会负责把数据同步到所有 follower 上去,读的时候就直接读 leader 上的数据即可。只能读写 leader?很简单,要是你可以随意读写每个 follower,那么就要 考虑数据一致性的问题,系统复杂度太高,很容易出问题。Kafka 会均匀地将一个 partition 的所有 replica 分布在不同的机器上,这样才可以提高容错性。

我们看一下下图,就是Kafka的高可用原理:

这样的一套架构下,Kafka就实现高可用了。因为如果某个Broker挂掉了,他的partition在其他Broker中都有副本。如果挂掉的Broker上有某个 partition 的 leader,那么此时会从 follower 中重新选举一个新的 leader 出来,大家继续读写那个新的 leader 即可。这就有所谓的高可用性了。

写数据的时候,生产者就向 leader写数据,然后 leader 将数据落地写本地磁盘,接着其他 follower 自己主动从 leader 来 pull 数据。一旦所有 follower 同步好数据了,就会发送 ack 给 leader,leader 收到所有 follower 的 ack 之后,就会返回写成功的消息给生产者。(当然,这只是其中一种模式,还可以适当调整这个行为)

消费的时候,只会从 leader 去读,但是只有当一个消息已经被所有 follower 都同步成功返回 ack 的时候,这个消息才会被消费者读到。

总结

好了,说了这么多,我相信小伙伴们对于RabbitMQ和Kafka的高可用集群原理一定会有个很深的认识了吧。

如果感觉本文对你有帮助关注我支持一下,一起学习进步!

本文就是愿天堂没有BUG给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

相关文章
|
2月前
|
消息中间件 架构师 Java
美团面试:对比分析 RocketMQ、Kafka、RabbitMQ 三大MQ常见问题?
美团面试:对比分析 RocketMQ、Kafka、RabbitMQ 三大MQ常见问题?
美团面试:对比分析 RocketMQ、Kafka、RabbitMQ 三大MQ常见问题?
|
8月前
|
消息中间件 存储 缓存
大厂面试高频:Kafka 工作原理 ( 详细图解 )
本文详细解析了 Kafka 的核心架构和实现原理,消息中间件是亿级互联网架构的基石,大厂面试高频,非常重要,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:Kafka 工作原理 ( 详细图解 )
|
3月前
|
消息中间件 运维 Java
搭建Zookeeper、Kafka集群
本文详细介绍了Zookeeper和Kafka集群的搭建过程,涵盖系统环境配置、IP设置、主机名设定、防火墙与Selinux关闭、JDK安装等基础步骤。随后深入讲解了Zookeeper集群的安装与配置,包括数据目录创建、节点信息设置、SASL认证配置及服务启动管理。接着描述了Kafka集群的安装,涉及配置文件修改、安全认证设置、生产消费认证以及服务启停操作。最后通过创建Topic、发送与查看消息等测试验证集群功能。全网可搜《小陈运维》获取更多信息。
255 1
|
8月前
|
消息中间件 存储 监控
构建高可用性Apache Kafka集群:从理论到实践
【10月更文挑战第24天】随着大数据时代的到来,数据传输与处理的需求日益增长。Apache Kafka作为一个高性能的消息队列服务,因其出色的吞吐量、可扩展性和容错能力而受到广泛欢迎。然而,在构建大规模生产环境下的Kafka集群时,保证其高可用性是至关重要的。本文将从个人实践经验出发,详细介绍如何构建一个高可用性的Kafka集群,包括集群规划、节点配置以及故障恢复机制等方面。
238 4
|
4月前
|
消息中间件 人工智能 安全
秒级灾备恢复:Kafka 2025 AI自愈集群下载及跨云Topic迁移终极教程
Apache Kafka 2025作为企业级实时数据中枢,实现五大革新:量子安全传输(CRYSTALS-Kyber抗量子加密算法)、联邦学习总线(支持TensorFlow Federated/Horizontal FL框架)、AI自愈集群(MTTR缩短至30秒内)、多模态数据处理(原生支持视频流、3D点云等)和跨云弹性扩展(AWS/GCP/Azure间自动迁移)。平台采用混合云基础设施矩阵与软件依赖拓扑设计,提供智能部署架构。安装流程涵盖抗量子安装包获取、量子密钥配置及联邦学习总线设置。
|
6月前
|
消息中间件 存储 缓存
一文带你秒懂 Kafka工作原理!
Apache Kafka 是一个高吞吐量、低延迟的分布式消息系统,广泛应用于实时数据处理、日志收集和消息队列等领域。它最初由LinkedIn开发,2011年成为Apache项目。Kafka支持消息的发布与订阅,具备高效的消息持久化能力,适用于TB级数据的处理。
|
4月前
|
消息中间件 Kafka API
原理剖析| Kafka Exactly Once 语义实现原理:幂等性与事务消息
原理剖析| Kafka Exactly Once 语义实现原理:幂等性与事务消息
110 0
|
7月前
|
消息中间件 Java Kafka
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
本文介绍了Kafka集群的搭建过程,涵盖从虚拟机安装到集群测试的详细步骤。首先规划了集群架构,包括三台Kafka Broker节点,并说明了分布式环境下的服务进程配置。接着,通过VMware导入模板机并克隆出三台虚拟机(kafka-broker1、kafka-broker2、kafka-broker3),分别设置IP地址和主机名。随后,依次安装JDK、ZooKeeper和Kafka,并配置相应的环境变量与启动脚本,确保各组件能正常运行。最后,通过编写启停脚本简化集群的操作流程,并对集群进行测试,验证其功能完整性。整个过程强调了自动化脚本的应用,提高了部署效率。
1623 1
【手把手教你Linux环境下快速搭建Kafka集群】内含脚本分发教程,实现一键部署多个Kafka节点
|
6月前
|
消息中间件 运维 Java
招行面试:RocketMQ、Kafka、RabbitMQ,如何选型?
45岁资深架构师尼恩针对一线互联网企业面试题,特别是招商银行的高阶Java后端面试题,进行了系统化梳理。本文重点讲解如何根据应用场景选择合适的消息中间件(如RabbitMQ、RocketMQ和Kafka),并对比三者的性能、功能、可靠性和运维复杂度,帮助求职者在面试中充分展示技术实力,实现“offer直提”。此外,尼恩还提供了《尼恩Java面试宝典PDF》等资源,助力求职者提升架构、设计、开发水平,应对高并发、分布式系统的挑战。更多内容及技术圣经系列PDF,请关注【技术自由圈】获取。
|
7月前
|
消息中间件 缓存 监控
go高并发之路——消息中间件kafka
本文介绍了高并发业务中的流量高峰应对措施,重点讲解了Kafka消息中间件的使用,包括常用的Go语言库sarama及其版本问题,以及Kafka的版本选择建议。文中还详细解释了Kafka生产者的四种分区策略:轮询、随机、按Key和指定分区,并提供了相应的代码示例。
156 1
go高并发之路——消息中间件kafka

相关产品

  • 云消息队列 Kafka 版
  • 云消息队列 MQ