天天看點

面試連環炮系列(二十一):你們的項目怎麼使用kafka

  1. 你們的項目怎麼使用kafka?

    我們采用kafka進行日志采集,準确點說是ELK方案,即elasticsearch + logstash + kibana + kafka。通過Spring AOP的方式收集日志,通過kafaka發送出去。

  2. kafa存在丢消息的情況嗎,怎麼解決?
    1. producer把消息發送給broker,因為網絡抖動,消息沒有到達broker,且開發人員無感覺。

      解決方案:producer設定acks參數,消息同步到master之後傳回ack信号,否則抛異常使應用程式感覺到并在業務中進行重試發送。這種方式一定程度保證了消息的可靠性,producer等待broker确認信号的時延也不高。

    2. producer把消息發送給broker-master,master接收到消息,在未将消息同步給follower之前,挂掉了,且開發人員無感覺。

      解決方案:producer設定acks參數,消息同步到master且同步到所有follower之後傳回ack信号,否則抛異常使應用程式感覺到并在業務中進行重試發送。這樣設定,在更大程度上保證了消息的可靠性,缺點是producer等待broker确認信号的時延比較高。

    3. producer把消息發送給broker-master,master接收到消息,master未成功将消息同步給每個follower,有消息丢失風險。

      解決方案:同上。

    4. 某個broker消息尚未從記憶體緩沖區持久化到磁盤,就挂掉了,這種情況無法通過ack機制感覺。

      解決方案:設定參數,加快消息持久化的頻率,能在一定程度上減少這種情況發生的機率。但提高頻率自然也會影響性能。

  3. Kafka怎麼做到高性能的?
    1. 順序寫磁盤:順序寫磁盤的性能比随機寫入高很多倍。
    2. Page Cache:Kafka利用了作業系統本身的Page Cache,就是利用作業系統自身的記憶體而不是JVM空間記憶體。通過作業系統的Page Cache,Kafka的讀寫操作基本上是基于記憶體的,讀寫速度得到了極大的提升。
    3. 零拷貝技術:零拷貝技術,可以有效的減少上下文切換和拷貝次數。
  4. 詳細說說零拷貝技術

    傳統的讀取檔案資料并發送到網絡的步驟如下:

    1. 作業系統将資料從磁盤檔案中讀取到核心空間的頁面緩存;
    2. 應用程式将資料從核心空間讀入使用者空間緩沖區;
    3. 應用程式将讀到資料寫回核心空間并放入socket緩沖區;
    4. 作業系統将資料從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.cnblogs.com/xiaoyangjia/

本文版權歸作者和部落格園共有,任何人或團體、機構全部轉載或者部分轉載、摘錄,請在文章明顯位置注明作者和原文連結。

繼續閱讀