深入拆解消息队列 47 讲
许文强
前腾讯云 Kafka 技术负责人
5385 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 50 讲
深入拆解消息队列 47 讲
15
15
1.0x
00:00/00:00
登录|注册

12|从基础功能拆解Kafka的架构设计与实现

提交消费进度
拉取模式
直连分区
消费分组
批量发送
发送到分区
发送到 Topic
清理机制
分区文件结构
内置 Topic
ZooKeeper
Kafka 的全过程
管控操作
Kafka Rest
消费者
生产者
客户端寻址
消息数据存储
元数据存储
Java NIO 和 Reactor
Kafka Protocol
Consumer
ZooKeeper
Broker
Producer
Kafka 和 RocketMQ 的异同点
总结
HTTP 协议支持和管控操作
生产者和消费者
数据存储
协议和网络模块
Kafka 系统架构
概述
Kafka 架构设计与实现

该思维导图由 AI 生成,仅供参考

你好,我是文强。
上节课我们分析了 RocketMQ 在通信协议、网络模块、存储模块、生产者、消费者这五个模块的设计思路。这节课同样还是分析 Kafka 在这五个模块的设计实现。
在学习的过程中,你会发现 Kafka 和 RocketMQ 的架构是非常像的,那为什么今天我们还要单独拿出一节课来分析 Kafka 呢?因为它们俩面对的场景是不一样的,一个是消息场景、一个是流场景,所以它们在底层的协议设计、存储模型、消费方式的实现上也是不一样的。而实现的不同,又导致了它们在功能和性能上的表现不一样。
接下来我们就从底层原理的角度来看一下,它们都有哪些异同点。

Kafka 系统架构

首先来看一下 Kafka 的架构图。
如上图所示,Kafka 由 Producer、Broker、ZooKeeper、Consumer 四个模块组成。其中,ZooKeeper 用来存储元数据信息,集群中所有元数据都持久化存储在 ZooKeeper 当中。
Kafka 有 Topic 和分区的概念,分区就相当于 RocketMQ 的 MessageQueue。一个 Topic 可以包含一个或多个分区。消费方面通过 Group 来组织消费者和分区的关系。
到这你是不是发现了?Kafka 架构和 RocketMQ 非常像。从社区信息来看,RocketMQ 最初的设计应该参考过 Kafka,所以它们的架构和概念非常像,只是在具体实现方式上不太一样。比如概念上分区和 MessageQueue 的作用是一样的,元数据存储 ZooKeeper 和 NameServer 的作用也是一样的。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入探讨了Kafka的系统架构、协议和网络模块、数据存储等方面。首先介绍了Kafka的系统架构,包括Producer、Broker、ZooKeeper和Consumer四个模块,并指出了Kafka与RocketMQ在架构设计上的相似之处。文章详细分析了Kafka的协议和网络模块,以及数据存储方面的元数据存储和消息数据存储。在数据存储方面,文章提到了Kafka以分区为维度单独存储数据的特点,并对其存储结构进行了解释。此外,文章还介绍了Kafka的清理机制和存储性能优化手段。总体而言,本文通过深入剖析Kafka的架构设计和实现细节,为读者提供了全面了解Kafka基础功能的视角。文章还探讨了Kafka从生产到消费的全过程,包括客户端寻址、生产消息分配策略、消费模式、消费进度管理等方面的内容。文章还提到了Kafka对HTTP协议和管控操作的支持,以及Kafka的协议、网络、存储等方面的特点。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《深入拆解消息队列 47 讲》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(6)

  • 最新
  • 精选
  • 张洋
    关于存储模块有一个问题,Kafka为什么每个分区一个文件(逻辑上的会分段),rocketMQ为什么一个Broker所有的queue都在一个commitlog中? 自己想的是Kafka的方式如果分区太多会创建大量的资源,如果FD资源耗尽就会出现问题,所以Rocketmq会支持的分区更多。 还有其他原因吗?

    作者回复: 你好呀,这个问题的答案在基础篇的《05 | 存储:消息数据和元数据的存储是如何设计的?》中可以找到。 核心考虑点事对读和写的性能要求。 第一种方案,单个文件读和写都是顺序的,性能最高。但是当文件很多且都有读写的场景下,硬盘层面就会退化为随机读写,性能会严重下降。 第二种方案,因为只有一个文件,不存在文件过多的情况,写入层面一直都会是顺序的,性能一直很高。但是在消费的时候,因为多个分区数据存储在同一个文件中,同一个分区的数据在底层存储上是不连续的,硬盘层面会出现随机读的情况,导致读取的性能降低。

    2023-07-20归属地:北京
    2
    2
  • fc1997
    想问下,如果kafka一个topic有五个partition然后有三台broker,这种情况下会存在一台broker有三个partition的情况嘛,因为没用过kafka

    作者回复: 你好,是有可能的。 默认情况下,5个partition会均匀分布在3台Broker上。 此时分区在Broker上的数量分布可能是:2、2、1。 但是分区在Broker上分布的算法实现是比较复杂的,考虑的情况更多。所以从理论上看,是有可能会出现一个Broker上放了3个分区的。此时分区数量分布就是:3,1,1。

    2023-07-21归属地:浙江
    2
    1
  • jackfan
    有一个疑问 就是客户端寻址,寻的是哪个的地址?是broker的还是topic、分区这些的

    作者回复: 你好~ 寻找的是分区Leader所在的 Broker 地址。因为在直连模式下,需要先知道分区的Leader是哪台,才能把数据写入到分区的Leader中。

    2023-07-20归属地:上海
  • 林龍
    看完前面的篇章,我以为kafka是poll的,认为poll = pull + ack ;能够更加详细讲一下poll这个模式吗?
    2023-07-19
    1
    1
  • 开发很忙
    文中提到,“消费分组模式下,一个分区只能给一个消费者消费,消费是顺序的。”意思是说Kafka不能实现共享消息吗?即消息粒度的负载均衡?
    2023-09-24归属地:广东
  • 鲁米
    消费端的消费分组是出于高可用目的设计么?客户端寻址是怎样动态保持与生产端元数据的一致的呢?
    2023-08-10归属地:北京
收起评论
显示
设置
留言
6
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部