Kafka架構的詳細闡述

一、Kafka概述

Kafka是一個分布式、可橫向擴展的消息隊列,是一種高吞吐量的分布式發布訂閱消息系統。Kafka的設計目標是:將發布者與訂閱者解耦,同時提高消息處理速度。Kafka是用Scala編寫的,但是它支持多種編程語言。

二、Kafka架構

Kafka的架構中有四個角色:生產者,消費者,Kafka Broker和ZooKeeper。

1. 生產者

Kafka生產者將消息發布到Kafka Broker。生產者將消息發送到指定的Topic。Topic是寫入消息的主題,“生產者”發布的每條消息都屬於某個主題。生產者必須知道應該將消息發送到哪個Topic中。


import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.Producer;
import org.apache.kafka.clients.producer.ProducerRecord;

public class KafkaProducerExample {
    public static void main(String[] args) throws Exception{
        String topicName = "my-topic";
        String key = "my-key";
        String value = "my-value";

        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
        props.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

        Producer producer = new KafkaProducer(props);

        ProducerRecord record = new ProducerRecord(topicName, key, value);
        producer.send(record);

        producer.close();
    }
}

2. 消費者

消費者可以訂閱一個或多個Topic,並消費其中的消息。Kafka消費者將分區中的消息讀取出來,按照順序消費。Kafka消費者在處理消息時是有狀態的,需要記錄已消費消息的偏移量。消費者可以設置偏移量的提交方式,是同步式還是異步式。


import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import java.util.Collections;
import java.util.Properties;

public class KafkaConsumerExample {
    public static void main(String[] args) throws Exception{

        String topicName = "my-topic";
        Properties props = new Properties();
        props.put("bootstrap.servers", "localhost:9092");
        props.put("group.id", "test");
        props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
        props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

        KafkaConsumer consumer = new KafkaConsumer(props);
        consumer.subscribe(Collections.singletonList(topicName));

        while (true) {
            ConsumerRecords records = consumer.poll(100);
            for (ConsumerRecord record : records) {
                System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());
            }
        }
    }
}

3. Kafka Broker

Kafka Broker是Kafka集群中的一個,是一個Kafka Server實例。Broker接收生產者發布的消息,並將消息寫入磁盤上的一個或多個分區中。Broker還提供了消費者可以從其訂閱的Partition中讀取消息的服務。

4. ZooKeeper

Kafka依賴ZooKeeper來完成元數據管理、Leader選舉、分區管理等任務。ZooKeeper還支持監視Kafka Broker和Consumer的狀態。

三、Kafka分區和副本

Kafka中的Topic分為多個Partition,每個Partition可以分配多個Replica(副本)。Partition和Replica的數量可以在創建Topic時進行配置。消息Producer將消息通過輪詢算法發送到一個Partition中的某個Replica。

1. Partition

Partition用於較大的Topic。Kafka中所有消息都必須屬於某個Topic,但是如果一個Topic的消息量很大,需要很高的處理能力來處理每個Message,那麼就可以採用Partition的方式來劃分Message。Partition將一個Topic中的所有消息分為若干個區,每一個區中的消息互不干擾。可以將每個Partition存儲在一個文件中。

2. Replica

副本可以提高讀寫的性能,副本的作用就是讓數據更可靠。Kafka中的Replica(副本)是指能夠複製Partition內容的節點,同一個Topic中,不同Partition的Replica可以配置成不同的個數(即Replication Factor)。一個Partition的所有副本被稱為一個副本集。如果在一個Broker中存儲了多個Partition的多個副本,同一個Broker中相同Partition的副本不能保存在同一個磁盤路徑下。

四、Kafka的可靠性

Kafka的可靠性分為兩個方面:Producer的可靠性和Consumer的可靠性。

1. Producer的可靠性

Kafka保證消息不會丟失是通過副本策略實現的。Producer向Broker中發送消息,Broker接收到消息後將消息寫入磁盤,並同時往一個或多個其它Broker的Replica中也寫入消息。只有將消息發送給所有的Replica後才返回ACK,表示消息已經保存成功,這時Producer才能確定消息已經被保存下來。

2. Consumer的可靠性

Kafka提供了兩種Commit的方式:自動Commit和手動Commit。

  • 自動Commit:Consumer在poll方法的過程中可以選擇自動提交偏移量,但是這種方式可能會出現宕機丟失數據的情況。
  • 手動Commit:Consumer在處理消息後,可以手動提交偏移量。如果偏移量提交失敗的話,Consumer將會等待一段時間後再次提交,直到提交成功。

原創文章,作者:HCMBX,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/331938.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
HCMBX的頭像HCMBX
上一篇 2025-01-20 14:10
下一篇 2025-01-20 14:10

相關推薦

  • pythoncs架構網盤client用法介紹

    PythonCS是一種使用Python編寫的分布式計算中間件。它具有分布式存儲、負載均衡、任務分發等功能。pythoncs架構網盤client是PythonCS框架下的一個程序,主…

    編程 2025-04-28
  • Python消費Kafka數據指南

    本文將為您詳細介紹如何使用Python消費Kafka數據,旨在幫助讀者快速掌握這一重要技能。 一、Kafka簡介 Kafka是一種高性能和可伸縮的分布式消息隊列,由Apache軟件…

    編程 2025-04-28
  • index.html怎麼打開 – 詳細解析

    一、index.html怎麼打開看 1、如果你已經擁有了index.html文件,那麼你可以直接使用任何一個現代瀏覽器打開index.html文件,比如Google Chrome、…

    編程 2025-04-25
  • Resetful API的詳細闡述

    一、Resetful API簡介 Resetful(REpresentational State Transfer)是一種基於HTTP協議的Web API設計風格,它是一種輕量級的…

    編程 2025-04-25
  • AXI DMA的詳細闡述

    一、AXI DMA概述 AXI DMA是指Advanced eXtensible Interface Direct Memory Access,是Xilinx公司提供的基於AMBA…

    編程 2025-04-25
  • 關鍵路徑的詳細闡述

    關鍵路徑是項目管理中非常重要的一個概念,它通常指的是項目中最長的一條路徑,它決定了整個項目的完成時間。在這篇文章中,我們將從多個方面對關鍵路徑做詳細的闡述。 一、概念 關鍵路徑是指…

    編程 2025-04-25
  • neo4j菜鳥教程詳細闡述

    一、neo4j介紹 neo4j是一種圖形數據庫,以實現高效的圖操作為設計目標。neo4j使用圖形模型來存儲數據,數據的表述方式類似於實際世界中的網絡。neo4j具有高效的讀和寫操作…

    編程 2025-04-25
  • c++ explicit的詳細闡述

    一、explicit的作用 在C++中,explicit關鍵字可以在構造函數聲明前加上,防止編譯器進行自動類型轉換,強制要求調用者必須強制類型轉換才能調用該函數,避免了將一個參數類…

    編程 2025-04-25
  • HTMLButton屬性及其詳細闡述

    一、button屬性介紹 button屬性是HTML5新增的屬性,表示指定文本框擁有可供點擊的按鈕。該屬性包括以下幾個取值: 按鈕文本 提交 重置 其中,type屬性表示按鈕類型,…

    編程 2025-04-25
  • Vim使用教程詳細指南

    一、Vim使用教程 Vim是一個高度可定製的文本編輯器,可以在Linux,Mac和Windows等不同的平台上運行。它具有快速移動,複製,粘貼,查找和替換等強大功能,尤其在面對大型…

    編程 2025-04-25

發表回復

登錄後才能評論