解釋有狀態(tài)與無狀態(tài)架構(gòu)設(shè)計
什么是有狀態(tài)(Stateful)?
想象一下,你去一家忙碌的餐廳吃飯,同一個服務(wù)員從頭到尾為你服務(wù)。他會記住你的點(diǎn)單以及所有需求。
但是問題來了:如果這個服務(wù)員中途休息或換班了,接替他的服務(wù)員就不知道你之前點(diǎn)了什么。這意味著你必須重新開始,和新服務(wù)員說明一切。
這和有狀態(tài)服務(wù)器的工作方式很相似。有狀態(tài)服務(wù)器會記住你的會話信息,比如登錄數(shù)據(jù)、偏好設(shè)置等。
但問題是,如果你的下一次請求被另一個服務(wù)器處理,那么那個服務(wù)器就不知道你是誰,也沒有你的信息。因此,為了讓會話正常工作,你的所有請求都需要由同一個服務(wù)器處理。
什么是無狀態(tài)(Stateless)?
現(xiàn)在,讓我們看看無狀態(tài)架構(gòu)。想象一下另一家餐廳,這里的服務(wù)員不是用記憶來記錄客戶的訂單,而是把訂單寫在紙上。
這樣,任何服務(wù)員都可以拿起這張紙繼續(xù)為客戶服務(wù)。這就像無狀態(tài)的 Web 服務(wù)器的工作方式。
在無狀態(tài)系統(tǒng)中,沒有任何服務(wù)器“記住”你是誰。當(dāng)用戶發(fā)送請求(比如登錄或訪問個人資料)時,服務(wù)器不會保存這些信息,而是將用戶的數(shù)據(jù)存儲在其他地方,比如數(shù)據(jù)庫中。
這樣,即使不同的服務(wù)器處理你的下一個請求,也可以從數(shù)據(jù)庫中獲取你的信息并返回結(jié)果,而不會有任何問題。
示例:在線購物
我們用一個常見的例子來說明:在線購物。
在一個有狀態(tài)系統(tǒng)中,比如你將一些商品添加到購物車中,處理你會話的服務(wù)器會記住你的購物車內(nèi)容。如果你稍后回來,你的商品還在——但前提是你連接到同一臺服務(wù)器。
如果那臺服務(wù)器宕機(jī)了,或者你的請求被另一個服務(wù)器處理,你的購物車可能會丟失。
在一個無狀態(tài)系統(tǒng)中,你的購物車被保存到共享數(shù)據(jù)庫中。因此,無論哪臺服務(wù)器處理你的請求,都可以從相同的地方獲取你的購物車信息。
這種方式使得系統(tǒng)能夠更輕松地處理流量高峰和服務(wù)器故障,因?yàn)闆]有任何一臺服務(wù)器需要單獨(dú)存儲會話信息。
無狀態(tài)系統(tǒng)更具可擴(kuò)展性
為什么在構(gòu)建大規(guī)模系統(tǒng)時,這一點(diǎn)非常重要?因?yàn)楫?dāng)你的網(wǎng)站變得非常受歡迎時,你需要增加更多的服務(wù)器來處理所有的流量。
在一個有狀態(tài)系統(tǒng)中,擴(kuò)展會更困難。由于每個用戶的會話都綁定到特定的服務(wù)器,你必須確保用戶始終連接到同一臺服務(wù)器。這種管理非常復(fù)雜,尤其是在服務(wù)器宕機(jī)或需要快速添加新服務(wù)器時。
在一個無狀態(tài)系統(tǒng)中,添加或移除服務(wù)器非常簡單。每臺服務(wù)器都可以處理任何用戶的請求,因?yàn)樗械闹匾獢?shù)據(jù)都存儲在其他地方,比如數(shù)據(jù)庫中。
最終示例:社交媒體
想想社交媒體。如果像 Facebook 或 Instagram 使用的是有狀態(tài)系統(tǒng),那么每次你刷新動態(tài)或查看消息時,都需要連接到同一臺服務(wù)器。
這種方式顯然不適用于數(shù)百萬用戶。但在一個無狀態(tài)系統(tǒng)中,任何服務(wù)器都可以處理你的請求,因?yàn)槟愕臄?shù)據(jù)(如消息、照片、帖子)都存儲在共享數(shù)據(jù)庫中。
這使得無狀態(tài)系統(tǒng)更加適合需要擴(kuò)展并同時處理大量用戶的大型應(yīng)用。
結(jié)論
總結(jié)一下:
- 有狀態(tài)意味著服務(wù)器會記住你的信息,但不容易擴(kuò)展。
- 無狀態(tài)意味著服務(wù)器不會記住你,但這沒關(guān)系,因?yàn)槟愕臄?shù)據(jù)存儲在數(shù)據(jù)庫中,這使得系統(tǒng)非常容易擴(kuò)展。
對于需要快速發(fā)展的應(yīng)用,無狀態(tài)通常是首選的架構(gòu)設(shè)計。