分布式消息隊列kafka詳解

分布式消息隊列kafka詳解

引言

Apache Kafka是一個開源的分布式事件流平臺,最初由LinkedIn開發,現已成為處理高吞吐量、實時數據流的行業標準。Kafka不僅僅是一個消息隊列,更是一個完整的分布式流處理平臺,能夠發布、訂閱、存儲和處理海量數據流。

核心概念

基礎架構

Kafka采用分布式架構,主要組件包括:

  • Broker: Kafka服務器,負責接收、存儲和轉發消息
  • ZooKeeper: 管理集群元數據和協調集群成員(較新版本開始逐步淘汰依賴)
  • Producer: 生產者,發布消息到Kafka
  • Consumer: 消費者,從Kafka讀取消息
  • Connector: 連接器,實現與外部系統的數據交換
  • Stream Processor: 流處理器,處理數據流

重要概念

  • Topic: 消息的邏輯分類,可以理解為一個消息管道
  • Partition: Topic的分區,實現并行處理和水平擴展
  • Offset: 分區內消息的唯一標識,順序遞增
  • Consumer Group: 消費者組,同一組內的消費者共同消費Topic
  • Replication: 分區復制,提供高可用性

Kafka架構圖

Producers                          Consumers|                                 ^v                                 |+----------------------------------+ ||              Broker              | || +------------------------------+ | || | Topic A                      | | || | +-----------+ +-----------+ | | || | |Partition 0| |Partition 1| | | || | |0|1|2|3|...|0|1|2|3|...  | | | || | +-----------+ +-----------+ | | || +------------------------------+ | |+----------------------------------+ ||                      |v                      |+---------------+             ||  ZooKeeper    |             |+---------------+             |||

Kafka的主要特性

高吞吐量

Kafka能夠處理每秒數百萬條消息,這歸功于:

  • 基于磁盤的順序讀寫
  • 零拷貝技術優化
  • 批量處理和壓縮傳輸
  • 分區并行處理

持久性和可靠性

  • 消息持久化到磁盤
  • 可配置的復制因子
  • 容錯和自動恢復機制
  • 精確一次語義(Exactly-Once Semantics)

可擴展性

  • 無主設計,任何broker可作為分區leader
  • 動態集群擴展
  • 分區動態再平衡

實時性

  • 低延遲消息傳遞(毫秒級)
  • 流處理能力

消息存儲機制

Kafka采用獨特的存儲設計:

  • 基于追加寫入的日志結構
  • 分段文件存儲
  • 稀疏索引加速查找
  • 消息壓縮
  • 日志清理和壓縮策略
Topic Partition
+-------------------------------------------+
| Segment 0 | Segment 1 | ... | Segment N  |
+-------------------------------------------+|v
+-----------------------+
| Index File | Log File |
+-----------------------+

消費模型

拉取模式

Kafka采用消費者主動拉取消息的模式:

  • 消費者自行控制消費速率
  • 消費位置(offset)由消費者維護
  • 支持消費者再平衡

消費者組

  • 同一組內的消費者共同消費Topic的消息
  • 每個分區在同一時間只能被組內一個消費者消費
  • 實現負載均衡和水平擴展
Topic (4 partitions)
+----+----+----+----+
| P0 | P1 | P2 | P3 |
+----+----+----+----+|    |    |    |v    v    v    v
+----+----+----+----+
| C1 | C2 | C1 | C2 |
+----+----+----+----+
Consumer Group (2 consumers)

實際應用場景

消息系統

  • 替代傳統消息隊列,實現系統解耦
  • 緩沖峰值流量,平滑處理壓力

日志收集

  • 收集分布式系統的日志數據
  • 集中處理和分析

流處理

  • 實時數據分析
  • 事件驅動應用

數據集成

  • 與各種數據系統集成
  • CDC(變更數據捕獲)

基本使用示例

創建Topic

bin/kafka-topics.sh --create --bootstrap-server localhost:9092 \--replication-factor 3 --partitions 5 --topic my-topic

生產消息

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<String, String> producer = new KafkaProducer<>(props);
ProducerRecord<String, String> record = new ProducerRecord<>("my-topic", "key1", "value1");
producer.send(record);
producer.close();

消費消息

Properties props = new Properties();
props.put("bootstrap.servers", "localhost:9092");
props.put("group.id", "my-group");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");Consumer<String, String> consumer = new KafkaConsumer<>(props);
consumer.subscribe(Collections.singletonList("my-topic"));while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));for (ConsumerRecord<String, String> record : records) {System.out.printf("offset = %d, key = %s, value = %s%n", record.offset(), record.key(), record.value());}
}

高級特性

事務支持

Kafka支持跨分區的原子事務,確保多條消息要么全部成功,要么全部失敗。

props.put("transactional.id", "my-transactional-id");
producer.initTransactions();
try {producer.beginTransaction();// 發送多條消息producer.send(record1);producer.send(record2);producer.commitTransaction();
} catch (Exception e) {producer.abortTransaction();
}

消息壓縮

支持多種壓縮算法:

props.put("compression.type", "snappy"); // gzip, lz4, zstd也可選

安全特性

  • SASL認證
  • SSL/TLS加密
  • ACL權限控制
props.put("security.protocol", "SASL_SSL");
props.put("sasl.mechanism", "PLAIN");

監控與管理

  • JMX指標
  • Prometheus集成
  • Kafka Manager等管理工具

Kafka Streams

Kafka Streams是Kafka原生的流處理庫:

StreamsBuilder builder = new StreamsBuilder();
KStream<String, String> source = builder.stream("input-topic");
KStream<String, String> transformed = source.map((key, value) -> new KeyValue<>(key, value.toUpperCase()));
transformed.to("output-topic");

實際部署考量

硬件配置

  • 高速磁盤(建議SSD)
  • 足夠的內存(用于頁緩存)
  • 高速網絡(10Gbps+)

集群規模

  • 小型集群:3-5個broker
  • 中型集群:5-10個broker
  • 大型集群:10+個broker

關鍵配置參數

  • num.partitions: 默認分區數
  • default.replication.factor: 默認復制因子
  • min.insync.replicas: 最小同步副本數
  • log.retention.hours: 日志保留時間
  • log.segment.bytes: 日志段大小

與其他消息隊列對比

特性KafkaRabbitMQActiveMQRocketMQ
吞吐量極高中等中等
延遲毫秒級微秒級毫秒級毫秒級
消息持久化可選可選
消息模型發布/訂閱多種多種發布/訂閱
集群擴展性極佳一般一般良好
部署復雜度中等中等

總結

Kafka作為一個分布式流處理平臺,其高吞吐量、可靠性和可擴展性使其成為處理大規模數據流的理想選擇。無論是構建實時數據管道、流處理應用還是作為企業消息總線,Kafka都能提供出色的性能和可靠性。隨著數據驅動決策的日益重要,Kafka在構建實時數據架構中的角色將越來越關鍵。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/906684.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/906684.shtml
英文地址,請注明出處:http://en.pswp.cn/news/906684.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uni-app(3):互相引用

1 絕對路徑和相對路徑 在日常開發中&#xff0c;經常會遇到使用絕對路徑還是相對路徑的問題&#xff0c;下面我們介紹下這兩種路徑。 1.1 絕對路徑 絕對路徑&#xff1a;是指從項目根目錄開始的完整路徑。它用于指定文件或目錄的確切位置。絕對路徑通常以斜杠&#xff08;/&am…

python與flask框架

一、理論 Flask是一個輕量級的web框架&#xff0c;靈活易用。提供構建web應用所需的核心工具。 Flask依賴python的兩個庫 Werkzeug&#xff1a;flask的底層庫&#xff0c;提供了WSGI接口、HTTP請求和響應處理、路由等核心功能。 Jinja2&#xff1a;模板引擎&#xff0…

esp32-idf框架學習筆記/教程

esp32型號: 環境搭建 安裝:就按這個來,別的試了好多次都不行,這個一次成功!!!! vscode下ESP32開發環境配置&#xff08;100%成功&#xff09;_嗶哩嗶哩_bilibili esp芯片的兩種模式: ESP32 固件燒錄教程_嗶哩嗶哩_bilibili 1.運行模式 2.下載模式 esp32s3程序下載 1.數據…

VKontakte(VK)注冊教程

VKontakte&#xff08;簡稱VK&#xff09;是俄羅斯最大的社交網絡平臺&#xff0c;類似于Facebook&#xff0c;用戶可以通過它進行社交、分享圖片、視頻、音樂等內容&#xff0c;并參與各類社群討論&#xff0c;是與俄羅斯及其他東歐地區的朋友建立聯系的便捷平臺。對于做俄羅斯…

STM32+ESP8266+ONENET+微信小程序上傳數據下發指令避坑指南

之前只做過類似的但是以為這種爛大街的功能應該不難結果還是踩了不少坑&#xff0c;記錄幾個需要注意的點 首先貼一個非常有用的視頻&#xff0c;里面講的很詳細&#xff0c;給的資料也很全【【新版OneNet云平臺】STM32ESP8266上傳數據&#xff0c;簡單易上手&#xff01;】 h…

【知識點】關于vue3中markRow、shallowRef、shallowReactive的了解

首先我們先了解一下這三個函數的定義以及區別 markRow 定義&#xff1a; 一個用于標記對象為非響應式的工具函數 shallowRef 定義&#xff1a; 一個用于創建淺層響應式引用的函數&#xff0c;只對 .value 本身進行響應式處理&#xff0c;不會遞歸地將 .value 指向的對象或…

后端開發實習生-抖音生活服務

職位描述 ByteIntern&#xff1a;面向2026屆畢業生&#xff08;2025年9月-2026年8月期間畢業&#xff09;&#xff0c;為符合崗位要求的同學提供轉正機會。 團隊介紹&#xff1a;生活服務業務依托于抖音、抖音極速版等平臺&#xff0c;致力于促進用戶與本地服務的連接。過去一…

OceanBase 共享存儲:云原生數據庫的存儲

目錄 探會——第三屆 OceanBase 開發者大會 重磅發布&#xff1a;OceanBase 4.3 開發者生態全面升級 實戰演講&#xff1a;用戶案例與行業落地 OceanBase 共享存儲架構解析 什么是共享存儲架構&#xff1f; 云原生數據庫的架構 性能、彈性與多云的統一 為何OceanBase能…

C++ 結構體封裝模式與 Promise 鏈式調用:設計思想的異曲同工

C 結構體封裝模式與 Promise 鏈式調用&#xff1a;設計思想的異曲同工 在軟件開發中&#xff0c;我們常常追求代碼的可維護性、可擴展性和可讀性。不同的編程語言和場景下&#xff0c;雖然實現方式各異&#xff0c;但背后的設計思想往往存在著奇妙的相似性。本文將探討 C 中結…

【Go】1、Go語言基礎

前言 本系列文章參考自稀土掘金上的 【字節內部課】公開課&#xff0c;做自我學習總結整理。 Go語言的特點 Go語言由Google團隊設計&#xff0c;以簡潔、高效、并發友好為核心目標。 具有以下優點&#xff1a; 語法簡單、學習曲線平緩&#xff1a;語法關鍵字很少&#xff0c;且…

AI時代的新營銷范式:生成式引擎優化(GEO)的崛起——品牌如何被大模型收錄

在數字化浪潮席卷全球的今天&#xff0c;我們正站在一個前所未有的歷史拐點。如果說過去二十年&#xff0c;搜索引擎優化&#xff08;SEO&#xff09;重塑了企業與消費者的連接方式&#xff0c;那么未來二十年&#xff0c;生成式引擎優化&#xff08;GEO&#xff09;將徹底顛覆…

實用藍牙耳機哪款好?先做好使用場景分析!

市面上的藍牙耳機款式繁多&#xff0c;618到來之際&#xff0c;消費者如何選擇適合自己的藍牙耳機&#xff1f;實用藍牙耳機哪款好&#xff1f;關鍵在于做好使用場景分析&#xff01;今天&#xff0c;就帶大家結合不同的使用場景&#xff0c;分享三款倍思音頻的精品藍牙耳機。 …

PTA刷題筆記3(微難,有詳解)

7-15 計算圓周率 代碼如下&#xff1a; #include <stdio.h>int main() {double threshold;scanf("%lf", &threshold);double pi_over_2 1.0; // π/2的初始值&#xff08;第一項1&#xff09;double term 1.0; // 當前項的值int n 1; …

基于SpringBoot+Vue的社區醫院信息平臺設計與實現

項目背景與概述 隨著醫療健康信息化的發展&#xff0c;社區醫院的管理逐漸由傳統的手工模式轉向信息化管理。為了提高醫院的管理效率、減少人工操作、提升服務質量&#xff0c;開發一個高效且實用的社區醫院信息平臺顯得尤為重要。本系統基于Spring Boot框架與MySQL數據庫設計…

舊物回收小程序:讓閑置煥發光彩,為生活增添價值

你是否常常為家中堆積如山的閑置物品而煩惱&#xff1f;那些曾經心愛的物品&#xff0c;如今卻成了占據空間的“雞肋”&#xff0c;丟棄可惜&#xff0c;留著又無處安放。別擔心&#xff0c;一款舊物二手回收小程序將為你解決這一難題&#xff0c;讓閑置物品重新煥發光彩&#…

掩碼與網關是什么?

1. 子網掩碼&#xff08;Subnet Mask&#xff09; 作用&#xff1a;劃分“小區”范圍 想象你住在一個小區&#xff08;子網&#xff09;里&#xff1a; 小區門牌號 IP地址&#xff08;如 192.168.1.10&#xff09; 小區邊界 子網掩碼&#xff08;如 255.255.255.0&#xf…

【Bluedroid】藍牙HID Host disconnect流程源碼解析

本文基于 Android 藍牙 HID&#xff08;Human Interface Device&#xff09;Host 模塊的源碼&#xff0c;深入解析 HID 設備斷開連接的完整流程。重點覆蓋從應用層觸發斷開請求&#xff0c;到 BTIF 層&#xff08;接口適配層&#xff09;狀態校驗與異步傳遞、BTA 層&#xff08…

python定時刪除指定索引

腳本 import logging from datetime import datetime, timedelta from elasticsearch import Elasticsearch# 配置日志記錄 logging.basicConfig(filenamedelete_uat_indices.log,levellogging.INFO,format%(asctime)s - %(levelname)s - %(message)s )# Elasticsearch 集群的…

GESP編程等級認證C++三級7-字符、字符數組與字符串2

2.3 用字符串定義字符數組的好處 使用字符串定義字符數組需要額外考慮其末尾的“\0”&#xff0c;為什么還要使用這種看上去“麻煩”的方法呢&#xff1f;從圖5所示的代碼就能看出原因。 圖5 用字符串定義字符數組好處的代碼 從圖5中可以看出&#xff0c;a4是用字符串進行初始…

EasyRTC音視頻實時通話WebP2P技術賦能的全場景實時通信解決方案

一、技術背景 在數字化浪潮席卷全球的當下&#xff0c;實時通信技術憑借其即時性、高效性的優勢&#xff0c;已然成為推動各行業創新發展的核心動能。EasyRTC深度融合WebP2P技術&#xff0c;構建起去中心化的通信架構&#xff0c;實現了低延遲、高可靠的數據傳輸&#xff0c;為…