當前位置: 妍妍網 > 碼農

我們的小程式每天早上都白屏,真相是。。。

2024-05-08碼農

大家好,我是程式設計師魚皮。最近我們在內測一款面試刷題小程式,沒錯,就是之前倒下的 「面試鴨」!

點選即可內測體驗

在我們的內測交流群中,每天早上都會有同學反饋:開啟小程式空白,沒任何內容且登入不上。

然後過了一會兒後,發現又恢復了,難道是我們又又又又寫出了什麽詭異的 bug 嗎?

哈哈哈,其實不然,因為我們面試鴨的後端服務 Serverless 化了!

那什麽是 Serverless 呢?這事說來話長,但是我們長話短說,想要理解這個名詞,還得從遠古時代說起。。。

遠古時代

在很久很久之前,一家公司如果要上線一個網站,需要啥呢?

需要一台物理伺服器對吧。透過在伺服器上安裝虛擬化軟體,可以將一個配置很高的物理機劃分成多個 「小伺服器」,一台安裝 Nginx、一台安裝後端服務、一台安裝資料庫等等。

如果當前網站的使用者量大了,那麽手動擴個容,多劃一台 「小伺服器」 給後端服務。當服務掛了需要重新開機服務,當遇到業務問題需要登入到伺服器上檢視日誌。

這個時期,公司需要專門分配人員來運維管理這些伺服器,不僅需要處理伺服器的資源問題,還需要幫忙排查日誌、釋出部署服務等。

雲服務商時代

到現在,市面上絕大部份的公司都不需要主動去購買物理伺服器了,而是從雲廠商手上買雲伺服器。

相信很多同學都買過大廠的雲伺服器,我們可以在買來的伺服器上安裝 Nginx、Tomcat、部署靜態資源和後端 Java 服務,完全不需要管什麽物理機,不用考慮這個伺服器線下的機房情況,比如機房內有沒有開空調、伺服器會不會過熱之類的。

雖然沒有實體的物理機,但是使用起來還是有伺服器的概念,當資源不夠的時候,還是需要手動配置擴容(一般就是花錢升級配置)。

即使在雲伺服器上安裝 Docker 容器來部署計畫,還需要人工對集群進行維護和容量規劃,需要分配人員來維護管理這些雲伺服器。

無伺服器時代 Serverless

因為 「有伺服器」 的概念,即使有很多自動化的運維工具,還是需要運維人員來管理配置。

那假設沒有伺服器呢?沒伺服器還需要人來管啥嗎?

這就是 Serverless,直譯過來就是 無伺服器

這裏的無伺服器不是說真的不需要伺服器,而是一些雲廠商進行了封裝,讓我們這些使用者感受不到伺服器的存在。

舉個例子,如果我們想部署一個網站,在使用上可能就是在頁面上填寫程式碼倉庫、指定要釋出的分支、設定一下埠。

然後再給服務配置一下使用的資源,就完事兒了!

從上圖的配置中我們可以看到,預設例項數是 0 ,表示空閑的時候不需要例項副本,如果當前例項的 CPU 使用率大於 60 % 就自動擴容,最多可以擴容至 5 個例項。

相比於以前要自己登入到伺服器上執行命令來部署程式,使用這種界面化操作,是不是簡單了很多?是不是完全感受不到伺服器的存在?

並且我們還可以直接從界面檢視服務日誌、監控服務等,完全不需要 SSH 遠端連線到伺服器並用一通 Linux 命令來操作。

這樣一來運維復雜度都交給雲服務廠商了,我們基本上不需要承擔運維工作。

相信看到這大家對 Serverless 應該有點了解了,已經體會到它的好處了。

註意,這篇文章中,所說的 Serverless 其實更多指的是 Serverless 化,即無機器化、免運維化。

而很多時候 Serverless 指的是另一種含義,即 Serverless Computing 架構:FaaS (函式即服務)+ BaaS(後端及服務)。也是亞馬遜在 2014 年推出的 FaaS 服務 Lambda,才將 Serverless 帶入大眾視野。

這裏我就不展開解釋什麽叫 FaaS、BaaS 了,有興趣的同學可以自行查閱資料, 想看的人也可以留言,如果多的話後面我再出一篇文章。

回到面試鴨的問題

說了這麽多,有些同學可能要問,所謂的 Serverless 和面試鴨每天早上白屏的問題有什麽關系嗎?

哈哈,眼尖的同學可能從上面的配置中就已經發現問題了。

沒錯就是這個例項副本數!面試鴨後端服務最小的副本數設定的就是 0 !

也就是說如果很長一段時間沒有人存取面試鴨的服務,那麽例項數就會減少到 0 ,一旦有使用者在這個時候存取面試鴨,那麽就需要重新啟動例項,這個過程就是所謂的冷啟動(Cold start)。

其實很好理解,就好比我們在 IDEA 中啟動 Java 程式一樣,它需要一些時間才能把服務啟動好。

對應到 Serverless 中,如果沒有可用的容器例項,此時請求過來,它就需要啟動一個新容器,新容器的分配、啟動、載入程式,都需要時間。

所以, 冷啟動會產生延遲時間 ,這也是為什麽很多人強推套用的雲原生化,追求程式的快速啟動。

正常情況下半夜沒人存取面試鴨,導致例項都關了,一些同學一大早開啟面試鴨,觸發冷啟動,因為延遲原因導致登入不上且沒面試題,過一段時間後,容器啟動完畢,此時存取又一切正常。

看到這應該有同學能想到解決方法,把最小例項數改為 1 不就好啦?

哈哈,確實如此。之所以最小例項副本設定為 0,是因為 Serverless 服務是 按時計費 的,因為面試鴨還在內測階段,使用者數不多,使用時長也並不長,所以我們就能省則省啦~

這個按時付費,也是 Serverless 的一個優勢,低峰期的時候甚至可以 0 支出呢!也比較適合學習計畫部署的朋友。


👇🏻 點選下方閱讀原文,獲取魚皮往期編程幹貨。

往期推薦