Python知識分享網(wǎng) - 專業(yè)的Python學習網(wǎng)站 學Python,上Python222
Kafka生產(chǎn)環(huán)境問題總結與性能優(yōu)化實踐 PDF 下載
發(fā)布于:2024-01-10 09:49:36
(假如點擊沒反應,多刷新兩次就OK!)

Kafka生產(chǎn)環(huán)境問題總結與性能優(yōu)化實踐 PDF 下載  圖1

 

 

 

資料內(nèi)容:

 

線上問題及優(yōu)化
1、消息丟失情況:
消息發(fā)送端:
(1)acks=0: 表示producer不需要等待任何broker確認收到消息的回復,就可以繼續(xù)發(fā)送下一條消息。性能最高,但是最容易丟消
息。大數(shù)據(jù)統(tǒng)計報表場景,對性能要求很高,對數(shù)據(jù)丟失不敏感的情況可以用這種。
(2)acks=1: 至少要等待leader已經(jīng)成功將數(shù)據(jù)寫入本地log,但是不需要等待所有follower是否成功寫入。就可以繼續(xù)發(fā)送下一條消
息。這種情況下,如果follower沒有成功備份數(shù)據(jù),而此時leader又掛掉,則消息會丟失。
(3)acks=-1或all: 這意味著leader需要等待所有備份(min.insync.replicas配置的備份個數(shù))都成功寫入日志,這種策略會保證只要有一
個備份存活就不會丟失數(shù)據(jù)。這是最強的數(shù)據(jù)保證。一般除非是金融級別,或跟錢打交道的場景才會使用這種配置。當然如果
min.insync.replicas配置的是1則也可能丟消息,跟acks=1情況類似。
消息消費端:
如果消費這邊配置的是自動提交,萬一消費到數(shù)據(jù)還沒處理完,就自動提交offset了,但是此時你consumer直接宕機了,未處理完的數(shù)據(jù)
丟失了,下次也消費不到了。
2、消息重復消費
消息發(fā)送端:
發(fā)送消息如果配置了重試機制,比如網(wǎng)絡抖動時間過長導致發(fā)送端發(fā)送超時,實際broker可能已經(jīng)接收到消息,但發(fā)送方會重新發(fā)送消息
消息消費端:
如果消費這邊配置的是自動提交,剛拉取了一批數(shù)據(jù)處理了一部分,但還沒來得及提交,服務掛了,下次重啟又會拉取相同的一批數(shù)據(jù)重
復處理
一般消費端都是要做消費冪等處理的。
3、消息亂序
如果發(fā)送端配置了重試機制,kafka不會等之前那條消息完全發(fā)送成功才去發(fā)送下一條消息,這樣可能會出現(xiàn),發(fā)送了1,2,3條消息,第
一條超時了,后面兩條發(fā)送成功,再重試發(fā)送第1條消息,這時消息在broker端的順序就是2,3,1了
所以,是否一定要配置重試要根據(jù)業(yè)務情況而定。也可以用同步發(fā)送的模式去發(fā)消息,當然acks不能設置為0,這樣也能保證消息從發(fā)送
端到消費端全鏈路有序。
kafka保證全鏈路消息順序消費,需要從發(fā)送端開始,將所有有序消息發(fā)送到同一個分區(qū),然后用一個消費者去消費,但是這種性能比較
低,可以在消費者端接收到消息后將需要保證順序消費的幾條消費發(fā)到內(nèi)存隊列(可以搞多個),一個內(nèi)存隊列開啟一個線程順序處理消
息。
4、消息積壓
1)線上有時因為發(fā)送方發(fā)送消息速度過快,或者消費方處理消息過慢,可能會導致broker積壓大量未消費消息。
此種情況如果積壓了上百萬未消費消息需要緊急處理,可以修改消費端程序,讓其將收到的消息快速轉(zhuǎn)發(fā)到其他topic(可以設置很多分
區(qū)),然后再啟動多個消費者同時消費新主題的不同分區(qū)。
2)由于消息數(shù)據(jù)格式變動或消費者程序有bug,導致消費者一直消費不成功,也可能導致broker積壓大量未消費消息。
此種情況可以將這些消費不成功的消息轉(zhuǎn)發(fā)到其它隊列里去(類似死信隊列),后面再慢慢分析死信隊列里的消息處理問題。
5、延時隊列
延時隊列存儲的對象是延時消息。所謂的“延時消息”是指消息被發(fā)送以后,并不想讓消費者立刻獲取,而是等待特定的時間后,消費者
才能獲取這個消息進行消費,延時隊列的使用場景有很多, 比如 :
1)在訂單系統(tǒng)中, 一個用戶下單之后通常有 30 分鐘的時間進行支付,如果 30 分鐘之內(nèi)沒有支付成功,那么這個訂單將進行異常處理,
這時就可以使用延時隊列來處理這些訂單了。
2)訂單完成1小時后通知用戶進行評價。
實現(xiàn)思路:發(fā)送延時消息時先把消息按照不同的延遲時間段發(fā)送到指定的隊列中(topic_1s,topic_5s,topic_10s,...topic_2h,這個一
般不能支持任意時間段的延時),然后通過定時器進行輪訓消費這些topic,查看消息是否到期,如果到期就把這個消息發(fā)送到具體業(yè)務處
理的topic中,隊列中消息越靠前的到期時間越早,具體來說就是定時器在一次消費過程中,對消息的發(fā)送時間做判斷,看下是否延遲到對
應時間了,如果到了就轉(zhuǎn)發(fā),如果還沒到這一次定時任務就可以提前結束了。
6、消息回溯
如果某段時間對已消費消息計算的結果覺得有問題,可能是由于程序bug導致的計算錯誤,當程序bug修復后,這時可能需要對之前已消
費的消息重新消費,可以指定從多久之前的消息回溯消費,這種可以用consumer的offsetsForTimes、seek等方法指定從某個offset偏移
的消息開始消費,參見上節(jié)課的內(nèi)容。
7、分區(qū)數(shù)越多吞吐量越高嗎
可以用kafka壓測工具自己測試分區(qū)數(shù)不同,各種情況下的吞吐量
1
# 往test里發(fā)送一百萬消息,每條設置1KB
2
# throughput 用來進行限流控制,當設定的值小于 0 時不限流,當設定的值大于 0 時,當發(fā)送的吞吐量大于該值時就會被阻塞一段時間
3
bin/kafka‐producer‐perf‐test.sh ‐‐topic test ‐‐num‐records 1000000 ‐‐record‐size 1024 ‐‐throughput ‐1
4
‐‐producer‐props bootstrap.servers=192.168.65.60:9092 acks=1