歡迎大家加入Go招聘交流群,來這裡找志同道合的小夥伴!跟土撥鼠們一起交流學習。
目錄本周招聘
本周股
LeetCode每日打卡
1. 「二叉樹的前序遍歷」
2. 「二叉樹的中序遍歷」
3. 「N叉樹的後序遍歷」
4. 「N叉樹的前序遍歷」
5. 「最長回文子串」
6. 「N叉樹的層序遍歷」
7. 「對稱二叉樹」
本周招聘1、【阿里巴巴】雲原生布道師的機會,這要求。。。
本周股1.簡述 redis 中消息隊列的實現方案list因為 list 是基於雙端鍊表實現,所以可以實現雙端進出的功能。也就是能夠實現消息隊列(生產者放進尾端,消費者取頭部),但只能一對一單播,不能廣播,不能重複消費。如果消費者獲取到消息在處理時發生宕機,就會丟失數據。
發布訂閱發布訂閱也能支持消息隊列,但只會發給在線的消費者,並且沒有持久化的功能。每個消費者都有本地的緩衝區,生產者會把發布的消息推到各個消費者的緩衝區(沒有做 RDB 或者 AOF)上面,所以沒在線的消費者無法收到,也沒辦法回溯,當消費者區域緩衝不夠了也會踢消費者下線
streamredis 5.0 推出的功能,支持持久化,確認應答 ack 機制,多個消費者(不是廣播,只是均勻消費,類似於 kafka 的消費者組)以及可以回溯消費過的內容,並且也支持類似 offset 的消費模式(使用當前消費完成的消費 id 去消費下一條消息)。當然如果消息積壓太大超過了設置的存儲閾值是否丟棄舊的消息,這是 redis 基於內存去實現這個方案的弊端
參考以及延展閱讀
2.簡述 MySQL 中的 MVCC、readview、undolog 的概念及相互的聯繫MVCCMVCC 是 MySQL 中處理並發讀寫的一種機制,讓一個數據有多個版本,保證讀寫操作沒有衝突。MVCC 具體是由 readview 和 undlog 還有每行的三個隱藏的欄位實現的。
readviewreadview 是事務進行時生成的數據快照。事務隔離級別不同生成的時機不一樣(比如 RC 是每次查詢的時候都會生成一個,之後快照讀都會讀最新;RR 是第一次查詢時會生成之後就不再生成,之後快照讀都會讀同一個),readview 本質上其實是根據每行的記錄隱藏的當前事務 ID,去讀取 undolog 的記錄來生成當前事務允許讀到的數據集,所以才有快照讀這個說法。
undologundolog 是回滾日誌(實現了 ACID 中的 A 原子性),在執行任何變更操作都會生成一條記錄對應一個 undolog 記錄,每行記錄在一個事務內變更的記錄都會生成一個一個 undolog 讓他們從近到遠的順序連接在一起形成 undolog 版本鏈
總結MVCC 的實現基於 readview ,而 readview 的實現基於 undolog 以及每行的隱藏欄位(事務 ID 等)。
參考連結以及擴展閱讀:
3.kafka 什麼時候會丟消息,如何解決丟消息的情況生產者發送消息。丟消息的原因主要是生產者一般發送消息到 kafka 都是異步的,所以有可能失敗之後沒有處理。解決方案一般是進行失敗重試,或者設置發消息的方法設置成同步。消費者消費消息。丟消息的原因主要是消費者拉取消息後會設置 autocommit offset,但是消費者拉取消息後因為某些原因宕機後沒有處理這個數據導致丟消息。解決方案可以先關掉 autocommit offset,等待業務處理完後再提交。但是這個方案要注意不要讓消費者消費過長讓 kafka 超時踢出消費者組導致 rebalancekafka 中 topic 及 replicate 的主從同步。前提知識:kafka 的高可用方案是把一個 topic 在多臺 kafka 實例上做了副本 replicate (當然也分了 leader 和 follower,用的是 zk 管理,新版本的 kafka 也去除了zk 管理的依賴)。這時一般的讀寫都是從 leader 上操作的,當 leader 接收了一個消息,沒有來得及同步到 follwer 前 broker 掛掉了,會導致丟消息。
解決方案解決方案和 mysql 有點類似:
全同步。可配置一個參數 acks = all,也就是類似於 Mysql 主從複製中的全同步,等到所有 topic 副本都同步完才返回給生產者發送成功。半同步。可配置一個參數 mini.sync.replicas。也就是 Mysql 的半同步,可以設置同步到多少個副本就返回給生產者發送成功新增副本個數,增大同步到的概率。可配置一個參數 replication.factor,也就是增大副本的個數,因為副本越多,同步到的概率就越大,但會導致數據冗餘。參考連結以及擴展閱讀:
面試官問我如何保證Kafka不丟失消息?我哭了[3]4.什麼是優雅退出前提知識:
在 Linux 下很多殺進程的操作都是 kill -9 pid(進程 id)。但是這樣直接殺進程會帶來一些不可預知的問題。比如進程的緩存數據沒有持久化到磁碟,正在進行的一些 IO 操作會被忽然停止,一些數據操作只進行到一半等等。基於這些問題的發生,在退出進程的時候當然是希望能夠處理完現在的數據,釋放正在持有的資源再去關閉。
優雅退出: 優雅退出就是基於這些問題而出現的一個操作,一般的實現都是 kill pid 時,會發出信號去通知進程要關閉。各個程式語言的實現不一,但是都會去捕獲這個信號,之後將進程本身標記為退出狀態,優先處理完現在正在處理的操作,不再接收新的操作請求,操作完成後釋放持有的資源(比如已經建立好的連接進行 4 次揮手等等),之後關閉進程。(當然優雅關閉在實現的代碼上也一般會設計超時控制,超過一定時間會強制關閉)
5.什麼是信號信號是 Linux 下進程間通信的一種方式。(這裡涉及到進程間通信,就不再贅述)
利用信號進行異步通知這種進程間通信的方式,可以用來通知其他進程,通知之後會讓被通知的進程進入軟中斷去進行邏輯。如果進程對這個信號定義了函數處理的流程,那麼會被執行(比如 go 的 os/signal 可以定義優雅退出)。信號的通知可以被捕捉,忽略,和使用內核默認的處理方式。
參考連結以及擴展閱讀:
LeetCode每日打卡1. 「二叉樹的前序遍歷」https://leetcode-cn.com/problems/binary-tree-preorder-traversal/
題解參考:https://books.halfrost.com/leetcode/ChapterFour/0100~0199/0114.Flatten-Binary-Tree-to-Linked-List/
2. 「二叉樹的中序遍歷」https://leetcode-cn.com/problems/binary-tree-inorder-traversal/
題解參考:https://books.halfrost.com/leetcode/ChapterFour/0001~0099/0094.Binary-Tree-Inorder-Traversal/
3. N叉樹的後序遍歷」https://leetcode-cn.com/problems/n-ary-tree-postorder-traversal/
題解參考:https://leetcode-cn.com/problems/n-ary-tree-postorder-traversal/solution/ncha-shu-de-hou-xu-bian-li-by-leetcode/
4. 「N叉樹的前序遍歷」https://leetcode-cn.com/problems/n-ary-tree-preorder-traversal/
題解參考:https://books.halfrost.com/leetcode/ChapterFour/0500~0599/0589.N-ary-Tree-Preorder-Traversal/
5. 「最長回文子串」https://leetcode-cn.com/problems/longest-palindromic-substring/
題解參考:https://books.halfrost.com/leetcode/ChapterFour/0001~0099/0005.Longest-Palindromic-Substring/
6. 「N叉樹的層序遍歷」https://leetcode-cn.com/problems/n-ary-tree-level-order-traversal/
題解參考:https://leetcode-cn.com/problems/n-ary-tree-level-order-traversal/solution/ncha-shu-de-ceng-xu-bian-li-by-leetcode/
7. 「對稱二叉樹」https://leetcode-cn.com/problems/symmetric-tree/
題解參考:https://books.halfrost.com/leetcode/ChapterFour/0100~0199/0101.Symmetric-Tree/
參考資料[1]15 | 消息隊列的考驗:Redis有哪些解決方案?: https://time.geekbang.org/column/article/284291
[2]MVCC多版本並發控制: https://www.jianshu.com/p/8845ddca3b23
[3]面試官問我如何保證Kafka不丟失消息?我哭了: https://juejin.cn/post/6844904094021189639
[4]Golang信號處理和優雅退出守護進程: https://studygolang.com/articles/10076
歡迎關注Go招聘公眾號,獲取更多精彩內容。
100:Go簡歷模板 | 101:Go最全面試集錦 | 102:Go超級簡歷 | 103:Go安全指南 | 1024:LeetCode刷題指南 | 6379:redis集錦