Blog
Blog copied to clipboard
不是專案起步就該做到 Microservices, 而是循序漸進, 慢慢轉變
其實此篇文章並無過多艱深的專知(專有知識), 只是簡單闡述為何不應該無腦地跟風 microservice 架構. 基本上, Software 領域的技術皆是日新月異, 不管檯面上的技術多熱門, 都該理性客觀地分析適不適合自家專案.
[name=Chaol Liu][time=20181102] derived from...
Microservices Are Something You Grow Into, Not Begin With
nickjanetakis.com
[name=Nick Janetakis] [time=Tue, 21 Aug 2018 04:00:00 GMT]
來聊聊甚麼時候該開始用 microservices. 暴雷警告: 每種專案的情況都不盡相同
- 身為軟體開發一員, 都有一項相當有趣的職業病. 我們會開開心心 coding 一整天, 然後讀一篇文章, 突然間, 你就開始質疑自己剛寫完的程式是否落伍. 例如: Netflix 當時帶領了一股運用 microservice 架構的風潮, 網路上有許多文章, 造成各家工程師花費大筆成本改寫.
- 就如同那件事, 由一個獨立個體, 或一間公司的某一項意見, 就讓你開始質疑你這幾年所做的事, 甚至你原本做得已經很優秀了, 你還是會質疑自己.
你不是 Google
- 當我們瀏覽 HackNews 和其他 news outlet(新聞出處)時, 經常會看到 Google, Netflix, Amazon 和 Facebook 的技術文章, 他們都樂意分享, 因為 microservices, 執行了上百或上千個 service 而帶來多少好處. 過去幾年都流行大公司分享技術.
- 但面對事實吧. 你大概不會有一個專案有 1,000 位開發者同時進行, 而且專案還要超過 10年以上歷史.
- 只因為 Google 這樣做, 不代表你也應該要這樣做.
- 我們幾乎是在宇宙不同銀河系上, 不同檔次. Google 面對的問題, 很有可能我們這輩子永遠不會碰到, 同時也代表, Google 需要解決問題, 而我們卻不用.
大部分的軟體專案都是怎樣開始的?
- 大部分專案起步都是由一人做完所有程式工作. 現實中, 有上百萬件案例, 但我們看 Shopify 就好. Shopify 最初就是由 Tobias Lütke 一人開始寫的(底層是 Ruby on Rails, 現在仍是).
- 你覺得當時 Tobias 寫每行程式前, 都會癱坐在那, 煩惱要如何精心設計好每個完美的 microservice 嗎?
- 當然不會. 他在開發第一版的 Shopify 時, 我雖然不在現場. 但當時的版本只是一個賣滑雪用具的電商平台, 如果他跟我一樣(是一個典型的開發者), 大概會發生以下的事情:
- 在專案起步時, 會學一項全新的技術.
- 寫一些不習慣/綁手綁腳, 但運行完全正常的程式碼.
- 看著程式量逐漸增加會感到興奮.
- Refactor 去除那種 "該放火燒死" 的程式
- 每當要加入 production 一項新功能, 就再重複一次 loop
- 這看起來是一個很單純的 loop, 但對我來說, 我花了超過 20年才真正理解這 cycle 是如此深刻人心.
- 身為一位 PG, 你不會只因為外界謠傳需要具備甚麼最佳設置, 因而變強. 你要變強只能透過寫很多很多的程式, 而且都有確切意圖. 未來, 一旦你能開始第一手面對真實問題, 再用更好的寫法取代.
- 那些你取代的程式並不是浪費時間精力. 它能證明你有所成長.
來聊聊何謂 Code Abstractions
- 身為開發者, 我們都聽過一句話 "DRY: don't repeat yourself", 一般情況遵循它很合理, 但時常更適合先暫時 repeat yourself.
- 因為如果你要去 abstract 某個你不太理解的東西, 會造成 leaky abstraction(抽象洩漏).
- 我一般寫重複 code 到 3次以前都不會去想 refactor. 但當到第4次, 第5次, 就會去做.
- 是因為在你知道甚麼該改成變數, 甚麼該移除改寫成 inline 以前, 需要多看看這些 code 幾次, 看它們在不同情況下會怎樣.
-
abstraction 層級, 從 inline 到 external libraries
- Write inline code(coding 成同一行)
- Duplicate code a few times in different spots(少數幾次在不同地方, 有重複 code)
- Extract duplicate code into functions/etc.(將重複 code 抽進 function)
- Use your abstraction(s) for a while(短時間暫時用你的 abstraction)
- See how that code interacts with other code(看看 code 彼此間作用會變怎樣)
- Extract common functionality into internal library(抽出常用功能到 internal library)
- Use internal library for extended periods of time(先一段時間用 internal library 當做擴充)
- Really understand how all of the pieces come together(確實理解每個部分, 與彼此的關係)
- Create external library(open source, etc.) if it makes sense(建立 external library)
- 這就是為什麼你無法 "發明" 一個好的 library 或 framework. 幾乎每個我們今日使用的工具, 都來自現實世界上的專案, 而這個我們愛用的工具就是從 internal 抽出來的.
- Rails 就是最佳範例. DHH(Rails 的作者) 並不是某一天起床, 然後就說 "噗! 該是時候把專案分成 models/, controllers/ 和 views/ 資料夾了"
- 並不是. 他開發出 Basecamp(一項產品), 產出特定幾種的開發模式, 然後就從 Basecamp 轉移到 Rails. 今日仍然是以這樣的過程運作, 在我看起來, 這就是唯一的原因, 為什麼 Rails 到現在還是如此成功.
- 完整經過測試後的 abstraction, 讓你寫出吸引眾人目光的程式. 這也是為甚麼幾乎所有 "某個程式語言裡的 Rails", 這種概念的 framework 都會失敗. 他們都跳過關鍵的 abstraction chain 然後覺得就只要把 Rails 所做的事情複製過來就好了.
Code Abstraction 和 Microservices 的關係
- 我所認知的 microservices 只是另一層級的 abstraction. 我不會一定說它就是上述列的第10層, 因為並不是所有 libraries 都會成為 microservices.
- Microservices 不是你第一天開始會用到的技術, 就像是你不會在第一天, 連一行程式都還沒寫前, 就去建立一個 external library. 第一天你根本不知道你要做甚麼 library.
- 所謂架構上的 microservices 是你以 code base 日復一日解決問題, 逐漸演變成一項 microservices.
- 你可能從未遇到這些問題, 而這些問題也能夠透過其他辦法解決. 看看 Basecamp 和 Shopify. 它們是目前都做得不錯的 monolithic applications(整合型應用程式).
monolithic applications: 整合型應用程式裡面有許多邏輯服務, 而且都密不可分. 一旦其中一個服務不可用時, 就會造成另一個服務也無法使用. 因此常被拿來與 microservice 比較, 因為 microservice 彼此獨立自主, 並不會有這樣的問題.
- 我不認為任何人會稱它們是 small application. 沒錯, 它們的運作沒有大到像是 Google 的規模, 但我們可以用不同角度檢視.
Shopify 單月以一個 Monolithic App, 創造出超過 1700萬 美金的收入
這段省略, 只是在吹捧 Shopify
何時該用 Microservices?
- 那真的要看你和你的團隊如何決定. 如果你的情況下使用 microservice 很合理, 也不需要去 Google "microservices vs monolith". 你現在早已了解.
- 但有一種情況是, 如果你有很多開發者, 都適合在各自獨立的功能上工作. 那或許擁有很多團隊, 各自負責產品不同功能, 就會非常適用 microservices.
- 記住一點, 假如你有一個小團隊, 而團隊內成長緩慢, 可能從 1 或 2 個 microservices 後就停止繼續增加了. 而且大概不會想把所有 service 都轉成 microservices, 變成整合上百 service 的產品.
把 libraries 都轉成 microservices 值得嗎?
- 值得一提的是轉成 microservices 後, 會帶來本身的挑戰與問題. 你只是把問題轉移到另一個問題上, 所以需要評估優缺點, 看是否值得在專案上使用.
- 其中一項最大的問題是 monitoring. 你突然間會有很多 services, 橫跨在多台機器上執行, 被不同角色存取, 而你需要一個方法能窺探所有詳細資訊.
- 這個工作很難達成, 因為理想情況是你會用一個統一 service 聚集所有 services 並顯示這些 metrics 資訊.
部分段落省略
- 總而言之, monitoring 只是眾多挑戰之一, 但我覺得舉出這一點就夠了, 因為比起其他挑戰更難解決.
最終想法
省略