云原生時代 Kafka 深度實踐:05性能調優與場景實戰

5.1 性能調優全攻略

Producer調優

批量發送與延遲發送

通過調整batch.sizelinger.ms參數提升吞吐量:

props.put(ProducerConfig.BATCH_SIZE_CONFIG, 16384);  // 默認16KB
props.put(ProducerConfig.LINGER_MS_CONFIG, 10);      // 等待10ms以積累更多消息
  • batch.size:批量發送的字節數,達到該大小或linger.ms超時即發送。
  • linger.ms:消息在緩沖區的最大停留時間,即使未達到batch.size也會發送。
壓縮算法選擇

啟用壓縮可顯著減少網絡傳輸和磁盤存儲開銷:

props.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "lz4");  // 可選:gzip、snappy、lz4、zstd
  • Snappy:壓縮速度快,壓縮比適中。
  • LZ4:壓縮比和速度平衡,推薦大多數場景。
  • ZSTD:壓縮比最高,但CPU開銷較大。

Broker調優

內存與線程配置

調整Broker的網絡和IO線程池大小:

# server.properties
num.network.threads=8    # 網絡處理線程數,默認3
num.io.threads=16        # IO處理線程數,默認8
socket.send.buffer.bytes=102400  # 發送緩沖區大小,默認100KB
socket.receive.buffer.bytes=102400  # 接收緩沖區大小,默認100KB
磁盤與日志管理

優化日志存儲和清理策略:

# 日志段滾動大小,默認1GB
log.segment.bytes=536870912  # 日志保留時間,默認7天
log.retention.hours=168  # 日志清理策略:delete(按時間刪除)或compact(按key壓縮)
log.cleanup.policy=delete  # 后臺日志清理線程數
log.cleaner.threads=2  

Consumer調優

并行消費與反序列化優化

增加Consumer實例數或使用多線程消費:

// 增加Consumer Group中的Consumer數量,實現分區級并行
KafkaConsumer<String, String> consumer1 = new KafkaConsumer<>(props);
KafkaConsumer<String, String> consumer2 = new KafkaConsumer<>(props);
consumer1.subscribe(Collections.singletonList("topic"));
consumer2.subscribe(Collections.singletonList("topic"));// 或在單個Consumer中使用多線程處理消息
ExecutorService executor = Executors.newFixedThreadPool(10);
while (true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100));for (ConsumerRecord<String, String> record : records) {executor.submit(() -> process(record));}
}

使用高效的序列化格式(如Protobuf替代JSON):

props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, ProtobufSerializer.class.getName());
props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, ProtobufDeserializer.class.getName());

5.2 實戰場景模擬

場景一:高并發日志采集(每秒10W+消息寫入)

架構設計
  • Topic配置:創建100個分區的Topic,利用多分區并行寫入提升吞吐量。
  • Producer配置
    props.put(ProducerConfig.BATCH_SIZE_CONFIG, 32768);    // 32KB批次
    props.put(ProducerConfig.LINGER_MS_CONFIG, 5);        // 5ms延遲
    props.put(ProducerConfig.COMPRESSION_TYPE_CONFIG, "lz4");
    props.put(ProducerConfig.ACKS_CONFIG, "1");           // 犧牲部分可靠性換取高吞吐量
    
  • Broker配置
    num.partitions=100                   # 默認分區數
    log.flush.interval.messages=100000   # 每10W條消息刷盤一次
    log.flush.interval.ms=10000          # 每10秒刷盤一次
    
性能測試

使用kafka-producer-perf-test.sh工具測試寫入性能:

bin/kafka-producer-perf-test.sh --topic log-topic --num-records 10000000 \--record-size 100 --throughput -1 --producer-props bootstrap.servers=localhost:9092

場景二:實時數據分析(電商實時大屏)

數據流設計
  1. 數據源:用戶瀏覽、下單、支付等行為數據實時寫入Kafka。
  2. 流處理:Kafka Streams計算實時指標(如UV、GMV、轉化率):
KStream<String, String> userEvents = builder.stream("user-events-topic");
KTable<Windowed<String>, Long> hourlyUV = userEvents.selectKey((key, value) -> value.getUserId()).groupByKey().windowedBy(TimeWindows.of(Duration.ofHours(1))).count(Materialized.as("hourly-uv-store"));hourlyUV.toStream().map((windowedKey, count) -> new KeyValue<>(windowedKey.key(), count)).to("hourly-uv-topic", Produced.with(Serdes.String(), Serdes.Long()));
  1. 結果存儲:計算結果寫入Redis,供前端大屏實時查詢。
性能優化
  • Kafka配置
    # 減少消息延遲
    queued.max.requests=1000
    replica.lag.time.max.ms=30000
    
  • Kafka Streams配置
    config.put(StreamsConfig.CACHE_MAX_BYTES_BUFFERING_CONFIG, 10 * 1024 * 1024);  // 10MB緩存
    config.put(StreamsConfig.COMMIT_INTERVAL_MS_CONFIG, 1000);  // 1秒提交一次
    

場景三:金融級數據一致性(事務消息實現分布式事務)

架構設計
  1. 訂單服務:接收用戶訂單請求,發送訂單創建消息到Kafka。
  2. 庫存服務:消費訂單消息,扣減庫存,發送庫存扣減結果。
  3. 支付服務:消費庫存扣減結果,處理支付,發送支付結果。
事務消息實現
// 初始化事務
producer.initTransactions();try {producer.beginTransaction();// 發送訂單創建消息producer.send(new ProducerRecord<>("order-topic", orderId, order));// 執行本地事務(如更新訂單狀態)orderService.updateOrderStatus(orderId, "PROCESSING");// 提交事務producer.commitTransaction();
} catch (Exception e) {// 回滾事務producer.abortTransaction();
}
冪等性保障

消費端通過唯一ID去重,確保同一消息只處理一次:

@KafkaListener(topics = "inventory-topic")
public void processInventory(InventoryMessage message) {// 檢查是否已處理過if (inventoryService.isProcessed(message.getId())) {return;}// 處理庫存扣減inventoryService.decreaseStock(message.getProductId(), message.getQuantity());// 標記為已處理inventoryService.markAsProcessed(message.getId());
}

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

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

相關文章

在 Dify 項目中的 Celery:異步任務的實現與集成

Celery 是一個強大而靈活的分布式任務隊列系統&#xff0c;旨在幫助應用程序在后臺異步運行耗時的任務&#xff0c;提高系統的響應速度和性能。在 Dify 項目中&#xff0c;Celery 被廣泛用于處理異步任務和定時任務&#xff0c;并與其他工具&#xff08;如 Sentry、OpenTelemet…

Pytorch Geometric官方例程pytorch_geometric/examples/link_pred.py環境安裝教程及圖數據集制作

最近需要訓練圖卷積神經網絡&#xff08;Graph Convolution Neural Network, GCNN&#xff09;&#xff0c;在配置GCNN環境上總結了一些經驗。 我覺得對于初學者而言&#xff0c;圖神經網絡的訓練會有2個難點&#xff1a; ①環境配置 ②數據集制作 一、環境配置 我最初光想…

2025年微信小程序開發:AR/VR與電商的最新案例

引言 微信小程序自2017年推出以來&#xff0c;已成為中國移動互聯網生態的核心組成部分。根據最新數據&#xff0c;截至2025年&#xff0c;微信小程序的日活躍用戶超過4.5億&#xff0c;總數超過430萬&#xff0c;覆蓋電商、社交、線下服務等多個領域&#xff08;WeChat Mini …

互聯網向左,區塊鏈向右

2008年&#xff0c;中本聰首次提出了比特幣的設想&#xff0c;這打開了去中心化的大門。 比特幣白皮書清晰的描述了去中心化支付的解決方案&#xff0c;并分別從以下幾個方面闡述了他的理念&#xff1a; 一、由轉賬雙方點對點的通訊&#xff0c;而不通過中心化的第三方&#xf…

PV操作的C++代碼示例講解

文章目錄 一、PV操作基本概念&#xff08;一&#xff09;信號量&#xff08;二&#xff09;P操作&#xff08;三&#xff09;V操作 二、PV操作的意義三、C中實現PV操作的方法&#xff08;一&#xff09;使用信號量實現PV操作代碼解釋&#xff1a; &#xff08;二&#xff09;使…

《對象創建的秘密:Java 內存布局、逃逸分析與 TLAB 優化詳解》

大家好呀&#xff01;今天我們來聊聊Java世界里那些"看不見摸不著"但又超級重要的東西——對象在內存里是怎么"住"的&#xff0c;以及JVM這個"超級管家"是怎么幫我們優化管理的。放心&#xff0c;我會用最接地氣的方式講解&#xff0c;保證連小學…

簡單實現Ajax基礎應用

Ajax不是一種技術&#xff0c;而是一個編程概念。HTML 和 CSS 可以組合使用來標記和設置信息樣式。JavaScript 可以修改網頁以動態顯示&#xff0c;并允許用戶與新信息進行交互。內置的 XMLHttpRequest 對象用于在網頁上執行 Ajax&#xff0c;允許網站將內容加載到屏幕上而無需…

詳解開漏輸出和推挽輸出

開漏輸出和推挽輸出 以上是 GPIO 配置為輸出時的內部示意圖&#xff0c;我們要關注的其實就是這兩個 MOS 管的開關狀態&#xff0c;可以組合出四種狀態&#xff1a; 兩個 MOS 管都關閉時&#xff0c;輸出處于一個浮空狀態&#xff0c;此時他對其他點的電阻是無窮大的&#xff…

Matlab實現LSTM-SVM回歸預測,作者:機器學習之心

Matlab實現LSTM-SVM回歸預測&#xff0c;作者&#xff1a;機器學習之心 目錄 Matlab實現LSTM-SVM回歸預測&#xff0c;作者&#xff1a;機器學習之心效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 代碼主要功能 該代碼實現了一個LSTM-SVM回歸預測模型&#xff0c;核心流…

Leetcode - 周賽 452

目錄 一&#xff0c;3566. 等積子集的劃分方案二&#xff0c;3567. 子矩陣的最小絕對差三&#xff0c;3568. 清理教室的最少移動四&#xff0c;3569. 分割數組后不同質數的最大數目 一&#xff0c;3566. 等積子集的劃分方案 題目列表 本題有兩種做法&#xff0c;dfs 選或不選…

【FAQ】HarmonyOS SDK 閉源開放能力 —Account Kit(5)

1.問題描述&#xff1a; 集成華為一鍵登錄的LoginWithHuaweiIDButton&#xff0c; 但是Button默認名字叫 “華為賬號一鍵登錄”&#xff0c;太長無法顯示&#xff0c;能否簡寫成“一鍵登錄”與其他端一致&#xff1f; 解決方案&#xff1a; 問題分兩個場景&#xff1a; 一、…

Asp.Net Core SignalR的分布式部署

文章目錄 前言一、核心二、解決方案架構三、實現方案1.使用 Azure SignalR Service2.Redis Backplane(Redis 背板方案&#xff09;3.負載均衡配置粘性會話要求無粘性會話方案&#xff08;僅WebSockets&#xff09;完整部署示例&#xff08;Redis Docker&#xff09;性能優化技…

L2-054 三點共線 - java

L2-054 三點共線 語言時間限制內存限制代碼長度限制棧限制Java (javac)2600 ms512 MB16KB8192 KBPython (python3)2000 ms256 MB16KB8192 KB其他編譯器2000 ms64 MB16KB8192 KB 題目描述&#xff1a; 給定平面上 n n n 個點的坐標 ( x _ i , y _ i ) ( i 1 , ? , n ) (x\_i…

【 java 基礎知識 第一篇 】

目錄 1.概念 1.1.java的特定有哪些&#xff1f; 1.2.java有哪些優勢哪些劣勢&#xff1f; 1.3.java為什么可以跨平臺&#xff1f; 1.4JVM,JDK,JRE它們有什么區別&#xff1f; 1.5.編譯型語言與解釋型語言的區別&#xff1f; 2.數據類型 2.1.long與int類型可以互轉嗎&…

高效背誦英語四級范文

以下是結合認知科學和實戰驗證的 ??高效背誦英語作文五步法??&#xff0c;助你在30分鐘內牢固記憶一篇作文&#xff0c;特別適配考前沖刺場景&#xff1a; &#x1f4dd; ??一、解構作文&#xff08;5分鐘&#xff09;?? ??拆解邏輯框架?? 用熒光筆標出&#xff…

RHEL7安裝教程

RHEL7安裝教程 下載RHEL7鏡像 通過網盤分享的文件&#xff1a;RHEL 7.zip 鏈接: https://pan.baidu.com/s/1ExLhdJigj-tcrHJxIca5XA?pwdjrrj 提取碼: jrrj --來自百度網盤超級會員v6的分享安裝 1.打開VMware&#xff0c;新建虛擬機&#xff0c;選擇自定義然后下一步 2.點擊…

結構型設計模式之Decorator(裝飾器)

結構型設計模式之Decorator&#xff08;裝飾器&#xff09; 前言&#xff1a; 本案例通過李四舉例&#xff0c;不改變源代碼的情況下 對“才藝”進行增強。 摘要&#xff1a; 摘要&#xff1a; 裝飾器模式是一種結構型設計模式&#xff0c;允許動態地為對象添加功能而不改變其…

Kotlin委托機制使用方式和原理

目錄 類委托屬性委托簡單的實現屬性委托Kotlin標準庫中提供的幾個委托延遲屬性LazyLazy委托參數可觀察屬性Observable委托vetoable委托屬性儲存在Map中 實踐方式雙擊back退出Fragment/Activity傳參ViewBinding和委托 類委托 類委托有點類似于Java中的代理模式 interface Base…

SpringBoot接入Kimi實踐記錄輕松上手

kimi簡單使用 什么是Kimi API 官網&#xff1a;https://platform.moonshot.cn/ Kimi API 并不是一個我所熟知的廣泛通用的術語。我的推測是&#xff0c;你可能想問的是關于 API 的一些基礎知識。API&#xff08;Application Programming Interface&#xff0c;應用程序編程接…

書籍在其他數都出現k次的數組中找到只出現一次的數(7)0603

題目 給定一個整型數組arr和一個大于1的整數k。已知arr中只有1個數出現了1次&#xff0c;其他的數都出現了k次&#xff0c;請返回只出現了1次的數。 解答&#xff1a; 對此題進行思路轉換&#xff0c;可以將此題&#xff0c;轉換成k進制數。 k進制的兩個數c和d&#xff0c;…