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

本文涉及的产品
函数计算FC,每月15万CU 3个月
应用实时监控服务-应用监控,每月50GB免费额度
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 大家对当前比较常用的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给大家分享的内容,大家有收获的话可以分享下,想学习更多的话可以到微信公众号里找我,我等你哦。

相关文章
|
8天前
|
消息中间件 存储 缓存
大厂面试高频:Kafka 工作原理 ( 详细图解 )
本文详细解析了 Kafka 的核心架构和实现原理,消息中间件是亿级互联网架构的基石,大厂面试高频,非常重要,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:Kafka 工作原理 ( 详细图解 )
|
21天前
|
消息中间件 存储 监控
构建高可用性Apache Kafka集群:从理论到实践
【10月更文挑战第24天】随着大数据时代的到来,数据传输与处理的需求日益增长。Apache Kafka作为一个高性能的消息队列服务,因其出色的吞吐量、可扩展性和容错能力而受到广泛欢迎。然而,在构建大规模生产环境下的Kafka集群时,保证其高可用性是至关重要的。本文将从个人实践经验出发,详细介绍如何构建一个高可用性的Kafka集群,包括集群规划、节点配置以及故障恢复机制等方面。
54 4
|
1月前
|
消息中间件 监控 数据可视化
大数据-79 Kafka 集群模式 集群监控方案 JavaAPI获取集群指标 可视化监控集群方案: jconsole、Kafka Eagle
大数据-79 Kafka 集群模式 集群监控方案 JavaAPI获取集群指标 可视化监控集群方案: jconsole、Kafka Eagle
52 2
|
1月前
|
消息中间件 编解码 Docker
【Docker项目实战】Docker部署RabbitMQ消息中间件
【10月更文挑战第8天】Docker部署RabbitMQ消息中间件
85 1
【Docker项目实战】Docker部署RabbitMQ消息中间件
|
18天前
|
消息中间件 存储 Prometheus
Kafka集群如何配置高可用性
Kafka集群如何配置高可用性
|
1月前
|
消息中间件 分布式计算 监控
大数据-78 Kafka 集群模式 集群的应用场景与Kafka集群的搭建 三台云服务器
大数据-78 Kafka 集群模式 集群的应用场景与Kafka集群的搭建 三台云服务器
64 6
|
1月前
|
消息中间件 缓存 分布式计算
大数据-59 Kafka 高级特性 消息发送03-自定义拦截器、整体原理剖析
大数据-59 Kafka 高级特性 消息发送03-自定义拦截器、整体原理剖析
27 2
|
1月前
|
消息中间件 缓存 大数据
大数据-57 Kafka 高级特性 消息发送相关01-基本流程与原理剖析
大数据-57 Kafka 高级特性 消息发送相关01-基本流程与原理剖析
40 3
|
24天前
|
消息中间件 中间件 Kafka
解锁Kafka等消息队列中间件的测试之道
在这个数字化时代,分布式系统和消息队列中间件(如Kafka、RabbitMQ)已成为日常工作的核心组件。本次公开课由前字节跳动资深专家KK老师主讲,深入解析消息队列的基本原理、架构及测试要点,涵盖功能、性能、可靠性、安全性和兼容性测试,并探讨其主要应用场景,如应用解耦、异步处理和限流削峰。课程最后设有互动答疑环节,助你全面掌握消息队列的测试方法。
|
2月前
|
中间件 API 开发者
深入理解Python Web框架:中间件的工作原理与应用策略
在Python Web开发中,中间件位于请求处理的关键位置,提供强大的扩展能力。本文通过问答形式,探讨中间件的工作原理、应用场景及实践策略,并以Flask和Django为例展示具体实现。中间件可以在请求到达视图前或响应返回后执行代码,实现日志记录、权限验证等功能。Flask通过装饰器模拟中间件行为,而Django则提供官方中间件系统,允许在不同阶段扩展功能。合理制定中间件策略能显著提升应用的灵活性和可扩展性。
40 4

相关产品

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