10 年程序員了竟然不懂大型網站架構技術細節:雲計算服務工作原理
雲計算服務的工作原理
在討論雲計算服務架構之前,先介紹雲計算服務的應用場景,然後介紹其開發語言及框架,之後再講解雲計算服務的工作原理。在瞭解了雲計算服務的工作原理之後,我們才能更好地理解雲計算服務架構需要關注的細節。
雲計算服務的應用場景
雲計算服務一般是運行時間較長或者需要持續運行的軟件,如視頻轉碼服務、爬蟲服務和數據分析服務等。也就是說,雲計算服務提供的是網站系統的雲計算能力。雲計算服務的應用場景衆多,根據網站系統的服務對象和所在領域不同會有所不同。
那麼,爲什麼雲計算服務需要和後端應用程序分離呢?這是因爲後端應用程序處理的是頻繁且生命週期較短的請求,而云計算服務是需要長時間運行的,如果後端應用程序運行時間過長,就會造成請求超時和 Web 應用服務器線程阻塞等問題。例如,前端發送一個視頻轉碼請求到後端應用程序,後端應用程序接收到該請求後,會開啓雲計算服務的視頻轉碼服務並返回結果,而云計算服務的轉碼服務會持續執行一段時間,如圖 5.1 所示。
圖 5.1 視頻轉碼任務的調度流程
雲計算開發語言及其框架
由於雲計算服務軟件應用場景衆多,且不同開發語言的擅長領域有所區別,所以雲計算服務軟件的開發語言是不固定的。例如,人工智能方向的雲計算服務軟件一般是使用 Python 編寫的,大數據方向的雲計算服務軟件一般是使用 Java 或 Python 編寫的,音視頻方向的雲計算服務軟件一般是使用 C++ 編寫的。
至於雲計算服務軟件的框架,也是不統一的,一般是開發團隊根據實際情況搭建的。搭建雲計算服務軟件框架需要考慮很多問題,如任務調度、異常重試、彈性伸縮和任務進程管理等,這些問題都需要長時間的驗證和試錯,這無疑會增加自建雲計算服務的難度。不過,一套穩定的雲計算服務軟件框架,無疑會成爲大型網站系統的強大後盾。
注意:如果雲計算服務與海量數據分析相關,那麼可以使用現今比較流行的 Hadoop 框架。然而本章介紹的是通用的雲計算服務,因此不會對 Hadoop 展開介紹。
雲計算服務軟件的工作原理
通過 5.1.1 小節的學習可知,後端應用程序與雲計算服務軟件是相互獨立的,且一般是多對多的關係,如圖 5.2 所示。其中,應用程序 1 到應用程序 4 指的是相同的後端應用程序,它們部署在不同的服務器上,服務軟件 1 到服務軟件 4 指的是相同的雲計算服務軟件,它們可能部署在一個或多個服務器上。一般情況下,同一時間內,一個雲計算服務軟件一次只能處理一個任務。
圖 5.2 後端應用程序與雲計算服務軟件的多對多關係
說明:圖 5.2 中的應用程序 1 到應用程序 4 指的是相同的後端應用程序。
因爲在大型網站系統中,後端應用程序需要處理大量的請求,而單個服務器的處理能力有限,所以相同的後端應用程序會被部署在多個服務器上。
在瞭解了後端應用程序和雲計算服務軟件的關係後,下面開始介紹雲計算服務的工作原理。雲計算服務按任務的生命週期和雲計算服務軟件的穩定性可以分成任務發佈和任務回饋、任務進度或中間結果、任務變更、雲計算服務軟件監控 4 個部分。
注意:以下介紹的雲計算服務軟件的工作原理是基於通用場景介紹的,具體實踐可能會有所差異,讀者需要根據實際情況斟酌參考。
- 任務發佈和任務回饋
由於後端應用程序和雲計算服務是多對多的關係,而且雲計算服務執行一次任務一般需要較長的時間,即任務發佈時可能沒有空閒的雲計算服務軟件(存在任務無法立刻被執行的情況),所以需要在後端應用程序與雲計算服務之間添加一個任務池,作爲後端應用程序和雲計算服務間接通信的樞紐。
任務發佈時,後端應用程序生成唯一的任務 ID,然後把任務發佈到任務池中,並把任務標記爲 “等待” 狀態,且將狀態記錄在數據庫中(也可以記錄在 Redis 等非關係型數據庫中)。多個空閒的雲計算服務軟件會在任務池中監聽任務,一個任務只會被一個雲計算服務軟件佔有。一個雲計算服務軟件取得任務後,開始執行任務並通知後端應用程序“任務開始執行”,後端應用程序把任務狀態改爲“開始”。
任務處理完畢後或發生異常時,雲計算服務軟件向後端應用程序回饋結果,回饋的結果包括錯誤碼及其描述,以及任務結果參數等。後端應用程序把任務狀態改爲 “結束”,並把錯誤碼及其描述以及任務結果參數記錄下來。
任務發佈和任務回饋的流程如圖 5.3 所示。其中,雲計算服務通知後端應用程序的方式一般是直接調用後端應用程序提供的 RESTful API。
圖 5.3 任務發佈和任務回饋流程
- 任務進度或中間結果
在任務執行期間,前端往往需要獲取任務進度或一些中間結果,以視頻轉碼爲例,前端需要獲取視頻文件的轉碼進度。而獲取任務進度或中間結果的最直接方法,應該是前端向後端應用程序發送請求,後端應用程序從雲計算服務獲取任務進度或中間結果。
但是,由於後端應用程序和雲計算服務是多對多的關係,後端應用程序直接從雲計算服務獲取任務進度或中間結果的做法實際上是十分煩瑣的,所以需要在後端應用程序與雲計算服務之間添加一個進度數據池,作爲後端應用程序和雲計算服務間接通信的樞紐。
任務開始後,雲計算服務軟件定期向進度數據池更新任務進度或中間結果,後端應用程序根據任務 ID 從進度數據池中獲取對應任務的進度或中間結果,如圖 5.4 所示。
圖 5.4 任務進度或中間結果獲取流程
- 任務變更
在執行任務期間,雲計算服務還需要處理任務的變更,例如取消任務、暫停任務、設置變更和執行指令等。當發生任務變更時,後端應用程序需要通知正在執行該任務的雲計算服務軟件。爲了實現這樣的目的,需要在後端應用程序與雲計算服務軟件之間增加一個指令池。
每個雲計算服務軟件在初始化時都需要向指令池註冊一個獨有的消息隊列並監聽該消息隊列。當開始執行任務時,雲計算服務軟件在通知後端應用程序 “任務開始執行” 時需要攜帶指令池中的消息隊列標識,後端應用程序需要把消息隊列標識記錄到數據庫中(也可以記錄到 Redis 等非關係型數據庫中)。
當需要執行任務變更時,雲計算服務軟件根據消息隊列標識向指令池發送任務指令,雲計算服務軟件從指令池中獲取任務指令後開始執行任務指令。任務變更流程如圖 5.5 所示。
圖 5.5 任務變更流程
- 雲計算服務軟件監控
加入了任務池、進度數據池和指令池後,雲計算服務軟件就可以順利地執行任務。由於一個雲計算服務軟件在同一時間只能處理一個任務,因此在一個服務器當中存在多個同時運行的雲計算服務軟件。這些雲計算服務軟件是獨立運行的,運行的過程中可能會發生意想不到的錯誤、崩潰和異常退出等情況,當出現這些問題時,雲計算服務軟件需要被重新啓動。
說明:當雲計算服務軟件出現錯誤、崩潰和異常退出等情況時,當然是需要被修復的。但是這些問題往往是在正式運營後纔會逐漸浮現出來的,而且這些問題往往需要特殊的條件才能觸發(一般情況下不會發生)。因此,如果雲計算服務軟件異常退出後可以重新啓動,則大概率能降低該特殊情況造成的影響。因此,在每個運行雲計算服務軟件的服務器中都需要一個監控軟件,其職責爲監控和啓動雲計算服務軟件。在服務器開機啓動時,監控軟件會按配置啓動幾個雲計算服務軟件並記錄其進程 ID。雲計算服務軟件在運行過程中,需要定時向監控軟件彙報當前狀態(運行或空閒狀態)。
由於雲計算服務軟件和監控軟件是相互獨立的,所以在它們之間需要加入一個狀態數據池。雲計算服務軟件向監控軟件彙報當前狀態時,只需要向狀態數據池寫入其狀態即可。監控軟件檢查雲計算服務軟件的狀態時,也只需要讀取狀態數據池中的相關數據即可。
監控軟件定時檢查各個雲計算服務軟件的狀態,若存在長時間未彙報的雲計算服務軟件,則判定爲該軟件已經發生異常。當發現異常的雲計算服務軟件時,監控軟件憑藉進程 ID 將其銷燬(存在異常軟件已經自動退出的情況),並啓動新的雲計算服務軟件。另外,當所有的雲計算服務軟件處於運行狀態時(執行任務時),監控軟件根據具體情況(當前 CPU 和內存的使用率、配置的最大雲計算服務軟件個數),決定是否啓動新的雲計算服務軟件。
另外,一個雲計算服務軟件在執行完幾次任務後需要自動退出,不可長時間運行。雲計算服務軟件自動退出後,由於其不再向狀態數據池更新狀態,監控軟件會認爲該軟件發生了異常,進而啓動一個新的雲計算服務軟件。
雲計算服務軟件的自動消亡和重啓,可以避免一些由於長時間運行而造成的問題,如內存泄漏等。一般情況下,軟件需要經過長年累月的測試與修復,才能達到長時間穩定運行的程度(如 Tomcat)。但是,即使是這些穩定的軟件,也難免會受到操作系統或某些物理因素的影響而發生異常。而一般的雲計算服務軟件,其實只需要保證一個或幾個任務週期內順利運行即可,無須保證長時間運行的穩定性。
通過自動消亡和重啓雲計算服務軟件,可以規避一些穩定性的問題,也能節省一些開發成本。
綜上,在一個服務器內,監控軟件與雲計算服務的工作流程如圖 5.6 所示。其中,由於監控軟件也可能存在異常退出的情況,所以監控軟件也應該被監控。對於監控軟件的監控將會在 5.6 節 “監控軟件的構造” 中詳細介紹。
圖 5.6 監控軟件與雲計算服務的工作流程
來源:
https://www.toutiao.com/article/7179474622931534376/?log_from=b7539bdd116a98_1672194722238
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/eo9z2_KqwSQ7g963EAap4g