-
你們的專案怎么使用kafka?
我們采用kafka進行日志采集,準確點說是ELK方案,即elasticsearch + logstash + kibana + kafka,通過Spring AOP的方式收集日志,通過kafaka發送出去, -
kafa存在丟訊息的情況嗎,怎么解決?
- producer把訊息發送給broker,因為網路抖動,訊息沒有到達broker,且開發人員無感知,
解決方案:producer設定acks引數,訊息同步到master之后回傳ack信號,否則拋例外使應用程式感知到并在業務中進行重試發送,這種方式一定程度保證了訊息的可靠性,producer等待broker確認信號的時延也不高, - producer把訊息發送給broker-master,master接收到訊息,在未將訊息同步給follower之前,掛掉了,且開發人員無感知,
解決方案:producer設定acks引數,訊息同步到master且同步到所有follower之后回傳ack信號,否則拋例外使應用程式感知到并在業務中進行重試發送,這樣設定,在更大程度上保證了訊息的可靠性,缺點是producer等待broker確認信號的時延比較高, - producer把訊息發送給broker-master,master接收到訊息,master未成功將訊息同步給每個follower,有訊息丟失風險,
解決方案:同上, - 某個broker訊息尚未從記憶體緩沖區持久化到磁盤,就掛掉了,這種情況無法通過ack機制感知,
解決方案:設定引數,加快訊息持久化的頻率,能在一定程度上減少這種情況發生的概率,但提高頻率自然也會影響性能,
- producer把訊息發送給broker,因為網路抖動,訊息沒有到達broker,且開發人員無感知,
-
Kafka怎么做到高性能的?
- 順序寫磁盤:順序寫磁盤的性能比隨機寫入高很多倍,
- Page Cache:Kafka利用了作業系統本身的Page Cache,就是利用作業系統自身的記憶體而不是JVM空間記憶體,通過作業系統的Page Cache,Kafka的讀寫操作基本上是基于記憶體的,讀寫速度得到了極大的提升,
- 零拷貝技術:零拷貝技術,可以有效的減少背景關系切換和拷貝次數,
-
詳細說說零拷貝技術
傳統的讀取檔案資料并發送到網路的步驟如下:- 作業系統將資料從磁盤檔案中讀取到內核空間的頁面快取;
- 應用程式將資料從內核空間讀入用戶空間緩沖區;
- 應用程式將讀到資料寫回內核空間并放入socket緩沖區;
- 作業系統將資料從socket緩沖區復制到網卡介面,此時資料才能通過網路發送,
“零拷貝技術”只用將磁盤檔案的資料復制到頁面快取中一次,然后將資料從頁面快取直接發送到網路中(發送給不同的訂閱者時,都可以使用同一個頁面快取),避免了重復復制操作,如果有10個消費者,傳統方式下,資料復制次數為4*10=40次,而使用“零拷貝技術”只需要1+10=11次,一次為從磁盤復制到頁面快取,10次表示10個消費者各自讀取一次頁面快取,
參考(摘抄的文字著作權屬于原作者):
https://blog.csdn.net/qrne06/article/details/94225070
https://blog.csdn.net/assasin0308/article/details/91638528
https://www.jianshu.com/p/835ec2d4c170
https://blog.csdn.net/lxlmycsdnfree/article/details/78973864
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/6685.html
標籤:其他
