close

上一篇的架構圖看起來似乎很完美了,所以我們來重新回頭檢視一下,使用者會與Web間可能會有的互動;假設我們開設的是一個購物網站,所以我們可能會有二種不同的角色來使用我們的網站,一種是買家,一種是賣家;我們重新以二種角色來考慮使用者可能的功能表。

    買家:

  • 登入

  • 購物車

  • 結帳

  • 填寫送件資料

看起來就算在大架構下,只要Session能夠共享,資料庫是共用,似乎不會有什麼問題,再來看賣家:

    賣家:

  • 登入

  • 上傳商品資料

  • 上傳商品圖片

  • 取得訂單資料

在不同的機器下,只要資料有正常的儲存到共同的資料庫下,似乎也不會有問題...除了一個東西以外-上傳商品圖片。

回想一下伺服器的運作方式,當使用者上傳檔案時,伺服器會先接收這個檔案後,將它放在本機的一個暫存資料夾,再來才是我們的程式去處理這個檔案;重點來了,這個檔案是被放在這一台使用者連線的機器上,但是當其使用者想去看這一張圖片時,不一定會連到同一台機器,這時候網頁會無法顯示這個檔案;再者,這一台機器可能會因為某些原因被關機,所以資料也會跟著不見;為了避免這類的問題,使用者上傳上來的檔案,我們必須放在一個:

  1. 各台機器可存取的地方。

  2. 使用者能讀取的地方。

要注意的是,這是不同的二個地方,因為機器能存取的地方,不一定是使用者能讀取的地方,以NFS(網路硬碟)為例:我們在內網架設了一台NFS的機器,讓各台Server都能存取,但使用者透過HTTP(S)時,網路硬碟掛載的資料夾卻不在伺服器程式的範例內,這個時候網頁也顯示不出這張圖。

這種情況下的解決方法有三個:

  1. 將掛載的NTS(網路硬碟)資料夾,放在伺服器的服務資料夾下(注意:不要放在程式部署的資料夾中,因為我們在昇級程式的過程中,可能將程式部署的整個資料夾刪除後,才部署新的程式;這種情況下,可能會把網路硬碟下的資料都刪除)。

  2. 利用網路空間來完成檔案的放置。可以利用AWS S3之類的網路空間,來達到我們要的效果。

  3. 將圖片儲放在資料庫中。

不過,這裡要提醒的是,我們要先考慮網站的規格,我們的網站會不會對檔案讀取有特殊的需求?例如:

  1. 讀取檔案的角色權限,某些檔案只有某些角色可以讀取。

  2. 需不需要30分鐘後讓聯結失效,這樣即使聯結外流,也不會造成困擾。

這一類的特殊需求,也是要在一開始在設計時,就需要考慮的東西,如果放在我們自訂的NFS上,就會需要另一個專案來負責這一段,否則就要在一開始選擇網路空間時,考慮我們選擇的網路空間是否有提供這種特殊需求,或是如何達成這類需求。

先假設我們利用NFS來達成我們的功能,此時的架構圖如下:

大架構-負載平衝+Memcached+NFS.png

上傳資料與程式的變更

瞭解到上傳功能的問題後,程式要負責變更的部份是:

  • 在使用者上傳資料後,程式要負責搬移資料。

  • 或是引導使用者直接上傳資料到負責資料的伺服器上。
arrow
arrow

    JAVA Programmer 發表在 痞客邦 留言(0) 人氣()