<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Kafka on </title>
    <link>http://blog.chuckchan.top/tags/kafka/</link>
    <description>Recent content in Kafka on </description>
    <generator>Hugo -- gohugo.io</generator>
    <language>zh-cn</language>
    <copyright>© 2026 Chuck Chan</copyright>
    <lastBuildDate>Thu, 09 Mar 2023 00:00:00 +0000</lastBuildDate><atom:link href="http://blog.chuckchan.top/tags/kafka/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>Kafaka之简介</title>
      <link>http://blog.chuckchan.top/posts/middleware/kafka/kafaka%E4%B9%8B%E7%AE%80%E4%BB%8B/</link>
      <pubDate>Thu, 09 Mar 2023 00:00:00 +0000</pubDate>
      
      <guid>http://blog.chuckchan.top/posts/middleware/kafka/kafaka%E4%B9%8B%E7%AE%80%E4%BB%8B/</guid>
      <description>&lt;h1 class=&#34;relative group&#34;&gt;Kafaka简介&#xA;    &lt;div id=&#34;kafaka简介&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#kafaka%e7%ae%80%e4%bb%8b&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&lt;hr&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;1. 简介&#xA;    &lt;div id=&#34;1-简介&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#1-%e7%ae%80%e4%bb%8b&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;Kafka 是一个分布式的基于发布/订阅模式的消息队列（Message Queue），主要应用与大数据实时处理领域。其主要设计目标如下：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;以时间复杂度为O(1)的方式提供消息持久化能力，即使对TB级以上数据也能保证常数时间的访问性能。&lt;/li&gt;&#xA;&lt;li&gt;高吞吐率。即使在非常廉价的机器上也能做到单机支持每秒100K条消息的传输。&lt;/li&gt;&#xA;&lt;li&gt;支持消息分区及分布式消费，同时保证每个partition内的消息顺序传输，同时支持离线数据处理和实时数据处理&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;2. 组件&#xA;    &lt;div id=&#34;2-组件&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#2-%e7%bb%84%e4%bb%b6&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Broker：一台 Kafka 机器就是一个 Broker。一个集群是由多个 Broker 组成的且一个 Broker 可以容纳多个 Topic。&lt;/li&gt;&#xA;&lt;li&gt;Topic：可以简单理解为队列，Topic 将消息分类，生产者和消费者面向的都是同一个 Topic。&lt;/li&gt;&#xA;&lt;li&gt;Producer：即消息生产者，向 Kafka Broker 发消息的客户端。&lt;/li&gt;&#xA;&lt;li&gt;Consumer Group：即消费者组，消费者组内每个消费者负责&lt;strong&gt;消费不同分区的数据，以提高消费能力&lt;/strong&gt;。&lt;strong&gt;一个分区只能由组内一个消费者消费，不同消费者组之间互不影响&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;li&gt;Partition：为了实现Topic扩展性，提高并发能力，一个非常大的 Topic 可以分布到多个 Broker 上，一个 Topic 可以分为多个 Partition 进行存储，每个 Partition 是一个有序的队列。&lt;/li&gt;&#xA;&lt;li&gt;Replica：即副本，为实现数据备份的功能，保证集群中的某个节点发生故障时，该节点上的 Partition 数据不丢失，且 Kafka 仍然能够继续工作，为此Kafka提供了副本机制，一个 Topic 的每个 Partition 都有若干个副本，一个 Leader 副本和若干个 Follower 副本。我们的 &lt;strong&gt;Producer 端在发送数据的时候，只能发送到Leader Partition里面 ，然后Follower Partition会去Leader那自行同步数据, Consumer 消费数据的时候，也只能从 Leader 副本那去消费数据的&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;li&gt;Leader：即每个分区多个副本的主副本，&lt;strong&gt;生产者发送数据的对象，以及消费者消费数据的对象，都是 Leader&lt;/strong&gt;。&lt;/li&gt;&#xA;&lt;li&gt;Offset：消费者消费的位置信息，监控数据消费到什么位置，当消费者挂掉再重新恢复的时候，可以从消费位置继续消费。&lt;/li&gt;&#xA;&lt;li&gt;ZooKeeper服务：Kafka 集群能够正常工作，需要依赖于 ZooKeeper，ZooKeeper 帮助 Kafka 存储和管理集群元数据信息。在最新版本中, 已经慢慢要脱离 ZooKeeper。&lt;/li&gt;&#xA;&lt;li&gt;Controller: 其实就是一个 Kafka 集群中一台 Broker。它除了具有普通Broker 的消息发送、消费、同步功能之外，还需承担一些额外的工作。Kafka 使用公平竞选的方式来确定 Controller ，最先在 ZooKeeper 成功创建临时节点 /controller 的Broker会成为 Controller ，一般而言，Kafka集群中第一台启动的 Broker 会成为Controller，并将自身 Broker 编号等信息写入ZooKeeper临时节点/controller。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;3. 集群架构&#xA;    &lt;div id=&#34;3-集群架构&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#3-%e9%9b%86%e7%be%a4%e6%9e%b6%e6%9e%84&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;![640 (6)](&lt;a href=&#34;http://storage.chuckchan.top/uploads/640&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;http://storage.chuckchan.top/uploads/640&lt;/a&gt; (6).png)&lt;/p&gt;</description>
      
    </item>
    
    <item>
      <title>Kafaka之数据消费</title>
      <link>http://blog.chuckchan.top/posts/middleware/kafka/kafaka%E4%B9%8B%E6%95%B0%E6%8D%AE%E6%B6%88%E8%B4%B9/</link>
      <pubDate>Wed, 01 Mar 2023 00:00:00 +0000</pubDate>
      
      <guid>http://blog.chuckchan.top/posts/middleware/kafka/kafaka%E4%B9%8B%E6%95%B0%E6%8D%AE%E6%B6%88%E8%B4%B9/</guid>
      <description>&lt;h1 class=&#34;relative group&#34;&gt;kafaka之消费数据&#xA;    &lt;div id=&#34;kafaka之消费数据&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#kafaka%e4%b9%8b%e6%b6%88%e8%b4%b9%e6%95%b0%e6%8d%ae&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h1&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;消费方式&#xA;    &lt;div id=&#34;消费方式&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%b6%88%e8%b4%b9%e6%96%b9%e5%bc%8f&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;我们知道消息队列一般有两种实现方式,(1)Push(推模式) (2)Pull(拉模式)，那么 Kafka Consumer 究竟采用哪种方式进行消费的呢？&lt;strong&gt;其实 Kafka Consumer 采用的是主动拉取 Broker 数据进行消费的即 Pull 模式&lt;/strong&gt;。&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;推模式： Push 模式最大缺点就是 Broker 不清楚 Consumer 的消费速度，且推送速率是 Broker 进行控制的， 这样很容易造成消息堆积，如果 Consumer 中执行的任务操作是比较耗时的，那么 Consumer 就会处理的很慢， 严重情况可能会导致系统 Crash。&lt;/li&gt;&#xA;&lt;li&gt;拉模式：如果选择 Pull 模式，这时 Consumer 可以根据自己的情况和状态来拉取数据, 也可以进行延迟处理。但是如果 Kafka Broker 没有消息，这时每次 Consumer 拉取的都是空数据, 可能会一直循环返回空数据。 针对这个问题，Consumer 在每次调用 Poll() 消费数据的时候，顺带一个 timeout 参数，当返回空数据的时候，会在 Long Polling 中进行阻塞，等待 timeout 再去消费，直到数据到达。&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;消费者组&#xA;    &lt;div id=&#34;消费者组&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#%e6%b6%88%e8%b4%b9%e8%80%85%e7%bb%84&#34; aria-label=&#34;锚点&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&lt;strong&gt;为什么 Kafka 要设计 Consumer Group, 只有 Consumer 不可以吗？&lt;/strong&gt; 我们知道 Kafka 是一款高吞吐量，低延迟，高并发, 高可扩展性的消息队列产品， 那么如果某个 Topic 拥有数百万到数千万的数据量， 仅仅依靠 Consumer 进程消费， 消费速度可想而知， 所以需要一个扩展性较好的机制来保障消费进度， 这个时候 Consumer Group 应运而生， &lt;strong&gt;Consumer Group 是 Kafka 提供的可扩展且具有容错性的消费者机制。&lt;/strong&gt;  &lt;strong&gt;Kafka Consumer Group 特点如下:&lt;/strong&gt;&lt;/p&gt;</description>
      
    </item>
    
  </channel>
</rss>
