图解Kafka:Kafka架构演化与升级!

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 图解Kafka:Kafka架构演化与升级!

了解了 Kafka 架构就掌握了 Kafka 最核心的知识,Kafka 作为业界最知名、最流行的消息系统和流式处理组件,在面试中和日常工作中经常会见到。那么今天,我们就来聊聊 Kafka 的架构演化与升级,并通过图解的方式让你一目了然。

1.Kafka 初印象

Kafka 最初由 LinkedIn 公司开发,后来成为了 Apache 软件基金会的一个开源项目。它的主要设计目标是提供一个高吞吐量、可持久化、分布式的消息系统。

2.Kafka 基础架构

Kafka 最简单的基础架构如下:

Kafka 主要是由以下 4 部分组成:

  1. Producer(生产者):消息发送方,生产者负责创建消息,然后将其投递到 Kafka(Broker)中。
  2. Consumer(消费者):接收消息方,消费者连接到 Kafka 上并接收消息,进而进行相应的业务逻辑处理。
  3. Broker(代理):一个 Broker 可以简单地看作一个独立的 Kafka 服务节点或 Kafka 服务实例。大多数情况下也可以将 Broker 看作一台 Kafka 服务器,前提是这台服务器上只部署了一个 Kafka 实例。一个或多个 Broker 组成了一个 Kafka 集群。一般而言,我们更习惯使用首字母小写的 broker 来表示服务代理节点。
  4. ZooKeeper:ZooKeeper 是 Kafka(集群)中使用的分布式协调服务,用于维护 Kafka(集群)的状态和元数据信息,例如主题和分区的分配信息、消费者组和消费者偏移量等信息。

    Kafka 2.8.0 之后,Kafka 引入了 KRaft(Kafka Raft)模式,它提供了一种新的内置的共识机制来替代对 Zookeeper 的依赖。此时,Kafka 可以脱离 Zookeeper 单独运行,但需要配置 KRaft 控制器才行,Kafka 默认服务还是要配合 Zookeeper 运行的。

3.不同的消息类型怎么办?

在上述最基础的 Kafka 架构中我们会发现一个问题,那就是如果是不同的消息类型要怎么办?例如以下情况:

此时,我们可以把不同类型的消息存放在一起,但这样就需要给消息添加 type 字段,以区分不同的消息。

但添加了 type 字段之后,后面的维护和扩展又不方便,而且 type 越多,代码中的判断代码就越复杂,想象一下:一个复杂项目的消息类型是有成千上万个分类的,那我们的判断代码也要写成千上万个 if-else 判断不可?这要怎么解决呢?

这时候,我们就需要一个“消息分类机制”,这个机制在 Kafka 里被称之为 Topic(主题),如下图所示:

引入了 Topic 之后,不同的消息就可以发送到不同的 Topic 了,不同业务的生产者和消费者就可以实现相互隔离、互不影响了。

Broker 和 Topic 的关系:一个 Broker 中可以包含多个 Topic

4.如何保证高性能?

4.1 数据分片

想要提升 Kafka 性能就需要水平扩展 Broker 数量,如下图所示:

在 Kafka 中,Topic 是用 Partition(分区)存储的,所以它正确的交互流程如下所示:

这小节核心知识点:

  1. Partition(分区)就是真正存储数据的消息队列
  2. 有了集群和多个 Partition 之后,Kafka 的数据就可以实现分片存储了,性能也得到很大的提升。

    什么是数据分片?

    数据分片存储是一种将大量数据分散存储在多个不同位置或设备上的技术。

在数据量庞大的情况下,为了提高数据的存储效率、访问性能和可扩展性,将数据分割成较小的片段,然后分别存储在不同的节点或存储设备中。

以下是一些数据分片存储的特点和优势:

  1. 提高性能:通过将数据分散存储,可以并行地处理数据请求,从而加快数据的读取和写入速度。例如,在一个分布式数据库中,不同的分片可以同时响应查询,减少了总体的响应时间。
  2. 增强可扩展性:当数据量不断增长时,可以方便地添加更多的分片来扩展存储容量,而无需对整个系统进行大规模的重构。
  3. 避免单点性能瓶颈:数据分片可以使数据的存储和访问负载更加均衡地分布在多个节点上,避免单个节点成为性能瓶颈。

    4.2 消费组

    如果没有消费组,那么一个 Topic 只能被一个消费者消费,性能会很低,如下图所示:

    消费组(Consumer Group)是一个由多个消费者(Consumer)组成的逻辑概念,用于实现对一个主题(Topic)中消息进行并发消费和负载均衡的机制。

    特性分析

    Kafka 消费组特性如下:

  4. 并发执行:将一个主题内的消息分给多个消费者并发处理,提升了消息消费的性能。

  5. 容错性好:如果组内的某个消费者发生故障,Kafka 能够自动地将该消费者负责的分区重新分配给其他健康的消费者,确保消息不会被遗漏。
  6. 支持多种消费模式:通过调整消费者组的配置,可以实现不同的消费模式,如发布订阅模式(一对多)和队列模式(一对一)。在发布订阅模式下,一个消息可以被多个消费者组同时消费,每个消费者组内的消费者则共享该消息;在队列模式下,一个消息只能被一个消费者组内的某个消费者消费。这种灵活性使得Kafka可以适应不同的业务需求和数据处理场景。
  7. 动态扩展:随着业务规模的扩大或缩小,可以动态地增加或减少消费者组的成员。新加入的消费者会自动从已有的副本中拉取数据并开始消费;而离开的消费者会自动感知并停止消费。这种动态的扩展性使得 Kafka 能够随着业务的发展而灵活地扩展处理能力。

    消费组和分区的关系:消费者(数量) <= 分区数

5.如何保证高可用?


Partition 备份节点叫做 Follower 节点,负责数据读写的节点叫做 Leader 节点。

Kafka 分区类型有以下两种:

  1. Leader Partition:主节点,负责数据写入和读取。
  2. Follower Partition:副本节点,用于数据备份和主节点宕机之后的分区选举,保证了 Kafka 服务的高可用。

    小结

    Kafka 架构最终组成如下:

    它们分别是:

  3. 生产者(Producer):负责将消息发送到 Kafka 集群。

  4. 消费组(Consumer Group):用于实现对一个主题(Topic)中消息进行并发消费和负载均衡的机制。
  5. 消费者(Consumer):负责从 Kafka 集群中读取、消费消息。
  6. 代理(Broker):Kafka 服务器(Kafka 服务),负责存储和转发消息。
  7. 主题(Topic):消息的逻辑分类,生产者将消息发送到特定的主题,消费者从特定的主题订阅消息。
  8. 分区(Partition):主题可以被分为多个分区,每个分区是一个有序的、不可变的消息序列。分区可以分布在不同的 broker 上,实现水平扩展。分区分为 Leader 分区,和 Follower 分区。
  9. Zookeeper:用于管理 Broker 集群的元数据,如分区分配、领导者选举、消费者组和消费者偏移量等信息等。

本文已收录到我的面试小站 www.javacn.site,其中包含的内容有:Redis、JVM、并发、并发、MySQL、Spring、Spring MVC、Spring Boot、Spring Cloud、MyBatis、设计模式、消息队列等模块。

相关文章
|
25天前
|
运维 Cloud Native 开发者
云原生时代下的微服务架构演化之路
【8月更文挑战第20天】在数字化转型的浪潮下,企业级应用纷纷拥抱云原生架构。本文将深入探讨微服务架构在适应云原生环境的过程中所面临的挑战与机遇,并分析如何通过优化设计、容器化技术及自动化运维,实现高效、灵活且可靠的系统构建。
171 65
|
16天前
|
安全 网络安全 网络虚拟化
优化大型企业网络架构:从核心到边缘的全面升级
大型企业在业务运作中涉及多种数据传输,涵盖办公应用、CRM/ERP系统、数据中心、云环境、物联网及安全合规等多个方面。其复杂的业务生态和全球布局要求网络架构具备高效、安全和可靠的特性。网络设计需全面考虑核心层、汇聚层和接入层的功能与冗余,同时实现内外部的有效连接,包括广域网连接、远程访问策略、云计算集成及多层次安全防护,以构建高效且可扩展的网络生态系统。
优化大型企业网络架构:从核心到边缘的全面升级
|
21天前
|
消息中间件 负载均衡 Java
揭秘Kafka背后的秘密!Kafka 架构设计大曝光:深入剖析Kafka机制,带你一探究竟!
【8月更文挑战第24天】Apache Kafka是一款专为实时数据处理及流传输设计的高效率消息系统。其核心特性包括高吞吐量、低延迟及出色的可扩展性。Kafka采用分布式日志模型,支持数据分区与副本,确保数据可靠性和持久性。系统由Producer(消息生产者)、Consumer(消息消费者)及Broker(消息服务器)组成。Kafka支持消费者组,实现数据并行处理,提升整体性能。通过内置的故障恢复机制,即使部分节点失效,系统仍能保持稳定运行。提供的Java示例代码展示了如何使用Kafka进行消息的生产和消费,并演示了故障转移处理过程。
34 3
|
21天前
|
消息中间件 负载均衡 Kafka
Kafka 实现负载均衡与故障转移:深入分析 Kafka 的架构特点与实践
【8月更文挑战第24天】Apache Kafka是一款专为实时数据处理和流传输设计的高性能消息系统。其核心设计注重高吞吐量、低延迟与可扩展性,并具备出色的容错能力。Kafka采用分布式日志概念,通过数据分区及副本机制确保数据可靠性和持久性。系统包含Producer(消息生产者)、Consumer(消息消费者)和Broker(消息服务器)三大组件。Kafka利用独特的分区机制实现负载均衡,每个Topic可以被划分为多个分区,每个分区可以被复制到多个Broker上,确保数据的高可用性和可靠性。
39 2
|
21天前
|
消息中间件 负载均衡 Kafka
【解密Kafka背后的秘密!】为什么Kafka不需要读写分离?深入剖析Kafka架构,带你一探究竟!
【8月更文挑战第24天】Apache Kafka是一款专为高效实时数据处理与传输设计的消息系统,凭借其高吞吐量、低延迟及可扩展性在业界享有盛誉。不同于传统数据库常采用的读写分离策略,Kafka通过独特的分布式架构实现了无需读写分离即可满足高并发需求。其核心包括Producer(生产者)、Consumer(消费者)与Broker(代理),并通过分区复制、消费者组以及幂等性生产者等功能确保了系统的高效运行。本文通过分析Kafka的架构特性及其提供的示例代码,阐述了Kafka为何无需借助读写分离机制就能有效处理大量读写操作。
25 2
|
23天前
|
消息中间件 存储 SQL
Kafka架构及其原理
Kafka架构及其原理
60 1
|
14天前
|
消息中间件 Kafka Java
Spring 框架与 Kafka 联姻,竟引发软件世界的革命风暴!事件驱动架构震撼登场!
【8月更文挑战第31天】《Spring 框架与 Kafka 集成:实现事件驱动架构》介绍如何利用 Spring 框架的强大功能与 Kafka 分布式流平台结合,构建灵活且可扩展的事件驱动系统。通过添加 Spring Kafka 依赖并配置 Kafka 连接信息,可以轻松实现消息的生产和消费。文中详细展示了如何设置 `KafkaTemplate`、`ProducerFactory` 和 `ConsumerFactory`,并通过示例代码说明了生产者发送消息及消费者接收消息的具体实现。这一组合为构建高效可靠的分布式应用程序提供了有力支持。
43 0
|
30天前
|
存储 缓存 Cloud Native
阿里云EMR数据湖文件系统问题之JindoFS架构升级后的问题如何解决
阿里云EMR数据湖文件系统问题之JindoFS架构升级后的问题如何解决
|
30天前
|
消息中间件 缓存 Kafka
图解Kafka:架构设计、消息可靠、数据持久、高性能背后的底层原理
【8月更文挑战第15天】在构建高吞吐量和高可靠性的消息系统时,Apache Kafka 成为了众多开发者和企业的首选。其独特的架构设计、消息可靠传输机制、数据持久化策略以及高性能实现方式,使得 Kafka 能够在分布式系统中大放异彩。本文将通过图解的方式,深入解析 Kafka 的这些核心特性,帮助读者更好地理解和应用这一强大的消息中间件。
82 0
|
16天前
|
Kubernetes Cloud Native Docker
云原生之旅:从容器到微服务的架构演变
【8月更文挑战第29天】在数字化时代的浪潮下,云原生技术以其灵活性、可扩展性和弹性管理成为企业数字化转型的关键。本文将通过浅显易懂的语言和生动的比喻,带领读者了解云原生的基本概念,探索容器化技术的奥秘,并深入微服务架构的世界。我们将一起见证代码如何转化为现实中的服务,实现快速迭代和高效部署。无论你是初学者还是有经验的开发者,这篇文章都会为你打开一扇通往云原生世界的大门。