有php轉go專案經驗者優先?

王中阳Go發表於2024-11-04

新的一週又來了,今天分享的是上海某公司的一面面經,內容主要就是go、mysql和專案,職位要求如下:

發現一個很有意思的點---有php轉go專案經驗者優先。想不到還有這種好事,本人就是php轉go,跟我有相同經歷的朋友可以加我微信,我們一起聊聊。

面試問題

Go 相關

往已關閉的channel裡讀寫資料會發生什麼?

  • 寫操作:向已關閉的channel寫入資料會導致執行時panic。
  • 讀操作:從已關閉的channel讀取資料會立即返回,如果channel中還有值,則按順序返回剩餘值;當channel為空後,讀操作將返回channel型別的零值。

Channel的底層原理

Go語言中的channel是透過一個結構體實現的,這個結構體包含了一個佇列來儲存傳送到channel的資料元素。當一個goroutine向channel傳送資料時,資料會被新增到這個佇列中;另一個goroutine從channel接收資料時,它會從佇列中移除資料。channel可以是帶緩衝或無緩衝的,無緩衝channel在傳送方和接收方同步時直接傳遞資料,而帶緩衝channel則允許在沒有接收方的情況下暫存資料。

GMP排程

Go的併發模型基於Goroutines(G)、M(Machine)和P(Processor)。每個程式開始時都會建立一個執行時,執行時負責管理所有的Goroutines。P代表邏輯處理器,用於執行任務;M是一個作業系統執行緒,可以執行使用者程式碼或執行時程式碼;G是使用者定義的goroutine。執行時使用工作竊取演算法來平衡各個P上的負載,確保高效利用多核處理器。

Go的協程之間要如何通訊?

Go推薦使用channel進行協程間的通訊。透過channel,協程可以安全地交換資料而無需擔心競態條件。此外,也可以使用互斥鎖等同步原語來保護共享資源。

MySQL 相關

Explain裡哪些指標需要關注?

在MySQL的EXPLAIN輸出中,應該關注以下指標:

  • type:連線型別,顯示了表之間的連線方式,如全表掃描、索引掃描等。
  • key:實際使用的索引。
  • rows:查詢最佳化器估計為了找到所需行必須檢查的行數。
  • Extra:提供了關於MySQL如何解析查詢的額外資訊,例如是否使用臨時表、排序等。

這些指標對SQL效能從低到高分別有哪些?

  • 全表掃描(ALL)通常是最慢的,因為它需要掃描整個表。
  • 索引範圍掃描(range)比全表掃描快,但仍可能涉及大量行。
  • 使用索引(ref, eq_ref, const)可以顯著提高查詢速度,因為它們限制了需要訪問的行數。
  • 索引覆蓋(index)是指查詢可以在索引樹中完成,而不需要回表查詢資料,這通常是最快的。

MySQL的事務瞭解嗎?什麼是事務的ACID?

事務是一系列操作,作為一個整體一起成功或者一起失敗。ACID是事務的四個基本特性:

  • 原子性(Atomicity):事務的所有操作要麼全部完成,要麼完全不發生。
  • 一致性(Consistency):事務前後資料庫保持一致狀態。
  • 隔離性(Isolation):併發事務的執行結果與序列執行的結果相同。
  • 永續性(Durability):一旦事務提交,其效果就是永久性的,即使系統發生故障也不會改變。

事務的ACID分別是怎麼保證的?

  • 原子性:透過事務日誌記錄事務的操作,如果事務失敗,可以根據日誌回滾到事務開始前的狀態。
  • 一致性:透過約束機制確保事務執行前後資料的一致性。
  • 隔離性:透過鎖定機制或其他併發控制策略來實現,比如MVCC(多版本併發控制)。
  • 永續性:事務提交後,確保資料已經寫入到持久儲存中,即使系統崩潰也能恢復。

Redo Log、Undo Log、BinLog有哪些區別?

  • Redo Log:重做日誌,用於記錄事務對資料頁所做的修改,以便在例項恢復時能夠重做這些修改,保證資料的永續性和一致性。
  • Undo Log:撤銷日誌,用於支援事務的回滾操作,並且在MVCC中用於提供事務開始時的資料快照。
  • BinLog:二進位制日誌,記錄了所有更改資料庫的資料事件,用於資料恢復、複製和審計。

BinLog檔案有幾種格式型別?分別有哪些優劣?

  • Statement:記錄的是SQL語句,適用於大多數情況,但不能處理某些非確定性操作,如UUID()函式。
  • Row:記錄的是每行資料的變化,可以準確地反映資料變化,但日誌量較大。
  • Mixed:結合了前兩種格式的優點,自動選擇合適的格式來記錄日誌。

主從複製的原理是什麼?複製的型別有幾種?

主從複製的基本原理是主伺服器將更改操作記錄到二進位制日誌中,從伺服器透過I/O執行緒讀取這些日誌並儲存到本地的中繼日誌,然後透過SQL執行緒執行這些日誌中的操作來保持與主伺服器資料的一致性。

複製型別主要有:

  • 非同步複製:最常用的複製方式,主伺服器不等待從伺服器確認即可繼續處理新的請求。
  • 半同步複製:主伺服器在收到至少一個從伺服器的確認後才會認為事務已提交。
  • 同步複製:所有從伺服器都確認後主伺服器才提交事務,這種方式延遲較高。

資料寫入redo log是不是一定不會丟失?

不是絕對的。雖然redo log是設計用來防止資料丟失的,但如果在資料寫入redo log後但在資料真正持久化之前系統發生故障,仍然可能導致資料丟失。但是,一旦事務提交併且redo log條目已經被寫入磁碟,那麼即使系統崩潰,恢復過程中也可以根據這些日誌恢復未完成的事務。

Buffer Pool是什麼?有什麼作用?Buffer Pool滿了之後會發生什麼?

  • Buffer Pool:是InnoDB儲存引擎中的記憶體區域,用於快取表的資料和索引頁面,目的是減少磁碟I/O操作,提高查詢效能。
  • 作用:加快資料檢索速度,減少磁碟讀寫次數。
  • 滿了之後:當Buffer Pool滿時,InnoDB會使用LRU(最近最少使用)演算法來替換舊的資料頁,為新讀取的資料頁騰出空間。如果資料頁被頻繁訪問,可能會導致頻繁的頁面替換,從而影響效能。

專案

  1. 為什麼要重構?
  2. 專案中的業務流程問題你是怎麼梳理的?用哪些工具梳理?
  3. 為什麼透過canal與binlog來校驗和修復資料?你還有其他方案嗎?
  4. 是採用批次校驗嗎?
  5. 重構的週期大概多久?
  6. 分片計算肯定要消耗大量資源,這裡你一共部署來幾臺例項呢?
  7. 專案中你是如何進行深度分頁最佳化的?除了用lastId,有沒有其他方案?
  8. 談談你對DDD的理解

歡迎關注 ❤

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

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

感興趣的朋友們可以加我微信:wangzhongyang1993,備註:sf面試群。

相關文章