面試連環炮系列(二十一):你們的項目怎么使用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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM