網站首頁 編程語言 正文
Kafka中產生數據積壓的原因以及解決方案
1、kafka中數據積壓的原因
kafka作為消息隊列,其中數據積壓也是經常遇到的問題之一。
我們都知道,數據積壓的直接原因,一定是系統中的某個部分出現了性能問題,來不及處理上游發送的數據,才會導致數據積壓。
那么我們就需要分析在使用kafka時,如何通過優化代碼以及參數配置來最大程度的避免數據積壓來對業務中的影響。
2、kafka中數據積壓的解決方案
首先我們在上面分析得出,是由于上游生產者producer發送數據過快,以及下游消費者consumer拉取數據過慢,實質上就是,生產者生產數據速度>>消費者消費數據速度。那么就可以把問題定位到生產者producer以及消費者consumer這兩方面上。
1、生產者producer:吞吐量
可以通過修改以下參數配置提提升生產者的吞吐量:
1)batch.memory修改緩沖區大小
設置發送消息的緩沖區,默認值是33554432,就是32MB
如果發送消息出去的速度小于寫入消息進去的速度,就會導致緩沖區寫滿,此時生產消息就會阻塞住,所以說這里就應該多做一些壓測,盡可能保證說這塊緩沖區不會被寫滿導致生產行為被阻塞住。
2)compression.type壓縮格式
默認是none,不壓縮,但是也可以使用lz4壓縮,效率還是不錯的,壓縮之后可以減小數據量,提升吞吐量,但是會加大producer端的cpu開銷。
3)batch.size批次大小
設置merge batch合并批次消息的大小
如果 batch 批次太小,會導致頻繁網絡請求,吞吐量下降;
如果batch批次太大,會導致一條消息需要等待很久才能被發送出去,而且會讓內存緩沖區有很大壓力,過多數據緩沖在內存里。
默認值是:16384,就是16kb,也就是一個batch批次滿了16kb就發送出去,一般在實際生產環境,這個batch批次的值可以增大一些來提升吞吐量,可以自己壓測一下。
4)linger.ms等待時長
這個值默認是0,意思就是消息必須立即被發送,但是這是不對的。
一般設置一個100毫秒之類的,這樣的話就是說,這個消息被發送出去后進入一個batch批次,如果100毫秒內,這個batch批次滿了16kb,自然就會發送出去。
但是如果100毫秒內,batch沒滿,那么也必須把消息發送出去了,不能讓消息的發送延遲時間太長,也避免給內存造成過大的一個壓力。
2、消費者consum :擴容,擴分區;增加consumer
1)提升消費者組中的消費者數以及Topic中的分區數,讓二者相等,假設設置為3個分區 = 3CPU。
2)提高消費者拉取數據的能力,比如Flume每次拉取的數據可以由1000條改為3000條、Spark中將限流的參數增大、Flink中保證數據的處理效率等。
3、數據積壓分析V2.0
日常系統正常運轉的時候,沒有積壓或者只有少量積壓很快就消費掉了,但是某一個時刻,突然就開始積壓消息并且積壓持續上漲。
這種情況下需要你在短時間內找到消息積壓的原因,迅速解決問題才不至于影響業務。
導致突然積壓的原因肯定是多種多樣的,不同的系統、不同的情況有不同的原因,不能一概而論。
但是,我們排查消息積壓原因,是有一些相對固定而且比較有效的方法的。
能導致積壓突然增加,最粗粒度的原因,只有兩種:
1、要么是發送變快了,2、要么是消費變慢了。
大部分消息隊列都內置了監控的功能,只要通過監控數據,很容易確定是哪種原因。
如果是單位時間發送的消息增多,比如說是趕上大促或者搶購,短時間內不太可能優化消費端的代碼來提升消費性能,唯一的方法是通過擴容消費端的實例數來提升總體的消費能力。
如果短時間內沒有足夠的服務器資源進行擴容,沒辦法的辦法是,將系統降級,通過關閉一些不重要的業務,減少發送方發送的數據量,最低限度讓系統還能正常運轉,服務一些重要業務。
還有一種不太常見的情況,你通過監控發現,無論是發送消息的速度還是消費消息的速度和原來都沒什么變化,這時候你需要檢查一下你的消費端,是不是消費失敗導致的一條消息反復消費這種情況比較多,這種情況也會拖慢整個系統的消費速度。
如果監控到消費變慢了,你需要檢查你的消費實例,分析一下是什么原因導致消費變慢。
優先檢查一下日志是否有大量的消費錯誤,如果沒有錯誤的話,可以通過打印堆棧信息,看一下你的消費線程是不是卡在什么地方不動了,比如觸發了死鎖或者卡在等待某些資源上了。
原文鏈接:https://blog.csdn.net/qq_43727170/article/details/126593216
相關推薦
- 2022-09-23 WPF仿微信實現截圖功能的方法詳解_C#教程
- 2022-08-06 Qt編寫顯示密碼強度的控件_C 語言
- 2022-07-10 詳解BlockingQueue阻塞隊列的使用
- 2022-09-19 Redis緩存穿透/擊穿工具類的封裝_Redis
- 2022-04-23 二次開發element el-tooltip+span 超出文本部分顯示省略號鼠標懸浮顯示全部內容
- 2022-07-10 docker的安裝及常用命令
- 2022-07-12 Linux中xargs命令的用法
- 2022-06-15 如何在python?中導入?package_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支