-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patharticle-101357.htm
199 lines (189 loc) · 21 KB
/
article-101357.htm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
<!DOCTYPE html>
<html xml:lang="zh-CN" lang="zh-CN">
<head>
<link rel="canonical" href="https://vpnsky.github.io/news/article-101357.htm" />
<meta charset="utf-8">
<meta content="width=device-width, initial-scale=1.0" name="viewport">
<title>图解Kafka架构与工作原理</title>
<meta name="description" content="一、认识Kafka 面试官提问:什么是 Kafka ?用来干嘛的? 官方定义如下: Kafka is used for building real-time data pipelines and st" />
<link rel="icon" href="/assets/website/img/clashnyanpasunode/favicon.ico" type="image/x-icon"/>
<meta name="author" content="VPN天空 免费节点订阅官网">
<meta property="og:type" content="article" />
<meta property="og:url" content="https://vpnsky.github.io/news/article-101357.htm" />
<meta property="og:site_name" content="VPN天空 免费节点订阅官网" />
<meta property="og:title" content="图解Kafka架构与工作原理" />
<meta property="og:image" content="https://vpnsky.github.io/uploads/20240728-1/392ab026d06c58058c1c71c76a671b5e.webp" />
<meta property="og:release_date" content="2025-04-22T08:22:37" />
<meta property="og:updated_time" content="2025-04-22T08:22:37" />
<meta property="og:description" content="一、认识Kafka 面试官提问:什么是 Kafka ?用来干嘛的? 官方定义如下: Kafka is used for building real-time data pipelines and st" />
<meta name="applicable-device" content="pc,mobile" />
<meta name="renderer" content="webkit" />
<meta name="force-rendering" content="webkit" />
<meta http-equiv="Cache-Control" content="no-transform" />
<meta name="robots" content="max-image-preview:large" />
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-title" content="图解Kafka架构与工作原理">
<meta name="format-detection" content="telephone=no">
<link rel="dns-prefetch" href="https:/www.googletagmanager.com">
<link rel="dns-prefetch" href="https://www.googleadservices.com">
<link rel="dns-prefetch" href="https://www.google-analytics.com">
<link rel="dns-prefetch" href="https://pagead2.googlesyndication.com">
<link rel="dns-prefetch" href="https://cm.g.doubleclick.net">
<!-- Google Fonts -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,600;1,700&family=Montserrat:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&family=Raleway:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap" rel="stylesheet">
<!-- Vendor CSS Files -->
<link href="/assets/website/js/frontend/clashnyanpasunode/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link href="/assets/website/js/frontend/clashnyanpasunode/bootstrap-icons/bootstrap-icons.css" rel="stylesheet">
<link href="/assets/website/js/frontend/clashnyanpasunode/aos/aos.css" rel="stylesheet">
<link href="/assets/website/js/frontend/clashnyanpasunode/glightbox/css/glightbox.min.css" rel="stylesheet">
<link href="/assets/website/js/frontend/clashnyanpasunode/swiper/swiper-bundle.min.css" rel="stylesheet">
<!-- Template Main CSS File -->
<link href="/assets/website/css/clashnyanpasunode/main.css" rel="stylesheet">
<link rel="stylesheet" href="/assets/website/css/G.css" />
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-EWKLV7E45X"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-EWKLV7E45X');
</script>
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-3332997411212854"
crossorigin="anonymous"></script>
</head>
<body data-page="detail">
<!-- ======= Header ======= -->
<header id="header" class="header d-flex align-items-center">
<div class="container-fluid container-xl d-flex align-items-center justify-content-between">
<a href="/" class="logo d-flex align-items-center xcblog-blog-logo">
<span>VPN天空</span>
</a>
<nav id="navbar" class="navbar">
<ul>
<li><a href="/">首页</a></li>
<li><a href="/free-nodes/">免费节点</a></li>
<li><a href="/paid-subscribe/">推荐机场</a></li>
<li><a href="/news/">新闻资讯</a></li>
<li><a href="/client.htm">客户端</a></li>
</ul>
</nav><!-- .navbar -->
<i class="mobile-nav-toggle mobile-nav-show bi bi-list"></i>
<i class="mobile-nav-toggle mobile-nav-hide d-none bi bi-x"></i>
</div>
</header><!-- End Header -->
<!-- End Header -->
<!-- End Header -->
<main id="main">
<!-- ======= Breadcrumbs ======= -->
<div class="breadcrumbs">
<div class="page-header d-flex align-items-center" style="background-image: url('');">
<div class="container position-relative">
<div class="row d-flex justify-content-center">
<div class="col-lg-6 text-center">
<h1>图解Kafka架构与工作原理</h1>
</div>
</div>
</div>
</div>
<nav>
<div class="container">
<ol>
<li><a href="/">首页</a></li>
<li><a href="/news/">新闻资讯</a></li>
<li>正文</li>
</ol>
</div>
</nav>
</div><!-- End Breadcrumbs -->
<!-- ======= About Us Section ======= -->
<section id="about" class="about">
<div class="container" data-aos="fade-up">
<div class="row">
<div class="col-md-9 xcblog-blog-list">
<input type="hidden" id="share-website-info" data-name="Clash Node官网订阅站" data-url="https://clashnode.github.io">
<div class="xcblog-blog-detail">
<div id="content_views" class="htmledit_views"> <h2><strong>一、认识Kafka</strong></h2> <p>面试官提问:什么是 Kafka ?用来干嘛的?</p> <p>官方定义如下:</p> <p>Kafka is used for building real-time data pipelines and streaming apps. It is horizontally scalable, fault-tolerant, wicked fast, and runs in production in thousands of companies.</p> <p>翻译过来,大致的意思就是,这是一个实时数据处理系统,可以横向扩展,并高可靠!</p> <p>实时数据处理,从名字上看,很好理解,就是将数据进行实时处理,在现在流行的微服务开发中,最常用实时数据处理平台有 RabbitMQ、RocketMQ 等消息中间件。</p> <p>这些中间件,最大的特点主要有两个:</p> <p>服务解耦</p> <p>流量削峰</p> <p>在早期的 web 应用程序开发中,当请求量突然上来了时候,我们会将要处理的数据推送到一个队列通道中,然后另起一个线程来不断轮训拉取队列中的数据,从而加快程序的运行效率。</p> <p><img fetchpriority="high" decoding="async" alt="" height="679" src="http://img.555519.xyz/uploads3/20220824/6561f5dd0b56b2ae2e7c1d39ddf1723e.jpg"></p> <p>但是随着请求量不断的增大,并且队列通道的数据一致处于高负载,在这种情况下,应用程序的内存占用率会非常高,稍有不慎,会出现内存不足,造成程序内存溢出,从而导致服务不可用。</p> <p>随着业务量的不断扩张,在一个应用程序内,使用这种模式已然无法满足需求,因此之后,就诞生了各种消息中间件,例如 ActiveMQ、RabbitMQ、RocketMQ 等中间件。</p> <p>采用这种模型,本质就是将要推送的数据,不在存放在当前应用程序的内存中,而是将数据存放到另一个专门负责数据处理的应用程序中,从而实现服务解耦。</p> <p><img decoding="async" alt="" height="629" src="http://img.555519.xyz/uploads3/20220824/77e3df97e1acb9de0fcf542ccfb61881.jpg"></p> <p>消息中间件:主要的职责就是保证能接受到消息,并将消息存储到磁盘,即使其他服务都挂了,数据也不会丢失,同时还可以对数据消费情况做好监控工作。</p> <p>应用程序:只需要将消息推送到消息中间件,然后启用一个线程来不断从消息中间件中拉取数据,进行消费确认即可!</p> <p>引入消息中间件之后,整个服务开发会变得更加简单,各负其责。</p> <p>Kafka 本质其实也是消息中间件的一种,Kafka 出自于 LinkedIn 公司,与 2010 年开源到 github。</p> <p>LinkedIn 的开发团队,为了解决数据管道问题,起初采用了 ActiveMQ 来进行数据交换,大约是在 2010 年前后,那时的 ActiveMQ 还远远无法满足 LinkedIn 对数据传递系统的要求,经常由于各种缺陷而导致消息阻塞或者服务无法正常访问,为了能够解决这个问题,LinkedIn 决定研发自己的消息传递系统,Kafka 由此诞生。</p> <p>在 LinkedIn 公司,Kafka 可以有效地处理每天数十亿条消息的指标和用户活动跟踪,其强大的处理能力,已经被业界所认可,并成为大数据流水线的首选技术。</p> <h2><strong>二、Kafka架构介绍</strong></h2> <p>先来看一张图,下面这张图就是 kafka 生产与消费的核心架构模型!</p> <p style="text-align:center;"><img decoding="async" alt="" src="http://img.555519.xyz/uploads3/20220824/34cc1db7fe6a1c22505e3e349581f3c6.jpg"></p> <p>如果你看不懂这些概念没关系,我会带着大家一起梳理一遍!</p> <p>Producer:Producer 即生产者,消息的产生者,是消息的入口</p> <p>Broker:Broker 是 kafka 一个实例,每个服务器上有一个或多个 kafka 的实例,简单的理解就是一台 kafka 服务器,kafka cluster表示集群的意思</p> <p>Topic:消息的主题,可以理解为消息队列,kafka的数据就保存在topic。在每个 broker 上都可以创建多个 topic 。</p> <p>Partition:Topic的分区,每个 topic 可以有多个分区,分区的作用是做负载,提高 kafka 的吞吐量。同一个 topic 在不同的分区的数据是不重复的,partition 的表现形式就是一个一个的文件夹!</p> <p>Replication:每一个分区都有多个副本,副本的作用是做备胎,主分区(Leader)会将数据同步到从分区(Follower)。当主分区(Leader)故障的时候会选择一个备胎(Follower)上位,成为 Leader。在kafka中默认副本的最大数量是10个,且副本的数量不能大于Broker的数量,follower和leader绝对是在不同的机器,同一机器对同一个分区也只可能存放一个副本</p> <p>Message:每一条发送的消息主体。</p> <p>Consumer:消费者,即消息的消费方,是消息的出口。</p> <p>Consumer Group:我们可以将多个消费组组成一个消费者组,在 kafka 的设计中同一个分区的数据只能被消费者组中的某一个消费者消费。同一个消费者组的消费者可以消费同一个topic的不同分区的数据,这也是为了提高kafka的吞吐量!</p> <p>Zookeeper:kafka 集群依赖 zookeeper 来保存集群的的元信息,来保证系统的可用性。</p> <p>简而言之,kafka 本质就是一个消息系统,与大多数的消息系统一样,主要的特点如下:</p> <p>使用推拉模型将生产者和消费者分离</p> <p>为消息传递系统中的消息数据提供持久性,以允许多个消费者</p> <p>提供高可用集群服务,主从模式,同时支持横向水平扩展</p> <p>与 ActiveMQ、RabbitMQ、RocketMQ 不同的地方在于,它有一个分区Partition的概念。</p> <p>这个分区的意思就是说,如果你创建的topic有5个分区,当你一次性向 kafka 中推 1000 条数据时,这 1000 条数据默认会分配到 5 个分区中,其中每个分区存储 200 条数据。</p> <p>这样做的目的,就是方便消费者从不同的分区拉取数据,假如你启动 5 个线程同时拉取数据,每个线程拉取一个分区,消费速度会非常非常快!</p> <p>这是 kafka 与其他的消息系统最大的不同!</p> <h3><strong>2.1 发送数据</strong></h3> <p>和其他的中间件一样,kafka 每次发送数据都是向Leader分区发送数据,并顺序写入到磁盘,然后Leader分区会将数据同步到各个从分区Follower,即使主分区挂了,也不会影响服务的正常运行。</p> <p><img decoding="async" alt="" height="742" src="http://img.555519.xyz/uploads3/20220824/9129d84e93d49f7e84e5431494782616.jpg"></p> <p>那 kafka 是如何将数据写入到对应的分区呢?kafka中有以下几个原则:</p> <p>1、数据在写入的时候可以指定需要写入的分区,如果有指定,则写入对应的分区</p> <p>2、如果没有指定分区,但是设置了数据的key,则会根据key的值hash出一个分区</p> <p>3、如果既没指定分区,又没有设置key,则会轮询选出一个分区</p> <h3><strong>2.2 消费数据</strong></h3> <p>与生产者一样,消费者主动的去kafka集群拉取消息时,也是从Leader分区去拉取数据。</p> <p>这里我们需要重点了解一个名词:消费组!</p> <p><img loading="lazy" decoding="async" alt="" height="664" src="http://img.555519.xyz/uploads3/20220824/94008b05db09df0b78d4d09fa756e254.jpg"></p> <p>考虑到多个消费者的场景,kafka 在设计的时候,可以由多个消费者组成一个消费组,同一个消费组者的消费者可以消费同一个 topic 下不同分区的数据,同一个分区只会被一个消费组内的某个消费者所消费,防止出现重复消费的问题!</p> <p>但是不同的组,可以消费同一个分区的数据!</p> <p>你可以这样理解,一个消费组就是一个客户端,一个客户端可以由很多个消费者组成,以便加快消息的消费能力。</p> <p>但是,如果一个组下的消费者数量大于分区数量,就会出现很多的消费者闲置。</p> <p>如果分区数量大于一个组下的消费者数量,会出现一个消费者负责多个分区的消费,会出现消费性能不均衡的情况。</p> <p>因此,在实际的应用中,建议消费者组的consumer的数量与partition的数量保持一致!</p> </div> </div>
<div class="clearfix"></div>
<div class="col-md-12 mt-5">
<p>上一个:<a href="/news/article-100717.htm">动物疫苗在常温下能放多久不变质呢图片(动物疫苗能放冰箱吗)</a></p>
<p>下一个:<a href="/news/article-101358.htm">猫咪体外驱虫中毒怎么解毒(猫体外驱虫药过量处理方法)</a></p>
</div>
</div>
<div class="col-md-3">
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">热门文章</h3>
</div>
<div class="panel-body">
<ul class="p-0 x-0" style="list-style: none;margin: 0;padding: 0;">
<li class="py-2"><a href="/news/article-77526.htm" title="厦门宠物领养贴吧群(厦门宠物领养厦门宠物赠送)">厦门宠物领养贴吧群(厦门宠物领养厦门宠物赠送)</a></li>
<li class="py-2"><a href="/news/article-87363.htm" title="动物医院常用设备名称(动物医院常用设备名称大全)">动物医院常用设备名称(动物医院常用设备名称大全)</a></li>
<li class="py-2"><a href="/free-nodes/2025-3-31-free-node-subscribe.htm" title="VPN天空 | 3月31日22.8M/S|免费Shadowrocket/Clash/V2ray/SSR订阅节点分享">VPN天空 | 3月31日22.8M/S|免费Shadowrocket/Clash/V2ray/SSR订阅节点分享</a></li>
<li class="py-2"><a href="/news/article-74137.htm" title="Spring Boot项目配置Druid数据源(druid-spring-boot-starter)">Spring Boot项目配置Druid数据源(druid-spring-boot-starter)</a></li>
<li class="py-2"><a href="/news/article-70828.htm" title="宠物粮在哪里批发好(宠物粮在哪里批发好一点)">宠物粮在哪里批发好(宠物粮在哪里批发好一点)</a></li>
<li class="py-2"><a href="/free-nodes/2025-3-24-node-share-links.htm" title="VPN天空 | 3月24日21.2M/S|免费Clash/SSR/V2ray/Shadowrocket订阅节点分享">VPN天空 | 3月24日21.2M/S|免费Clash/SSR/V2ray/Shadowrocket订阅节点分享</a></li>
<li class="py-2"><a href="/news/article-96282.htm" title="上海24h宠物医院(上海宠物医院24小时急诊上门)">上海24h宠物医院(上海宠物医院24小时急诊上门)</a></li>
<li class="py-2"><a href="/news/article-88801.htm" title="动物诊疗许可证费用是多少钱(动物诊疗许可证需要什么材料)">动物诊疗许可证费用是多少钱(动物诊疗许可证需要什么材料)</a></li>
<li class="py-2"><a href="/news/article-99999.htm" title="三种最旺家的花(三种最旺家的花图片)">三种最旺家的花(三种最旺家的花图片)</a></li>
<li class="py-2"><a href="/free-nodes/2025-3-29-free-node-subscribe-links.htm" title="VPN天空 | 3月29日22.3M/S|免费Shadowrocket/V2ray/Clash/SSR订阅节点分享">VPN天空 | 3月29日22.3M/S|免费Shadowrocket/V2ray/Clash/SSR订阅节点分享</a></li>
</ul>
</div>
</div>
<div class="panel panel-default">
<div class="panel-heading">
<h3 class="panel-title">归纳</h3>
</div>
<div class="panel-body">
<ul class="p-0 x-0" style="list-style: none;margin: 0;padding: 0;">
<li class="py-2">
<h4><span class="badge" style="float: right;">66</span> <a href="/date/2025-04/" title="2025-04 归档">2025-04</a></h4>
</li>
<li class="py-2">
<h4><span class="badge" style="float: right;">79</span> <a href="/date/2025-03/" title="2025-03 归档">2025-03</a></h4>
</li>
</ul>
</div>
</div>
</div>
</div>
</div>
</section><!-- End About Us Section -->
</main><!-- End #main -->
<!-- ======= Footer ======= -->
<footer id="footer" class="footer">
<div class="container mt-4">
<div class="copyright">
<p>
<a href="/">首页</a> |
<a href="/free-nodes/">免费节点</a> |
<a href="/paid-subscribe/">推荐机场</a> |
<a href="/news/">新闻资讯</a> |
<a href="/client.htm">客户端</a> |
<a href="/about-us.htm">关于我们</a> |
<a href="/disclaimer.htm">免责申明</a> |
<a href="/privacy.htm">隐私申明</a> |
<a href="/sitemap.xml">网站地图</a>
</p>
VPN天空 免费节点订阅官网 版权所有 Powered by WordPress
</div>
</div>
</footer><!-- End Footer -->
<!-- End Footer -->
<a href="#" class="scroll-top d-flex align-items-center justify-content-center"><i class="bi bi-arrow-up-short"></i></a>
<div id="preloader"></div>
<!-- Vendor JS Files -->
<script src="/assets/website/js/frontend/clashnyanpasunode/jquery-3.5.1.min.js"></script>
<script src="/assets/website/js/frontend/clashnyanpasunode/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="/assets/website/js/frontend/clashnyanpasunode/aos/aos.js"></script>
<script src="/assets/website/js/frontend/clashnyanpasunode/purecounter/purecounter_vanilla.js"></script>
<script src="/assets/website/js/frontend/clashnyanpasunode/swiper/swiper-bundle.min.js"></script>
<script src="/assets/website/js/frontend/clashnyanpasunode/isotope-layout/isotope.pkgd.min.js"></script>
<script src="/assets/website/js/frontend/clashnyanpasunode/php-email-form/validate.js"></script>
<!-- Template Main JS File -->
<script src="/assets/website/js/frontend/clashnyanpasunode/main.js"></script>
<script src="https://www.freeclashnode.com/assets/js/frontend/invite-url.js"></script><script src="/assets/website/js/frontend/G.js"></script>
</body>
</html>