美國影片租賃服務Netflix在這次Amazon大當機事件中,除了少數用戶抱怨影片傳輸速度變慢外,幾乎不受影響,等於順利度過這次Amazon當機審判日的考驗。在Netflix負責IT架構、電子商務和系統工程的總監Adrian Cockcroft表示,Stateless Services(無狀態服務)的網站架構是不受影響的關鍵之一。

所謂的Stateless Services設計,簡單來說,就是指使用者透過瀏覽器向網站伺服提出的每一次請求(request)都是獨立的,彼此沒有相關的。因此,這一次的瀏覽器請求和下一次的請求,可以分別交給不同的網站伺服器來執行。

這個設計的優點是,因為每一次瀏覽器請求都是獨立的,即使是同一位使用者提出的每一次請求,都可以分別由不同的網站伺服器單獨執行,所以可以將這些瀏覽請求任意分散到不同的網站伺服器上,即使請求數量很大,也不會全數集中在特定伺服器上產生執行瓶頸。當使用者數量越來越多以後,造成瀏覽效果不彰時,只要增加更多的網站伺服器,就可以來分擔所有的工作量,換句話說,採取Stateless設計架構的網站可以輕易地擴充使用規模。

靜態網頁就是一種Stateless的服務,使用者瀏覽不同的靜態網頁時,任何一臺網站伺服器都可以依據使用者送出的網址來提供網頁內容,不需要從另一個網頁取得資訊。使用者越多時,只要增加越多網站伺服器,就可以透過流量平衡設備將瀏覽器請求分散到其他伺服器。

而Netflix正是採取了Stateless的網站架構,所以就可以將瀏覽器所呼叫的API服務任意指派給任意一個Amazon虛擬機器(Instance)來執行,而不需要綁定在特定虛擬機器上。

因此,在這次當機事件中,Netflix可以向Amazon購買其他地區的虛擬機器接手服務美東地區使用者的瀏覽器請求。對使用者而言,只是因執行伺服器處在更遠的資料中心而增加網頁瀏覽時間,但影片播放的功能則一點都不受影響。

不過,《AWS雲端企業實戰聖經》作者林允溥表示,要開發出Stateless架構的服務並非是一件容易的事。對於有依存關係的操作程序、瀏覽過程或有交易記錄的服務網站,例如購物車功能,若採取Stateless設計,使用者每次執行購物車中的交易動作,可能會由不同的網站伺服器執行,必須還有另外一臺負責統整瀏覽過程交易資訊的機制,才能提供最後的金額累計和訂購產品清單。

或像是身分確認機制,使用者透過某一臺網站伺服器的應用程式登入系統,登入資訊若只存放在這臺伺服器上,當這名使用者下一次瀏覽器動作改由另一臺伺服器執行時,這臺伺服器若沒有這名使用者登入成功的資訊,就會重複要求對方登入系統,造成難以登入系統的困擾。

力可科技資深軟體架構師陳彥任表示,為了打造Stateless架構的網站,有幾種常見的網站建置架構,可以保存互動網頁需要的狀態資訊。

在用戶端保存狀態資訊

第一種是在用戶端保存狀態資訊,將各種狀態資料儲存在使用者端的電腦中,例如使用Cookie儲存,或是下載一支Flash程式,在應用程式執行過程中,將狀態資料儲存在Flash程式內的本地端變數中。每次瀏覽網頁時,再透過網頁參數將這些狀態值傳遞給下一次負責執行的伺服器,來延續前一次的執行結果。這樣一來,即使每次都是由不同網站伺服器來提供服務,也能確保使用者資料的延續。

不過,這種方法的缺點是安全性較低,因為將狀態資料儲存在使用者端,即使透過加密機制避免資料遭竄改或竊取,但也有被破解的風險,或是在應用程式回傳資料給伺服器的過程中被攔截,所以,通常只會在用戶端儲存較不具機敏性質的狀態資料。

以專用Session伺服器儲存狀態

對於有機敏特性或是重要性較高的狀態資料,則是可以透過伺服器端的作法來保存。這種做法就是建立專用的Session伺服器來保存狀態資料。使用者接觸的前端應用伺服器上不保存狀態資料,而將網站應用程式執行過程需要的狀態資料,全部交由這臺Session伺服器來負責傳遞。這樣一來,只有這些少量的狀態資訊會集中,前端網站伺服器仍舊可以不斷擴充,來提高能承載的使用者規模。採用Session專用伺服器的作法比使用者端的作法更能確保資料不被惡意竄改或攔截。

不過,最終瓶頸仍舊會發生在Session伺服器,而且風險也會集中,一旦Session伺服器當機就會導致應用服務停擺,陳彥任表示,為了提高Session伺服器的可用性,可採取伺服器叢集架構,例如一般可以使用3臺伺服器組成Session伺服器叢集,以避免其中1臺發生故障。

當專用Session伺服器叢集接近滿載時,還可以透過分割使量的方式來擴充規模。例如將使用者分成10組,每一組只有原本的十分之一規模,一組使用者就由一套Session伺服器叢集來提供服務,未來增加了新的使用者,只要再多增加新的Session伺服器叢集就可以承載用量,來達到高擴充性的需求。

Stateless Services的設計能解決狀態資料集中的瓶頸來提高擴充性,陳彥任表示,另一個提高網站擴充性的作法是網頁內容API化。例如Amazon的書籍介紹網頁,對使用者而言看似只有一個網頁,但其實這個網頁組合了上百個API程式的執行結果,Amazon將網頁中的每一個功能或資訊,例如評星等、價格顯示、下訂單、推薦書籍等,都開發成一項API,在分散給不同的網站伺服器執行,使用者透過一個整合式的混搭網頁來匯集其他API伺服器提供的內容。

陳彥任表示,這類API化的網站,在架構設計上,必須盡可能簡化每一個API的功能,才能減少彼此的影響,達到分散和擴充規模的效果,這也是一種提高前端網站擴充性的方法。不過,每一個網頁都要等待其他伺服器執行完API後回傳資料,若內部網路頻寬不足,每個API的延遲時間會影響使用者看到網頁的流暢性。

Netflix在1年前決定將服務全數轉移到Amazon上時,也重新打造了新的系統架構,將網站內容全面API化,再透過API提供影音串流服務或其他功能給不同平臺或裝置上的使用者端程式,包括桌上型電腦、手機、平板電腦等,Adrian Cockcroft表示,因為網站規模成長太快,建置資料中心的速度太慢,將系統架構API化以後,就可以快速調度Amazon虛擬機器來擴充規模,不用自行準備硬體設備,甚至Netflix將常用的函式庫元件也API化,來提高內部應用程式執行共用元件時的彈性,可以由任一臺元件伺服器支援。

另外,Netflix也利用memcached記憶體式資料庫來儲存Session資料,作為API存取後端儲存系統或資料庫之間的中介。陳彥任表示,資料庫是打造網站擴充性的第一個瓶頸,除了利用叢集式資料庫架構或NoSQL資料庫來分散存取量外,也透過像memcached這類記憶體式資料庫作為常用資料的快取,也可以用來處理保存時限較短暫的Session資料。不過,若要讓多套memcached資料庫互相分享資料,則要自行建立同步機制,目前memcached還未提供自動同步資料庫內容的功能。

透過Stateless Services和API化的網站設計架構,Netflix只要將API服務複製到新的EC2虛擬機器上,就可以建立一個提供API服務的伺服器,能夠快速擴充承載規模,遇到當機事件時,也能快速將服務轉移到其他地區資料中心的虛擬機氣上,避開有問題的服務區域,這正是Netflix順利度過這次Amazon大當機的關鍵之一。

 

Netflix服務API化架構

Netflix網站架構API化以後,可以快速調度Amazon提供的虛擬機器來擴充承載規模,遇到Amazon當機事件時,也能快速將服務轉移到其他地區資料中心的虛擬機器上,避開有問題的服務區域。

 


相關報導請參考「Amazon雲端服務大當機的啟示

熱門新聞

Advertisement