本文為博主原創,未經允許不得轉載:
1. JVM參數優化設置
kafka是scala語言開發,運行在JVM上,需要對JVM參數合理設置,修改bin/kafka-start-server.sh中的jvm設置
export KAFKA_HEAP_OPTS="‐Xmx16G ‐Xms16G ‐Xmn12G ‐XX:MetaspaceSize=256M ‐XX:+UseG1GC ‐XX:MaxGCPauseMillis=50"
這種大內存的情況一般都要用G1垃圾收集器,因為年輕代內存比較大,用G1可以設置GC最大停頓時間,不至於一次minor gc就花費太長時間
2. 消息丟失
消息發送端:
(1)acks=0: 表示producer不需要等待任何broker確認收到消息的回復,就可以繼續發送下一條消息。性能最高,但是最容息。
大數據統計報表場景,對性能要求很高,對數據丟失不敏感的情況可以用這種。
(2)acks=1: 至少要等待leader已經成功將數據寫入本地log,但是不需要等待所有follower是否成功寫入。就可以繼續發送下一條消
息。這種情況下,如果follower沒有成功備份數據,而此時leader又掛掉,則消息會丟失。
(3)acks=-1或all: 這意味着leader需要等待所有備份(min.insync.replicas配置的備份個數)都成功寫入日志,這種策略會保證只要有一
個備份存活就不會丟失數據。這是最強的數據保證。一般除非是金融級別,或跟錢打交道的場景才會使用這種配置。
如果min.insync.replicas配置的是1則也可能丟消息,跟acks=1情況類似。
消息消費端:
如果消費這邊配置的是自動提交,萬一消費到數據還沒處理完,就自動提交offset了,但是此時你consumer直接宕機了,未處理完的數據
丟失了,下次也消費不到了。
3、消息重復消費
消息發送端:
發送消息如果配置了重試機制,比如網絡抖動時間過長導致發送端發送超時,實際broker可能已經接收到消息,但發送方會重新發送消息
消息消費端:
如果消費這邊配置的是自動提交,剛拉取了一批數據處理了一部分,但還沒來得及提交,服務掛了,下次重啟又會拉取相同的一批數據重復處理
一般消費端都是要做消費冪等處理的。
4、 消息亂序
如果發送端配置了重試機制,kafka不會等之前那條消息完全發送成功才去發送下一條消息,這樣可能會出現,發送了1,2,3條消息,第一條超時了,
后面兩條發送成功,再重試發送第1條消息,這時消息在broker端的順序就是2,3,1了,所以,是否一定要配置重試要根據業務情況而定。也可以用
同步發送的模式去發消息,當然acks不能設置為0,這樣也能保證消息從發送端到消費端全鏈路有序。
5、消息積壓
1)線上有時因為發送方發送消息速度過快,或者消費方處理消息過慢,可能會導致broker積壓大量未消費消息。此種情況如果積壓了上百萬未消費
消息需要緊急處理,可以修改消費端程序,讓其將收到的消息快速轉發到其他topic(可以設置很多分區),然后再啟動多個消費者同時消費新主題的不同分區。
2)由於消息數據格式變動或消費者程序有bug,導致消費者一直消費不成功,也可能導致broker積壓大量未消費消息。此種情況可以將這些消費不成功的
消息轉發到其它隊列里去(類似死信隊列),后面再慢慢分析死信隊列里的消息處理問題。
6、延時隊列
延時隊列存儲的對象是延時消息。所謂的“延時消息”是指消息被發送以后,並不想讓消費者立刻獲取,而是等待特定的時間后,消費者才能獲取這個
消息進行消費,延時隊列的使用場景有很多, 比如 :
1)在訂單系統中, 一個用戶下單之后通常有 30 分鍾的時間進行支付,如果 30 分鍾之內沒有支付成功,那么這個訂單將進行異常處理,這時就可以
使用延時隊列來處理這些訂單了。
2)訂單完成1小時后通知用戶進行評價。
實現思路:
發送延時消息時先把消息按照不同的延遲時間段發送到指定的隊列中(topic_1s,topic_5s,topic_10s,...topic_2h,這個一般不能支持任意
時間段的延時),然后通過定時器進行輪訓消費這些topic,查看消息是否到期,如果到期就把這個消息發送到具體業務處理的topic中,隊列中消息越靠
前的到期時間越早,具體來說就是定時器在一次消費過程中,對消息的發送時間做判斷,看下是否延遲到對應時間了,如果到了就轉發,如果還沒到這
一次定時任務就可以提前結束了。
7、消息回溯
如果某段時間對已消費消息計算的結果覺得有問題,可能是由於程序bug導致的計算錯誤,當程序bug修復后,這時可能需要對之前已消費的消息
重新消費,可以指定從多久之前的消息回溯消費,這種可以用consumer的offsetsForTimes、seek等方法指定從某個offset偏移的消息開始消費
8、分區數越多吞吐量越高嗎
可以用kafka壓測工具自己測試分區數不同,各種情況下的吞吐量
# 往test里發送一百萬消息,每條設置1KB
# throughput 用來進行限流控制,當設定的值小於 0 時不限流,當設定的值大於 0 時,當發送的吞吐量大於該值時就會被阻塞一段時間
bin/kafka‐producer‐perf‐test.sh ‐‐topic test ‐‐num‐records 1000000 ‐‐record‐size 1024 ‐‐throughput ‐1 ‐‐producer‐props bootstrap.servers=112.125.26.60:9092 acks=1
分區數到達某個值吞吐量反而開始下降,實際上很多事情都會有一個臨界值,當超過這個臨界值之后,很多原本符合既定邏輯的走向又會變得不同。
一般情況分區數跟集群機器數量相當就差不多了。當然吞吐量的數值和走勢還會和磁盤、文件系統、 I/O調度策略等因素相關。
9、kafka 控制台管理工具:kafka-mamager
https://www.cnblogs.com/dadonggg/p/8205302.html