小弟身為架構師的第一年,想想沒有架構比YT還要困難且麻煩,牽扯到影音轉檔、快取、大流量等問題,就決定趁著鐵人賽實做看看微Youtube。如果有錯誤歡迎指教,第一天我們就從大規模的專案熱愛的微服務開始說起!
事情總是有先來後到,在微服務被推行出來之前,有一個通俗大家常見的架構,叫做單體式應用程式(Monolithic application)。通常在單體架構下,所有的feature會混在一起放在同一個server內。再藉由router去做切換。
當專案複雜度不高的時候,架構或開發是很簡單的,測試跟部署也很簡單,因為只需要管一個server。
這邊我們得到單體式架構的兩個優點,在專案複雜度不高時
但當你的專案架構開始複雜,舉例來說,新增聊天室功能,因為聊天室的實作通常會使用websocket這類在server及 client中間建立持續連線的方式,於是你的架構不再是一個req對res的關係。或者是我們新增推薦系統,因為推薦系統會牽扯到cache,於是你在架構中新增redis,但其他服務並沒有依賴於相關的功能。
所以我們得到單體式架構的四個缺點,當你的專案逐漸複雜時
也因為單體式架構的缺點在大型專案或是多人協作的狀況下成為了嚴重的痛點,於是有了微服務的誕生。
微服務就是將單一應用程式劃分成多個小型服務。各服務各自執行獨立的程序,並且利用API溝通。各服務以企業業務邏輯會基礎發展。
以上面案例來說,就是我們將聊天室的服務隔離出來,讓他變成另一個應用程式,然後當使用者在呼叫聊天室功能的時候,其實走的都是聊天室這邊的應用程式服務。當我們拉出來額外做應用程式有哪些好處呢?
但你說微服務就無敵了嗎?不竟然,想想原本簡單的一個server被我們多拆分成好幾塊,如何讓他們有良好的溝通互動就成了問題。而不只是程式間的互動,開發者間的溝通也變得至關重要。這也跟DevOps的文化興起有關聯
另外,系統運作難免會出問題,但微服務是靠著許多鬆散耦合(Loosely-Coupled)的服務組成,假設你有數十數百個微服務要管理,「你會不容易發現問題在哪」,所以對於基本監控的項目包含系統出錯的次數以及服務可用性要有很高的掌握度。
所以我們整理出微服務的幾個難點
如果你已經是單體式應用程式,你是否應該轉向到微服務,我認為可以參考
程式的世界有趣的點就是沒有絕對,或許你能找到更好的方式解決問題。
微服務是在 SOA概念上陸續被實踐的方法,想了解更多可以參考:
SOA vs. Microservices https://www.ibm.com/cloud/blog/soa-vs-microservices
Microsrevices 微服務架構 https://ithelp.ithome.com.tw/articles/10228461
我們這次專案將會以微服務的概念規劃架構,並以”微”Youtube作為目標來挑戰設計。