分享一篇粉絲朋友整理的面經,第一次遇見問那么多kafka的問題,看看他是怎么回答的。
先來看看 職位描述:
崗位職責:
- 負責基于 Go 的后端服務的設計、開發和維護;
- 參與系統架構設計,確保系統的高可用性、高性能和可擴展性;
- 編寫高質量、可維護的代碼,并進行代碼評審;
- 解決復雜的技術問題,優化系統性能;
- 與跨職能團隊合作,確保項目按時交付;
- 編寫技術文檔和開發規范,提升團隊整體開發效率;
- 參與新技術的研究和引入,推動技術創新。
崗位要求:
- 計算機科學或相關專業本科及以上學歷,思維邏輯清晰;
- 5年以上軟件開發經驗,至少3年Go語言開發經驗;
- 熟悉 Go 語言的標準庫和常用框架,了解 Go 語言的內存管理和并發模型;
- 具備微服務架構設計和開發經驗,熟悉 gRPC、Protobuf 等技術;
- 熟悉常見的數據庫(如 MySQL、PostgreSQL)和緩存技術(如 Redis);
- 有良好的代碼風格和編寫高質量單元測試的習慣;
- 熟悉 Docker、Kubernetes 等容器技術,具備一定的 DevOps 經驗;
- 具備較強的分析和解決問題的能力,良好的溝通和團隊協作能力;
- 有開源項目貢獻者或個人技術博客者優先。
加分項:
- 有 Rust 開發經驗,熟悉其他編程語言(如 Python、C++等);
- 有金融行業交易系統開發經驗,如行情報價、交易、風控等。
面試流程
來看看面試的全過程:
-
自我介紹
-
說一下項目的業務,怎么做的,難點在哪,如何解決?
- 消息隊列:數據傾斜問題,數據不丟,重復消費
- redis:使用hash以及Pipline,bigkey拆解
- 數據庫:性能優化,分庫分表
-
數據庫優化設置lock_timeout是哪個鎖的超時
數據庫優化設置中的 lock_timeout 主要是針對行鎖的超時設置。當一個事務在等待獲取行鎖時,如果超過了 lock_timeout 設置的時間,就會拋出超時錯誤,避免事務長時間等待而導致系統性能下降。
-
kafka集群規模
我們的 Kafka 集群規模為 5 臺服務器,能夠支持 50 萬的并發量。通過合理的配置和優化,我們可以進一步提高 Kafka 集群的性能和并發能力。
-
kafka為什么支持高并發
Kafka 支持高并發主要有以下幾個原因:
- 分區:Kafka 將數據分成多個分區,每個分區可以在不同的服務器上進行存儲和處理,從而實現了水平擴展,提高了系統的并發能力。
- 零拷貝:Kafka 采用了零拷貝技術,減少了數據在內存中的復制次數,提高了數據的傳輸效率。
- 網絡壓縮:Kafka 支持網絡壓縮,可以減少網絡傳輸的數據量,提高系統的性能和并發能力。
-
說一下什么是零拷貝
零拷貝是一種技術,主要通過減少數據在內存中的復制次數來提高數據的傳輸效率。在 Kafka 中,零拷貝技術主要通過使用 mmap 函數實現。mmap 函數將文件映射到內存中,使得應用程序可以直接訪問文件內容,而不需要進行數據的復制。這樣可以減少數據在內存中的復制次數,提高數據的傳輸效率。
-
為什么選擇kafka
Kafka 具有很高的并發處理能力,能夠滿足金融交易系統對高吞吐量的要求。而且Kafka 的擴容性非常好,可以很容易地增加服務器節點來提高系統的性能,天生適合集群部署,并且使用 Java 和 Scala 編寫,便于進行問題排查和維護。相比之下,RabbitMQ 的集群部署相對復雜,而且使用 Erlang 語言,對于一些開發人員來說可能不太熟悉,問題排查也比較困難。
-
Api 網關用來做什么的?
Api 網關主要用于對第三方調用進行流量限制和安全控制。它可以對請求進行過濾、路由和負載均衡,確保系統的穩定性和安全性。同時,Api 網關還可以提供一些額外的功能,如身份驗證、授權、監控和統計等。
-
支付模塊這塊怎么做的
參與的項目中,支付模塊是由其他同事負責開發的。我主要是通過調用支付模塊提供的 API 來實現相關業務功能。在調用 API 時,我會確保參數的正確性和安全性,同時對返回結果進行合理的處理和錯誤處理。
-
說一下你們微服務的架構是怎么樣的
我們的系統采用了無服務和微服務的混合架構。這種架構可以充分發揮無服務架構的彈性和高效性,同時又能利用微服務架構的靈活性和可擴展性。在具體實現中,我們將一些通用的功能模塊封裝成無服務函數,通過事件驅動的方式進行調用。而對于一些復雜的業務模塊,則采用微服務架構,進行獨立開發和部署。
-
差分升級是怎么實現的
通過對比不同版本的代碼,找出差異部分,然后將這些差異部分抽取出來進行計算 MD5 值等操作,以確定是否需要進行升級。在升級過程中,我們會確保數據的完整性和一致性,同時盡量減少對系統的影響。
-
編譯服務類似CI/CD
通過修改 Git 命令,實現了類似于 Web Hook 的功能。當有代碼提交并打上 tag 時,系統會自動進行 Git clone 操作,然后進行測試和編譯。這樣可以確保代碼的質量和穩定性,同時提高開發效率。
-
C/C++是開發固件的吧
我曾經使用 C/C++ 和 Lua 的組合開發過智能網關。不過,由于我這次是應聘后端開發崗位,所以沒有將這部分內容寫在簡歷中。
-
你很喜歡用redis?
非常喜歡使用 Redis。Redis 就像一個數據結構數據庫,它提供了豐富的數據結構和操作接口,使用起來非常方便。在項目中,我們使用 Redis 實現了很多業務功能,比如緩存熱點數據、實現分布式鎖、進行任務隊列管理等。
-
反問
結尾
大家可以看出來,在這場深入的技術面試中,需要應試者具備強大的技術功底和應對各種挑戰的能力。面試官詢問的方向好像大多是 Kafka 的高并發處理的問題,不知道這次的面經有沒有給你帶來哪些學習要點呢?也希望通過分享這位面試者的經歷,能給正在求職或致力于技術提升的你帶來啟發和幫助。
堅定不移,聽話照做,按部就班,早日上岸!
關注我,免費領面經,升職加薪,備注:面經。