上一篇的架構圖看起來似乎很完美了,所以我們來重新回頭檢視一下,使用者會與Web間可能會有的互動;假設我們開設的是一個購物網站,所以我們可能會有二種不同的角色來使用我們的網站,一種是買家,一種是賣家;我們重新以二種角色來考慮使用者可能的功能表。
買家:
-
登入
-
購物車
-
結帳
-
填寫送件資料
看起來就算在大架構下,只要Session能夠共享,資料庫是共用,似乎不會有什麼問題,再來看賣家:
賣家:
-
登入
-
上傳商品資料
-
上傳商品圖片
-
取得訂單資料
在不同的機器下,只要資料有正常的儲存到共同的資料庫下,似乎也不會有問題...除了一個東西以外-上傳商品圖片。
回想一下伺服器的運作方式,當使用者上傳檔案時,伺服器會先接收這個檔案後,將它放在本機的一個暫存資料夾,再來才是我們的程式去處理這個檔案;重點來了,這個檔案是被放在這一台使用者連線的機器上,但是當其使用者想去看這一張圖片時,不一定會連到同一台機器,這時候網頁會無法顯示這個檔案;再者,這一台機器可能會因為某些原因被關機,所以資料也會跟著不見;為了避免這類的問題,使用者上傳上來的檔案,我們必須放在一個:
-
各台機器可存取的地方。
-
使用者能讀取的地方。
要注意的是,這是不同的二個地方,因為機器能存取的地方,不一定是使用者能讀取的地方,以NFS(網路硬碟)為例:我們在內網架設了一台NFS的機器,讓各台Server都能存取,但使用者透過HTTP(S)時,網路硬碟掛載的資料夾卻不在伺服器程式的範例內,這個時候網頁也顯示不出這張圖。
這種情況下的解決方法有三個:
-
將掛載的NTS(網路硬碟)資料夾,放在伺服器的服務資料夾下(注意:不要放在程式部署的資料夾中,因為我們在昇級程式的過程中,可能將程式部署的整個資料夾刪除後,才部署新的程式;這種情況下,可能會把網路硬碟下的資料都刪除)。
-
利用網路空間來完成檔案的放置。可以利用AWS S3之類的網路空間,來達到我們要的效果。
-
將圖片儲放在資料庫中。
不過,這裡要提醒的是,我們要先考慮網站的規格,我們的網站會不會對檔案讀取有特殊的需求?例如:
-
讀取檔案的角色權限,某些檔案只有某些角色可以讀取。
-
需不需要30分鐘後讓聯結失效,這樣即使聯結外流,也不會造成困擾。
這一類的特殊需求,也是要在一開始在設計時,就需要考慮的東西,如果放在我們自訂的NFS上,就會需要另一個專案來負責這一段,否則就要在一開始選擇網路空間時,考慮我們選擇的網路空間是否有提供這種特殊需求,或是如何達成這類需求。
先假設我們利用NFS來達成我們的功能,此時的架構圖如下:
上傳資料與程式的變更
瞭解到上傳功能的問題後,程式要負責變更的部份是:
-
在使用者上傳資料後,程式要負責搬移資料。
- 或是引導使用者直接上傳資料到負責資料的伺服器上。