好多kafka難題啊,看看其中的化解之道

王中阳Go1發表於2024-08-30

文末有面經共享群

前面已經分享過幾篇面試了,這是一篇關於更加面向專案和技術的面經詳解,第一次遇見問那麼多kafka的問題,看看這個粉絲是怎麼回答的。

先來看看 職位描述

崗位職責:

  • 負責基於 Go 的後端服務的設計、開發和維護;
  • 參與系統架構設計,確保系統的高可用性、高效能和可擴充套件性;
  • 編寫高質量、可維護的程式碼,並進行程式碼評審;
  • 解決複雜的技術問題,最佳化系統效能;
  • 與跨職能團隊合作,確保專案按時交付;
  • 編寫技術文件和開發規範,提升團隊整體開發效率;
  • 參與新技術的研究和引入,推動技術創新。

崗位要求:

  1. 電腦科學或相關專業本科及以上學歷,思維邏輯清晰;
  2. 5年以上軟體開發經驗,至少3年Go語言開發經驗;
  3. 熟悉 Go 語言的標準庫和常用框架,瞭解 Go 語言的記憶體管理和併發模型;
  4. 具備微服務架構設計和開發經驗,熟悉 gRPC、Protobuf 等技術;
  5. 熟悉常見的資料庫(如 MySQL、PostgreSQL)和快取技術(如 Redis);
  6. 有良好的程式碼風格和編寫高質量單元測試的習慣;
  7. 熟悉 Docker、Kubernetes 等容器技術,具備一定的 DevOps 經驗;
  8. 具備較強的分析和解決問題的能力,良好的溝通和團隊協作能力;
  9. 有開源專案貢獻者或個人技術部落格者優先。

加分項:

  • 有 Rust 開發經驗,熟悉其他程式語言(如 Python、C++等);
  • 有金融行業交易系統開發經驗,如行情報價、交易、風控等。

面試流程

來看看面試的全過程:

  1. 自我介紹

  2. 說一下專案的業務,怎麼做的,難點在哪,如何解決?

    • 訊息佇列:資料傾斜問題,資料不丟,重複消費
    • redis:使用hash以及Pipline,bigkey拆解
    • 資料庫:效能最佳化,分庫分表
  3. 資料庫最佳化設定lock_timeout是哪個鎖的超時

    資料庫最佳化設定中的 lock_timeout 主要是針對行鎖的超時設定。當一個事務在等待獲取行鎖時,如果超過了 lock_timeout 設定的時間,就會丟擲超時錯誤,避免事務長時間等待而導致系統效能下降。

  4. kafka叢集規模

    我們的 Kafka 叢集規模為 5 臺伺服器,能夠支援 50 萬的併發量。透過合理的配置和最佳化,我們可以進一步提高 Kafka 叢集的效能和併發能力。

  5. kafka為什麼支援高併發

    Kafka 支援高併發主要有以下幾個原因:

    1. 分割槽:Kafka 將資料分成多個分割槽,每個分割槽可以在不同的伺服器上進行儲存和處理,從而實現了水平擴充套件,提高了系統的併發能力。
    2. 零複製:Kafka 採用了零複製技術,減少了資料在記憶體中的複製次數,提高了資料的傳輸效率。
    3. 網路壓縮:Kafka 支援網路壓縮,可以減少網路傳輸的資料量,提高系統的效能和併發能力。
  6. 說一下什麼是零複製

    零複製是一種技術,主要透過減少資料在記憶體中的複製次數來提高資料的傳輸效率。在 Kafka 中,零複製技術主要透過使用 mmap 函式實現。mmap 函式將檔案對映到記憶體中,使得應用程式可以直接訪問檔案內容,而不需要進行資料的複製。這樣可以減少資料在記憶體中的複製次數,提高資料的傳輸效率。

  7. 為什麼選擇kafka

    首先,Kafka 具有很高的併發處理能力,能夠滿足金融交易系統對高吞吐量的要求。其次,Kafka 的擴容性非常好,可以很容易地增加伺服器節點來提高系統的效能。此外,Kafka 天生適合叢集部署,並且使用 Java 和 Scala 編寫,便於進行問題排查和維護。相比之下,RabbitMQ 的叢集部署相對複雜,而且使用 Erlang 語言,對於一些開發人員來說可能不太熟悉,問題排查也比較困難。

  8. Api 閘道器用來做什麼的?

    Api 閘道器主要用於對第三方呼叫進行流量限制和安全控制。它可以對請求進行過濾、路由和負載均衡,確保系統的穩定性和安全性。同時,Api 閘道器還可以提供一些額外的功能,如身份驗證、授權、監控和統計等。

  9. 支付模組這塊怎麼做的

    參與的專案中,支付模組是由其他同事負責開發的。我主要是透過呼叫支付模組提供的 API 來實現相關業務功能。在呼叫 API 時,我會確保引數的正確性和安全性,同時對返回結果進行合理的處理和錯誤處理。

  10. 說一下你們微服務的架構是怎麼樣的

    我們的系統採用了無服務和微服務的混合架構。這種架構可以充分發揮無服務架構的彈性和高效性,同時又能利用微服務架構的靈活性和可擴充套件性。在具體實現中,我們將一些通用的功能模組封裝成無服務函式,透過事件驅動的方式進行呼叫。而對於一些複雜的業務模組,則採用微服務架構,進行獨立開發和部署。

  11. 差分升級是怎麼實現的

    透過對比不同版本的程式碼,找出差異部分,然後將這些差異部分抽取出來進行計算 MD5 值等操作,以確定是否需要進行升級。在升級過程中,我們會確保資料的完整性和一致性,同時儘量減少對系統的影響。

  12. 編譯服務類似CI/CD

    透過修改 Git 命令,實現了類似於 Web Hook 的功能。當有程式碼提交併打上 tag 時,系統會自動進行 Git clone 操作,然後進行測試和編譯。這樣可以確保程式碼的質量和穩定性,同時提高開發效率。

  13. C/C++是開發韌體的吧

    是的,我曾經使用 C/C++ 和 Lua 的組合開發過智慧閘道器。不過,由於我這次是應聘後端開發崗位,所以沒有將這部分內容寫在簡歷中。

  14. 你很喜歡用redis?

    是的,我非常喜歡使用 Redis。Redis 就像一個資料結構資料庫,它提供了豐富的資料結構和操作介面,使用起來非常方便。在專案中,我們使用 Redis 實現了很多業務功能,比如快取熱點資料、實現分散式鎖、進行任務佇列管理等。

  15. 反問

結尾

大家可以看出來,在這場深入的技術面試中,需要應試者具備強大的技術功底和應對各種挑戰的能力。面試官詢問的方向好像大多是 Kafka 的高併發處理的問題,不知道這次的面經有沒有給你帶來哪些學習要點呢?也希望透過分享這位面試者的經歷,能給正在求職或致力於技術提升的你帶來啟發和幫助。

歡迎關注 ❤

我們搞了一個免費的面試真題共享群,互通有無,一起刷題進步。

沒準能讓你能刷到自己意向公司的最新面試題呢。

感興趣的朋友們可以加我微信:wangzhongyang1993,備註:【部落格園】。

相關文章