現今的軟體已經不再是單一執行檔、單一電腦走天下。
幾乎所有眼前的服務皆是由許多的小元件組成,他們怎麼彼此跨越網路交換資訊呢?
又怎麼在彼此身處異地的情況下完成任務?
再更近一步,我們知道網路是不可靠的,隨時可能有斷線、掉封包或是被瞬間高流量塞爆的危機,面對這樣的環境如何讓系統繼續運作而不至崩潰?
或著我們有多少把握,運作一段時間後,這些分散在各地的元件手中的資訊是一致的?
元件或是儲存的資料失效後如何回復?
備份成三份、五份有沒有效?
很多人都說,後端工程師/系統架構師最難當,因為牽涉的範圍太廣,又沒有標準答案。
一路從File System、Cache、Virtualization、Message Queue到雲端平台如Kubernetes等都要略知一二,
甚至要能夠選擇適當的元件設計出一個新的系統架構。
最困難的也許是,市面上似乎沒有太多書籍能夠有系統的將所有主題全部涵括進去,或是有效率地培養這方面的能力。
究竟該去哪裡可以找到所有的答案?
入學的那一年剛好可以說是資工系開始展露頭角的那一年。
從大一到研究所,每年看著學校的開課重點和專題題目,就知道今年輪到哪一個名詞當主角。
一路從Computer Vision、Cloud、Big Data、IoT輪到近年的AI。
但是最吸引我的仍然是Cloud與他的基礎 - 分散式系統。
也許是因為在這個領域,系統裡的每一個元件如同人在世界上一樣,
認份的做著自己的工作,再透過人與人的交流完成大於自身的成就。
也許是因為數學在這個領域不是絕對,
現實與理論的妥協帶來了所謂工程的浪漫。
然而,學校並沒有以分散式系統為主題的課程。對分散式系統的認識也只有手上碰過的幾個專案如: Hadoop, OpenStack 與 Kubernetes 等
因此雖然都已經寫好論文並口試畢業了,反倒是研究所最後一年延畢去德國 TU Dresden 交換,才認真上了 "Distributed System" 這一門課。
也才知道這一門課有多廣,牽涉現今的軟體有多深。
就像上面的那一系列問題,
學習完後,才瞭解其實每一個,都曾帶領許多人產出了許多論文與研究成果。
因此這一系列的文章,將會更像是我自己的學習筆記,
嘗試將一學期的所學濃縮整理出基礎理論與經典實作,在未來面對問題時,心中有著前人走過的路做參考。
我將會以兩門課的內容為主軸,分別是
以下是未來的將會涵蓋的幾個主題:
希望能夠邊整理筆記的同時,可以把MIT 6.824的幾個實作作業完成 Q_Q
Note:
系統這一件事沒有標準答案,
因此大家看到有問題的部分,歡迎隨時發起討論!
明天將從最基本的 CAP理論 與 Consensus 開始談起~