网易首页 > 网易号 > 正文 申请入驻

聊聊Kafka中值得我们学习的优秀设计

0
分享至

  更多专业文档请访问 www.itilzj.com

  我们今天来聊一聊Kafka中优秀的设计,希望可以提高你的设计能力、写代码能力!

  消息系统的作用

  应该大部份小伙伴都清楚,用机油装箱举个例子

  所以消息系统就是如上图我们所说的仓库,能在中间过程作为缓存,并且实现解耦合的作用。

  引入一个场景,我们知道中国移动,中国联通,中国电信的日志处理,是交给外包去做大数据分析的,假设现在它们的日志都交给了你做的系统去做用户画像分析。

  按照刚刚前面提到的消息系统的作用,我们知道了消息系统其实就是一个模拟缓存 ,且仅仅是起到了缓存的作用 而并不是真正的缓存,数据仍然是存储在磁盘上面而不是内存。

  1.Topic 主题

  kafka学习了数据库里面的设计,在里面设计了topic(主题),这个东西类似于关系型数据库的表

  此时我需要获取中国移动的数据,那就直接监听TopicA即可

  2.Partition 分区

  kafka还有一个概念叫Partition(分区),分区具体在服务器上面表现起初就是一个目录,一个主题下面有多个分区,这些分区会存储到不同的服务器上面,或者说,其实就是在不同的主机上建了不同的目录。

  这些分区主要的信息就存在了.log文件里面。跟数据库里面的分区差不多,是为了提高性能。

  至于为什么提高了性能,很简单,多个分区多个线程,多个线程并行处理肯定会比单线程好得多

  Topic和partition像是HBASE里的table和region的概念,table只是一个逻辑上的概念,真正存储数据的是region,这些region会分布式地存储在各个服务器上面,对应于kafka,也是一样,Topic也是逻辑概念 ,而partition就是分布式存储单元。这个设计是保证了海量数据处理的基础。

  我们可以对比一下,如果HDFS没有block的设计,一个100T的文件也只能单独放在一个服务器上面,那就直接占满整个服务器了,引入block后,大文件可以分散存储在不同的服务器上。

  注意:1.分区会有单点故障问题,所以我们会为每个分区设置副本数

  2.分区的编号是从0开始的

  3.Producer - 生产者

  往消息系统里面发送数据的就是生产者

  4.Consumer - 消费者

  从kafka里读取数据的就是消费者

  5.Message - 消息

  kafka里面的我们处理的数据叫做消息

  创建一个TopicA的主题,3个分区分别存储在不同的服务器,也就是broker下面。Topic是一个逻辑上的概念 ,并不能直接在图中把Topic的相关单元画出

  需要注意:kafka在0.8版本以前是没有副本机制的,所以在面对服务器宕机的突发情况时会丢失数据,所以尽量避免使用这个版本之前的kafka

  Replica - 副本

  kafka中的partition为了保证数据安全,所以每个partition可以设置多个副本。

  此时我们对分区0,1,2分别设置3个副本(其实设置两个副本是比较合适的)

  而且其实每个副本都是有角色之分的,它们会选取一个副本作为leader,而其余的作为follower,我们的生产者在发送数据的时候,是直接发送到leader partition里面 ,然后follower partition会去leader那里自行同步数据,消费者消费数据的时候,也是从leader那去消费数据的 。

  Consumer Group - 消费者组

  我们在消费数据时会在代码里面指定一个group.id,这个id代表的是消费组的名字,而且这个group.id就算不设置,系统也会默认设置

  conf.setProperty("group.id","tellYourDream")

  我们所熟知的一些消息系统一般来说会这样设计,就是只要有一个消费者去消费了消息系统里面的数据,那么其余所有的消费者都不能再去消费这个数据。可是kafka并不是这样,比如现在consumerA去消费了一个topicA里面的数据。

  consumerA:
group.id = a
consumerB:
group.id = a

  consumerC:
group.id = b
consumerD:
group.id = b

  再让consumerB也去消费TopicA的数据,它是消费不到了,但是我们在consumerC中重新指定一个另外的group.id,consumerC是可以消费到topicA的数据的。而consumerD也是消费不到的,所以在kafka中,不同组合有唯一的一个消费者去消费同一主题的数据。

  所以消费者组就是让多个消费者并行消费信息而存在的,而且它们不会消费到同一个消息,如下,consumerA,B,C是不会互相干扰的

  consumer group:a
consumerA
consumerB
consumerC

  如图,因为前面提到过了消费者会直接和leader建立联系,所以它们分别消费了三个leader,所以一个分区不会让消费者组里面的多个消费者去消费 ,但是在消费者不饱和的情况下,一个消费者是可以去消费多个分区的数据的 。

  熟知一个规律:在大数据分布式文件系统里面,95%的都是主从式的架构,个别是对等式的架构,比如ElasticSearch。

  kafka也是主从式的架构,主节点就叫controller,其余的为从节点,controller是需要和zookeeper进行配合管理整个kafka集群。

  kafka和zookeeper如何配合工作

  kafka严重依赖于zookeeper集群(所以之前的zookeeper文章还是有点用的)。所有的broker在启动的时候都会往zookeeper进行注册,目的就是选举出一个controller,这个选举过程非常简单粗暴,就是一个谁先谁当的过程,不涉及什么算法问题。

  那成为controller之后要做啥呢,它会监听zookeeper里面的多个目录。

  例如有一个目录/brokers/,其他从节点往这个目录上注册(就是往这个目录上创建属于自己的子目录而已) 自己,这时命名规则一般是它们的id编号,比如/brokers/0,1,2注册时各个节点必定会暴露自己的主机名,端口号等等的信息,此时controller就要去读取注册上来的从节点的数据(通过监听机制),生成集群的元数据信息,之后把这些信息都分发给其他的服务器,让其他服务器能感知到集群中其它成员的存在 。

  此时模拟一个场景,我们创建一个主题(其实就是在zookeeper上/topics/topicA这样创建一个目录而已),kafka会把分区方案生成在这个目录中,此时controller就监听到了这一改变,它会去同步这个目录的元信息,然后同样下放给它的从节点,通过这个方法让整个集群都得知这个分区方案,此时从节点就各自创建好目录等待创建分区副本即可。这也是整个集群的管理机制。

  1.Kafka性能好在什么地方?

  ① 顺序写

  操作系统每次从磁盘读写数据的时候,需要先寻址,也就是先要找到数据在磁盘上的物理位置,然后再进行数据读写,如果是机械硬盘,寻址就需要较长的时间。

  kafka的设计中,数据其实是存储在磁盘上面,一般来说,会把数据存储在内存上面性能才会好。但是kafka用的是顺序写,追加数据是追加到末尾,磁盘顺序写的性能极高,在磁盘个数一定,转数达到一定的情况下,基本和内存速度一致

  随机写的话是在文件的某个位置修改数据,性能会较低。

  ② 零拷贝

  先来看看非零拷贝的情况

  可以看到数据的拷贝从内存拷贝到kafka服务进程那块,又拷贝到socket缓存那块,整个过程耗费的时间比较高,kafka利用了Linux的sendFile技术(NIO),省去了进程切换和一次数据拷贝,让性能变得更好。

  2.日志分段存储

  Kafka规定了一个分区内的.log文件最大为1G,做这个限制目的是为了方便把.log加载到内存去操作

  00000000000000000000.index
00000000000000000000.log
00000000000000000000.timeindex

  00000000000005367851.index
00000000000005367851.log
00000000000005367851.timeindex

  00000000000009936472.index
00000000000009936472.log
00000000000009936472.timeindex

  这个9936472之类的数字,就是代表了这个日志段文件里包含的起始offset,也就说明这个分区里至少都写入了接近1000万条数据了。

  Kafka broker有一个参数,log.segment.bytes,限定了每个日志段文件的大小,最大就是1GB,一个日志段文件满了,就自动开一个新的日志段文件来写入,避免单个文件过大,影响文件的读写性能,这个过程叫做log rolling,正在被写入的那个日志段文件,叫做active log segment。

  如果大家有看前面的两篇有关于HDFS的文章时,就会发现NameNode的edits log也会做出限制,所以这些框架都是会考虑到这些问题。

  3.Kafka的网络设计

  kafka的网络设计和Kafka的调优有关,这也是为什么它能支持高并发的原因

  首先客户端发送请求全部会先发送给一个Acceptor,broker里面会存在3个线程(默认是3个),这3个线程都是叫做processor,Acceptor不会对客户端的请求做任何的处理,直接封装成一个个socketChannel发送给这些processor形成一个队列,发送的方式是轮询,就是先给第一个processor发送,然后再给第二个,第三个,然后又回到第一个。消费者线程去消费这些socketChannel时,会获取一个个request请求,这些request请求中就会伴随着数据。

  线程池里面默认有8个线程,这些线程是用来处理request的,解析请求,如果request是写请求,就写到磁盘里。读的话返回结果。processor会从response中读取响应数据,然后再返回给客户端。这就是Kafka的网络三层架构。

  所以如果我们需要对kafka进行增强调优,增加processor并增加线程池里面的处理线程,就可以达到效果。request和response那一块部分其实就是起到了一个缓存的效果,是考虑到processor们生成请求太快,线程数不够不能及时处理的问题。

  所以这就是一个加强版的reactor网络线程模型。

  架构杂谈

  了解新兴架构模式:微应用架构

  DDD兴起的原因以及与微服务的关系

  微服务架构设计方案详解

  微服务分布式事务之LCN、TCC特点、事务补偿机制缘由以及设计重点

  免责声明:

  本公众号部分分享的资料来自网络收集和整理,所有文字和图片版权归属于原作者所有,且仅代表作者个人观点,与本公众号无关,文章仅供读者学习交流使用,并请自行核实相关内容,如文章内容涉及侵权,请联系后台管理员删除。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
违法!美最高法就特朗普全球关税作出裁定

违法!美最高法就特朗普全球关税作出裁定

界面新闻
2026-02-20 23:26:46
我的天,球商太高被排挤?哈登迎来幸福的烦恼

我的天,球商太高被排挤?哈登迎来幸福的烦恼

体育新角度
2026-02-20 21:12:54
高云翔大年初四去逛街,花80元买3件二手衣服,二婚生活拮据落魄

高云翔大年初四去逛街,花80元买3件二手衣服,二婚生活拮据落魄

离离言几许
2026-02-20 14:00:30
7名中国游客溺亡的贝加尔湖:20多天前刚有事故致同胞伤亡

7名中国游客溺亡的贝加尔湖:20多天前刚有事故致同胞伤亡

南方都市报
2026-02-20 20:04:51
揭秘:为何中国宁愿向越南输电,也不向朝鲜输电?

揭秘:为何中国宁愿向越南输电,也不向朝鲜输电?

辉辉历史记
2025-11-24 21:16:46
美富翁:一旦中美开战,不能杀死对方的兵,均不在对方领土上打

美富翁:一旦中美开战,不能杀死对方的兵,均不在对方领土上打

徐竦解说
2026-02-20 22:35:22
53岁保姆的无声抗争:月薪8000,活成 “隐形奴隶” 最终掀桌离去

53岁保姆的无声抗争:月薪8000,活成 “隐形奴隶” 最终掀桌离去

真实人物采访
2025-11-26 19:00:03
一年流出视频294部的小宝到底探过多少朵花?

一年流出视频294部的小宝到底探过多少朵花?

挪威森林
2026-01-25 17:18:42
黄岩岛以东发生激烈对峙!052D合肥舰不顾阻挠,强行加入美菲舰队

黄岩岛以东发生激烈对峙!052D合肥舰不顾阻挠,强行加入美菲舰队

林子说事
2026-02-19 18:07:00
平台喊冤:10%抽成恐难覆盖成本!代表回怼:不能总让司机买单!

平台喊冤:10%抽成恐难覆盖成本!代表回怼:不能总让司机买单!

夕阳渡史人
2026-02-11 09:55:09
落泪!除夕女儿看监控,发现母亲独自在客厅坐了一宿,画面曝光

落泪!除夕女儿看监控,发现母亲独自在客厅坐了一宿,画面曝光

观察鉴娱
2026-02-19 13:44:16
她才是女篮的第一中锋!澳联新秀赛季就拿到最佳防守,有望拿FMVP

她才是女篮的第一中锋!澳联新秀赛季就拿到最佳防守,有望拿FMVP

宏远小师哥
2026-02-20 09:00:10
越活越舒服的10个小习惯,请从今天开始养成!

越活越舒服的10个小习惯,请从今天开始养成!

明智家庭教育
2026-02-14 11:07:51
都2026年了,为何还有人买燃油车?我在4S店蹲守3天,终于看懂了

都2026年了,为何还有人买燃油车?我在4S店蹲守3天,终于看懂了

小怪吃美食
2026-02-17 19:11:43
第一集就要打码,这部新剧太炸裂了

第一集就要打码,这部新剧太炸裂了

天天美剧吧
2026-02-20 17:58:59
回村建房7个月,前后被邻居投诉4次,第四次让我断了农村养老的梦

回村建房7个月,前后被邻居投诉4次,第四次让我断了农村养老的梦

人间百态大全
2026-01-11 06:45:03
炸了!1 亿镑新基恩跪求加盟曼联,弗格森时代荣光要回来了?

炸了!1 亿镑新基恩跪求加盟曼联,弗格森时代荣光要回来了?

奶盖熊本熊
2026-02-20 09:12:27
终于!春节旅游巅峰伴随高温陡然爆发!排队拥挤到哭爹喊娘!

终于!春节旅游巅峰伴随高温陡然爆发!排队拥挤到哭爹喊娘!

魔都囡
2026-02-20 00:52:20
14亿人“生死”交给外资?若自来水和食盐被控制,后果有多严重?

14亿人“生死”交给外资?若自来水和食盐被控制,后果有多严重?

云景侃记
2026-02-04 22:34:38
开始了!《惊蛰无声》票房被吴京反超,张艺谋还是走到了这一步

开始了!《惊蛰无声》票房被吴京反超,张艺谋还是走到了这一步

得得电影
2026-02-20 14:55:42
2026-02-21 00:19:00
IT架构师联盟 incentive-icons
IT架构师联盟
IT架构实战分享
836文章数 7671关注度
往期回顾 全部

科技要闻

莫迪举手欢呼 两大AI掌门人却握拳尴尬对峙

头条要闻

女子下车接电话将900克黄金遗落在动车上 价值约135万

头条要闻

女子下车接电话将900克黄金遗落在动车上 价值约135万

体育要闻

宁忠岩:我拿过那么多银牌和铜牌 现在终于赢了

娱乐要闻

《将门独后》开拍,王鹤棣孟子义主演

财经要闻

太疯狂!“顾客不问价直接出手”

汽车要闻

比亚迪的“颜值担当”来了 方程豹首款轿车路跑信息曝光

态度原创

旅游
本地
数码
艺术
公开课

旅游要闻

来浦东过大年|看美展、逛雅集,来浦东沉浸式过马年

本地新闻

春花齐放2026:《骏马奔腾迎新岁》

数码要闻

AMD "Zen 6" MSDT主流桌面处理器被曝最快2027年推出

艺术要闻

开绿灯!特朗普心心念的白宫宴会厅设计方案,一致通过!

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版