主從式模型(client-server model)
想像一間餐廳。你這位顧客不會自己走進廚房煮菜;你坐下來、向服務生點一道菜,廚房準備好後再送出來。你是客戶端(你發出請求),廚房是伺服器端(它握有資源、負責做事)。主從式模型把分散式系統正好組織成這兩種角色:客戶端開口要東西,而一個或多個擁有某種資源或能力的伺服器來回應。
具體來說,伺服器是一支等候、傾聽外來請求的程式;客戶端則是一支發起請求、等待回覆、再使用回覆的程式。網頁瀏覽器向網頁伺服器要一頁、電子郵件程式向郵件伺服器收信、App 從資料庫伺服器讀取資料列——全都遵循同一種「請求與回覆」的形狀。客戶端通常不知道、也不在乎伺服器內部是怎麼蓋的;它只知道雙方約定的介面(它被允許發出的那組請求)。伺服器是它那份資料的權威所在,這有助於維持一致性,因為「由誰決定」這件事只集中在一個地方。
為什麼重要,以及它的極限:主從式之所以是網際網路的主流結構,是因為它容易推理、也容易加固安全(你掌控並強化伺服器)。它的弱點正是這枚硬幣的反面:伺服器可能變成瓶頸(所有人都得擠過它),也可能是單一故障點(它一掛,它的所有客戶端就卡住)——這正是伺服器常常被複製的原因。把這個拿來對照點對點模型:在後者中,每個節點同時是客戶端也是伺服器,沒有中央權威。
當你開啟一個網頁時,你的瀏覽器(客戶端)會送出一個像「GET /index.html」這樣的請求給網頁伺服器。伺服器找到那一頁、送回來,然後又回到等待下一個客戶端的狀態。可以有上千個客戶端對著那一台伺服器說話,這正是為什麼熱門的伺服器必須夠強大、或被複製。
客戶端發出請求,伺服器回答。容易推理,但伺服器可能變成瓶頸。
客戶端與伺服器是角色,不是機器。同一支程式可以對某些請求是伺服器、對另一些請求是客戶端(一台向資料庫取資料的網頁伺服器,就是那個資料庫的客戶端)。別把「伺服器」直接等同於「又大又貴的電腦」。