iT邦幫忙

DAY 20
6

node.js伺服器實戰系列 第 20

node.js伺服器實戰(20) - 伺服器架構設計

做好了最基本的測試來做好QA,以及利用自動化的方式來提昇開發效率後,該繼續前進了。之前寫的伺服器程式,其實都只是簡單的發想與實做而已,所以現在需要針對伺服器需求,來考慮怎麼做好設計。
http的支援

http本身的結構很簡單,就是request+response,node.js的http/https模組,也在request事件中,提供了這兩個物件,來支援http的操作。

之前開發的伺服器程式中,只針對了http request結構中的host、method、path做處理,但是讓http能夠提供各種各樣服務的能力,還有一個重點是header的處理。以cookie為例,他的生命週期是client在控制,只要cookie還有效,request中就會有cookie這個header。伺服器也需要有能力設定cookie,要設定cookie的話,需要在response中加入setcookie這個header。server收到的所有request header,其實都是一個字串,所以收到以後,還需要有適當的parser來處理他。回傳的response header也是一個字串,所以需要依照規格中制定的格式來產生他。這些是處理header至少需要做的事情。

request header跟request body的處理會有關係,例如在post的時候送出form data,通常會收到url encoded格式的request body,需要剖析他來取出html form傳來的資料。如果是上傳檔案,那會收到multipart/form-data格式的資料,同樣也需要有適當的方法來處理。

request header也可能會跟response body有關係。例如收到的request headers裡面有range header,那就需要做處理,依照range裡面要求的資源的start與end的offset來讀取資源來寫入response body。

整理一下可能的需求與流程變化:

  1. 只需處理request header的資料
  2. request header影響是否繼續流程(ex. http auth)
  3. request header影響response status(ex. auth failed, range)
  4. request header影響response header(ex. range)
  5. request header影響response body(ex. range)
  6. response header影響request header(ex. http auth)
  7. 只需處理response header
  8. 只需處理response body

看起來是互相影響,很難使用單純的流程來處理所有的header。不過大致上可以區分為:

  1. 不影響伺服器流程
  2. 依條件影響伺服器流程
  3. 改變伺服器流程

不影響伺服器流程的header handler,可以考慮把處理後的資訊寫入request物件,之後的流程可以視需要使用這些資料。

依條件影響伺服器流程時,會依照條件判斷,是否要進入伺服器處理的標準流程。

改變伺服器流程的話,則完全不會進入伺服器處理的標準流程。

依照http可能發生的狀況,以及之前設計好的fs mapping/router機制來設計伺服器流程的話,可以考慮分成三個流程:

  1. pre dispatch
  2. dispatch
  3. post dispatch

伺服器可以根據功能的需求,自訂要載入的handler,但是如果把dispatch流程放在處理header之後會有一個問題,就是無法依照各個router規則或是path來設定處理方式。這個要再想想。

分工與協作的考量

除了達成http伺服器該有的功能,使用者怎樣使用也是一個重要的考量。

之前設計好的router機制,已經可以讓使用者自己任意撰寫伺服器端的程式,但是還是需要考慮到使用者的需求來設計更細部的流程。這裡主要得考量有:

  1. 之前已經設計好了一些工具函數,這些要怎樣讓開發者也可以使用
  2. 之前的設計,是傳給route handler一個callback函數,開發者要利用這個來把要輸出到response的結果傳送給它。不過view的設計可能會是非同步的,但是結果還是需要依照特定的順序
  3. 是否有可能透過一些事件機制,把所有的部份串起來?

初步設計

考慮了一下node.js運行的方式,基本上雖然在程式裡面寫好了一些比較動態的功能載入方法,實際在運行時,在node.js載入程式時就會做好編譯,這樣的話依照每個host或路徑規則載入功能其實不太有意義。

所以要設計載入功能的話,可以把每個要載入使用的功能,例如cookie、auth、session、range等等,依照規劃好的三個階段:pre-dispatch、dispatch、post-dispatch,把功能切成三個部分,一些要自動處理或是要在dispatch之前處理的程式,就把它放在pre-dispatch。需要在程式中給開發者呼叫的功能,則利用一些方法dispose給開發者使用。至於post-dispatch的部份,以及需要設計view layer的功能的部份,我想等到稍後在來考慮。

在pre-dispatch中,可以決定是否要進入dispatch,還是要跑自己的流程。

在dispatch中,實際上是在已經dispatch完畢的route handler中跑,這時候可以自己考慮是否要進入標準的post-dispatch流程,或是結束。

這樣切清楚以後,就可以實作流程的機制與handler的標準,另外,如果要開放撰寫handler plugin,這樣也有一定的設計方法。這些等到明天再來做吧。

相關文章


上一篇
node.js伺服器實戰(19) - 靜態分析
下一篇
node.js伺服器實戰(21) - 建構伺服器流程
系列文
node.js伺服器實戰33
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言