15K的Go開發崗,坐標北京

好久沒有分享最新的面經了,今天分享一下北京某公司Go開發崗的面經,薪資是15K左右,看看難度如何:

為什么要用分布式事務

分布式事務的核心作用是解決跨服務、跨數據源操作的數據一致性問題。在單體應用中,數據庫本地事務(如 MySQL 的 InnoDB 事務)可通過 ACID 特性保證單庫內操作的一致性,但在分布式系統中,業務操作往往需要跨多個服務(如用戶服務、訂單服務、支付服務)或多個數據庫,此時本地事務無法覆蓋所有操作,可能出現 “部分成功、部分失敗” 的情況。

什么是事務

事務是一組操作的集合,需滿足 “要么全部成功,要么全部失敗” 的原子性要求,分為數據庫事務分布式事務兩類:

1. 數據庫事務

指單庫內的事務(如 MySQL、PostgreSQL),核心是滿足ACID 特性

  • 原子性(Atomicity):事務中的所有操作要么全執行,要么全不執行(如轉賬時 “扣 A 的錢” 和 “加 B 的錢” 必須同時成功或同時失敗)。
  • 一致性(Consistency):事務執行前后,數據從一個合法狀態切換到另一個合法狀態(如轉賬前后 A 和 B 的總金額不變)。
  • 隔離性(Isolation):多個事務并發執行時,彼此的操作互不干擾(避免臟讀、不可重復讀、幻讀)。
  • 持久性(Durability):事務提交后,數據修改會永久保存(即使數據庫崩潰,重啟后數據仍有效)。

以 MySQL InnoDB 引擎為例,其事務實現細節包括:

  • 隔離級別:支持讀未提交(Read Uncommitted)、讀已提交(Read Committed)、可重復讀(Repeatable Read,默認)、串行化(Serializable)。
  • 快照讀與當前讀:
    • 快照讀(如select * from t where id=1):通過 MVCC(多版本并發控制)和 Read View 實現。每行數據包含隱藏列(DB_TRX_ID:最后修改事務 ID;DB_ROLL_PTR:回滾指針,指向歷史版本),Read View(由 “低水位”“高水位”“活躍事務 ID 列表” 組成)決定可見的版本(讀提交時每次查詢生成新 Read View,可重復讀時首次查詢生成 Read View)。
    • 當前讀(如update/delete/select ... for update):會加鎖(行鎖、表鎖),并讀取最新數據。
  • 鎖機制:更新操作時會加 “意向鎖”(IX/IS),用于快速判斷表中是否有行鎖(避免逐行檢查鎖,提高效率);行鎖(如 Record Lock)用于鎖定單行數據,防止并發修改沖突。
2. 分布式事務

指跨多個服務或多個數據庫的事務,核心是保證跨節點操作的最終一致性(無法像本地事務一樣嚴格保證 ACID,而是通過補償機制實現 “最終一致”)。

常見實現方式包括 TCC(Try-Confirm-Cancel)、SAGA(正向 + 反向補償)、本地消息表、DTM 框架等。以 DTM 為例,其核心組件包括:

  • 事務管理器(TM):負責全局事務的創建、提交、回滾,協調各子事務的執行順序,解決事務亂序、冪等性(重復提交)、空補償(未執行 Try 卻執行 Cancel)等問題(通過 “子事務屏障表” 記錄全局事務 ID、分支事務 ID 及狀態實現)。
  • 資源管理器(RM):管理各服務的本地資源(如數據庫連接),負責執行子事務的 Try/Confirm/Cancel 操作,并向 TM 匯報執行結果。

分布式事務 CAP 特性

CAP 是分布式系統的三大核心特性,由 Eric Brewer 提出,三者不可同時滿足:

  • 一致性(Consistency):分布式系統中,所有節點在同一時間看到的數據是一致的(如集群中所有節點的用戶余額必須相同)。
  • 可用性(Availability):分布式系統中,任何節點故障時,剩余節點仍能正常響應請求(如支付系統不能因某臺服務器宕機而無法下單)。
  • 分區容錯性(Partition Tolerance):當網絡分區(部分節點與其他節點斷開通信)發生時,系統仍能繼續運行(分布式系統必須滿足此特性,因為網絡故障不可避免)。

在分布式事務中,由于必須滿足分區容錯性(P),因此需在一致性(C)和可用性(A)之間權衡:

  • CP 傾向:優先保證一致性,犧牲部分可用性(如 ZooKeeper 集群,leader 宕機后會暫停服務直到新 leader 選舉完成,期間不可用但數據一致)。
  • AP 傾向:優先保證可用性,接受短暫的不一致(如多數業務的支付系統,允許 “用戶余額扣減后,訂單狀態延遲更新”,但最終會通過補償機制一致)。

實際業務中,分布式事務通常追求最終一致性(屬于 AP 傾向),即允許中間過程數據不一致,但通過補償操作(如 TCC 的 Cancel、SAGA 的反向流程),最終所有節點數據會達成一致。

協程了解嗎

協程(Goroutine,Go 語言中的實現)是輕量級的 “用戶態線程”,相比操作系統線程(OS Thread),其優勢在于:

  • 資源占用極低:初始棧大小僅 2KB(可動態擴容至 GB 級),而線程初始棧通常為 2MB,因此單臺機器可創建數十萬甚至數百萬協程。
  • 調度效率高:由 Go runtime 而非操作系統調度,減少用戶態與內核態的切換開銷。

Go 語言通過GMP 調度模型實現協程的高效調度,核心組件包括:

  • G(Goroutine):協程本身,包含棧、程序計數器、狀態(如運行中、就緒、阻塞)等信息。
  • M(Machine):操作系統線程,負責執行 G(真正的 “執行載體”)。
  • P(Processor):處理器,是 G 和 M 的 “橋梁”,包含本地協程隊列(Local Queue)、全局隊列指針、調度器狀態等,用于管理可執行的 G。

調度流程細節:

  1. 初始化:程序啟動時創建初始線程 M0 和初始協程 G0(每個 M 綁定一個 G0,負責調度其他 G)。
  2. 協程入隊:新建的 G 優先放入當前 P 的本地隊列(容量默認 256),本地隊列滿后放入全局隊列。
  3. 調度策略:
    • 本地隊列調度:M 優先從綁定的 P 的本地隊列獲取 G 執行。
    • 全局隊列調度:本地隊列為空時,M 會從全局隊列批量獲取 G(一次取min(全局隊列長度/num(P) + 1, 64)個)。
    • 偷取機制(Work Stealing):若本地隊列和全局隊列都為空,M 會隨機選擇其他 P 的本地隊列,偷取一半的 G 執行(避免線程空閑,提高資源利用率)。
    • Hand off 機制:當 G 因系統調用(如 IO、sleep)阻塞時,M 會主動釋放綁定的 P(將 P 放入空閑 P 列表),讓其他空閑的 M 綁定該 P 并執行其本地隊列的 G;當阻塞的 G 喚醒后,M 會嘗試從空閑 P 列表獲取 P,若獲取成功則繼續執行 G,否則將 G 放入全局隊列等待調度。

介紹一下 hand off 機制

Hand off 機制是 Go 調度器中用于處理 “協程阻塞” 的協作式調度策略,核心目的是避免處理器(P)閑置,提高系統資源利用率。

觸發場景

當協程(G)因以下操作阻塞時,會觸發 hand off:

  • 系統調用(如net.Dialos.Read等 IO 操作);
  • 同步操作(如time.Sleepmutex.Lock未獲取鎖時)。
具體流程
  1. G 阻塞時:執行 G 的 M 會檢測到 G 進入阻塞狀態,此時 M 會調用park函數將 G 的狀態標記為 “阻塞”,并將綁定的 P 從自身解綁,放入全局 “空閑 P 列表”。

  2. 釋放 P 后:M 進入休眠狀態(或處理其他任務),而空閑 P 列表中的 P 可被其他空閑的 M 綁定,繼續執行 P 本地隊列中的 G(避免 P 因 M 阻塞而閑置)。

  3. G 喚醒時:阻塞的 G 被喚醒(如 IO 操作完成、鎖獲取成功),此時 M 會調用

    unpark
    

    函數,嘗試從空閑 P 列表中獲取一個 P:

    • 若獲取成功,M 綁定該 P,繼續執行喚醒的 G;
    • 若未獲取成功,將 G 放入全局隊列,M 進入休眠,等待后續被調度。
與搶占式調度的區別

Hand off 是 “協作式調度”(G 主動讓出 P),而 Go 1.14 后引入的 “搶占式調度” 是通過信號中斷長時間運行的 G(如循環無阻塞的 G),強制其讓出 P,避免單個 G 獨占 P 導致其他 G 餓死。兩者結合,保證了 Go 協程調度的高效性。

gc 了解嗎

Go 的垃圾回收(GC)是自動管理堆內存的機制,核心目標是 “在保證程序正確的前提下,盡可能減少對業務代碼的干擾(低延遲)”。其核心實現是三色標記法 + 混合寫屏障,特點是 “并發標記、并行清掃”(大部分階段與業務代碼并發執行,僅短暫 STW)。

核心流程
  1. 初始標記(STW):短暫暫停所有協程(幾微秒到毫秒級),標記 “根對象”(全局變量、棧上變量直接引用的對象)為灰色,開啟寫屏障(防止標記期間對象引用關系被修改導致漏標)。

  2. 并發標記:恢復協程執行,GC 后臺線程從灰色對象出發,遍歷其引用的對象:

    • 若引用的對象是白色,標記為灰色;
    • 遍歷完的灰色對象標記為黑色(表示 “已處理”)。
      此階段與業務代碼并發執行,寫屏障會實時跟蹤對象引用變化(如黑色對象引用白色對象時,通過寫屏障修正標記)。
  3. 最終標記(STW):再次短暫暫停協程,處理并發標記期間遺漏的對象(如根對象的新增引用),關閉寫屏障。

  4. 并行清掃:恢復協程執行,多個 GC 線程并行清掃所有白色對象(不可達對象),釋放其占用的堆內存。

關鍵技術:混合寫屏障

寫屏障的作用是在并發標記階段,保證對象引用關系變化時,GC 能正確跟蹤可達性,避免 “黑色對象引用白色對象” 導致的漏標(漏標會導致白色對象被誤判為垃圾回收)。

混合寫屏障結合了 “插入寫屏障” 和 “刪除寫屏障” 的優勢,規則如下:

  • 當創建新對象時,直接標記為黑色(避免新對象被誤回收);
  • 當修改對象引用(如a.b = c)時:
    • 若舊引用a.b指向的對象是黑色,將其重新標記為灰色(確保其引用的對象被遍歷);
    • 新引用c指向的對象若為白色,標記為黑色(避免被誤回收)。
性能優化

Go GC 通過不斷迭代優化延遲(如 1.5 引入并發標記、1.8 優化 STW 時間、1.19 引入分代回收),目前在多數場景下 STW 時間可控制在 100 微秒以內,對業務影響極小。

函數的棧幀了解嗎

函數棧幀是函數調用時在棧上分配的內存區域,用于存儲函數的參數、局部變量、返回地址、棧基指針等信息,其生命周期與函數調用一致(函數返回時棧幀被釋放)。

棧幀結構(以 x86 架構為例)

從高地址到低地址依次為:

  • 返回地址:函數執行完畢后,CPU 需跳轉回的調用處地址(如call func指令會將下一條指令地址壓棧)。
  • 棧基指針(BP):指向當前棧幀的底部,用于定位棧幀內的參數和局部變量(函數執行時,BP 的值由上一個棧幀的 SP 決定)。
  • 局部變量:函數內定義的變量(如int astring s),按聲明順序從 BP 向下分配。
  • 函數參數:調用方傳遞的參數,從 BP 向上(高地址)讀取(如func(a, b int)中,a在 BP+8,b在 BP+12,取決于 CPU 位數)。
逃逸分析與堆分配

Go 編譯器會通過 “逃逸分析” 判斷變量是否需要 “逃逸” 到堆上:

  • 若變量僅在函數內使用(無外部引用),則分配在棧幀上(函數返回后自動釋放,無需 GC);
  • 若變量被外部引用(如返回局部變量的指針、被閉包引用),則會 “逃逸” 到堆上(由 GC 管理生命周期)。

逃逸分析的目的是減少堆分配(堆分配需 GC,棧分配更高效),提升程序性能。

歡迎關注 ?

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

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

感興趣的朋友們可以私信我,備注:面試群。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916830.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916830.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916830.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Linux 文件管理高級操作:復制、移動與查找的深度探索

目錄一、文件復制:從基礎到企業級同步的全維度解析1. cp命令:基礎工具的進階密碼(1)文件屬性保留:從基礎到極致(2)特殊文件處理:稀疏文件與設備文件(3)安全操…

Redis內存使用耗盡情況分析

目錄 1、內存上限介紹 1.1、產生原因 1.2、Redis的maxmemory限額 1.3、影響的命令與場景 2. 內存用完后的策略 2.1、淘汰策略分類 2.2、淘汰策略介紹 2.3、不同策略對比 3、常見業務示例 3.1、影響 3.2、監控與自動告警 前言 在日常項目中,不知道你思考過…

Ubuntu 系統中配置 SSH 服務教程

一、什么是 SSH?SSH(Secure Shell)是一種加密的網絡協議,用于在不安全的網絡中安全地進行遠程登錄、遠程命令執行和文件傳輸。它是 Telnet、FTP 等傳統協議的安全替代品。二、確認系統環境在開始配置之前,請確認你的系…

基于springboot的編程訓練系統設計與實現(源碼+論文)

一、開發環境 技術/工具描述MYSQL數據庫一個真正的多用戶、多線程SQL數據庫服務器,適用于Web站點或其他應用軟件的數據庫后端開發。B/S結構基于互聯網系統的軟件系統開發架構,利用瀏覽器進行訪問,支持多平臺使用。Spring Boot框架簡化新Spri…

K8s集群兩者不同的對外暴露服務的方式

在工作中,我們暴露集群內的服務通常有幾種方式,對于普通的http或者https,我們通常使用?Ingress Nginx? ,對于原始的TCP或者UDP端口服務,可能需要選擇 ?LoadBalancer? ,它們的核心區別在于工作層級、協議支持和流量…

實習日志111

第一天 加入內網和內網域,設置自己的操作系統 第二天 安裝常用軟件和平臺 Notepad 是一款免費的源代碼編輯器,支持多種編程語言,其功能強大且界面友好,適用于 Windows 操作系統。WinMerge 是一款開源的差異比較和合并工具&…

Redis 服務掛掉排查與解決

Redis 是一個高性能的鍵值對存儲系統,廣泛應用于緩存、會話存儲、消息隊列等場景。在使用 Redis 的過程中,偶爾會遇到 Redis 服務掛掉或無法連接的情況。本文將通過常見錯誤 RedisException in Redis.php line 63 Connection refused 來講解如何排查并解…

DOM + HTML + HTTP

一、HTML5的新特性 1.語義化標簽:其實就是可以讓標簽有自己的含義 html4之前都是有的,比如:<h1>、<ul>、<li> html5新增了很多語義化標簽:<header>、<nav> html5的語義化標簽的常用頁面布局: 優點: 1.代碼結構清晰,方便閱讀,有利于團…

HTML 音頻/視頻

HTML 音頻/視頻 引言 HTML 音頻和視頻標簽是網頁設計中不可或缺的部分,它們為用戶提供了一種將多媒體內容嵌入到網頁中的方式。本文將詳細介紹 HTML 音頻/視頻標簽的用法、屬性和注意事項,幫助開發者更好地在網頁中嵌入音頻和視頻。 HTML 音頻標簽( ) 1. 標簽基本用法 …

Apache Ignite Cluster Groups的介紹

以下這段內容是 Apache Ignite 官方文檔中關于 Cluster Groups&#xff08;集群組&#xff09; 的介紹。我來用通俗易懂的方式幫你全面理解這個概念。&#x1f310; 什么是 Cluster Group&#xff1f; 簡單來說&#xff1a;Cluster Group 就是一個“節點的子集”。想象一下你的…

github上傳本地項目過程記錄

最近有和別人進行unity項目協作的需求&#xff0c;需要把自己的本地代碼上傳到github已有的一個倉庫里。記錄一下上傳過程&#xff0c;防止后續還需要用。 文章目錄一、把自己的本地代碼上傳到github已有的一個倉庫中二、常用功能一、把自己的本地代碼上傳到github已有的一個倉…

Spring AI Alibaba

目錄 前言&#xff1a; 一、Spring AI 和Spring AI Alibaba 二、Spring AI Alibaba快速入門 1.環境 2.ollama 3.阿里百煉 前言&#xff1a; 2025年真的是AI大爆發的一年&#xff0c;以后無論是什么行業我想都需要AI了&#xff0c;作為一名計算機人&#xff0c;你不學習AI…

【GaussDB】內存資源告急:深度診斷一起“memory temporarily unavailable“故障

【GaussDB】診斷一起內存臨時不可用的問題 &#x1f4cb; 背景 在客戶測試環境中&#xff08;GaussDB 506.0 SPC0100 集中式&#xff09;&#xff0c;一個重度使用存儲過程的系統&#xff0c;頻繁出現內存臨時不可用的問題(ERROR: memory is temporarily unavailable)。令人困…

FastDFS如何提供HTTP訪問電子影像文件

Nginx 作為高性能的 Web 服務器和反向代理服務器&#xff0c;與 FastDFS 結合使用&#xff0c;本文主要介紹用于處理 FastDFS 存儲文件的 HTTP 訪問請求&#xff0c;方便客戶端通過 HTTP 協議直接訪問存儲在 FastDFS 中的文件&#xff0c;在電子影像系統中&#xff0c;Nginx 可…

水面垃圾識別分割數據集labelme格式2111張8類別

數據集中有部分增強圖片&#xff0c;注意為了提供模型泛化識別能力&#xff0c;有很少一部分不是水面垃圾。具體看圖片數據集格式&#xff1a;labelme格式(不包含mask文件&#xff0c;僅僅包含jpg圖片和對應的json文件)圖片數量(jpg文件個數)&#xff1a;2111標注數量(json文件…

北京-4年功能測試2年空窗-報培訓班學測開-第六十二天-模擬未通過,繼續準備自我介紹項目介紹面試題中

今日產出&#xff0c;完成昨天模擬面試錄音的重聽和整理&#xff0c;完成自我介紹梳理&#xff0c;還重寫了三個算法題&#xff0c;寫了4個sql題。和同學打語音提問今天專注力不強&#xff0c;因為焦慮項目和面試題。關于項目&#xff0c;我理解的&#xff0c;老師以前錄屏講的…

自動化輔助工具教程

該工具支持全部平臺使用

里程碑 | 1Panel開源面板GitHub Star數量突破30,000個!

截至2025年7月23日20:00&#xff0c;飛致云旗下開源項目——1Panel開源Linux服務器運維管理面板GitHub Star數超過30,000個&#xff01; 繼Halo之后&#xff0c;1Panel成為飛致云旗下第二個GitHub Star數量超過30,000個的開源項目&#xff0c;也是飛致云旗下最快達成30,000個Gi…

雨雪霧冰全預警:交通氣象站為出行安全筑起“隱形防護網”

冬季濃霧彌漫高速&#xff0c;能見度降至 50 米以下&#xff1b;夏季暴雨傾盆&#xff0c;低洼路段眨眼間積水成河…… 惡劣天氣總是公路交通安全的大敵。關鍵時刻&#xff0c;交通氣象站挺身而出&#xff0c;成為保障道路暢通與行車安全的科技尖兵。交通氣象站專為復雜道路環境…

C++(面向對象之繼承、多態)

一、繼承前言在c里面&#xff0c;繼承是指2個類之間的關系例如&#xff1a;有一個org類&#xff0c;功能很完善&#xff0c;體量很大&#xff0c;突然有一天&#xff0c;需求發生改變&#xff0c;org類不能滿足新的需求&#xff0c;我們的第一想法是&#xff0c;復制 org 類代碼…