Dazejs高性能路由設計-前綴樹路由

介紹

首先介紹一下什麼是路由,路由就是根據請求信息將請求定位到具體的實現邏輯的過程node

這個過程咱們稱之爲 路由尋址git

而衡量路由的性能就是經過尋址的時間來判斷,時間越短性能越高github

傳統路由結構

咱們都用過 expess 或者 koa + koa-router 來開發項目數組

它們經過數組的形式保存路由映射表,經過正則匹配的方式遍歷路由表來進行尋址數據結構

這種方式直觀、簡單,可是路由多的狀況下,會消耗很是多的資源去作大量沒必要要的匹配koa

基於"前綴樹"的路由結構

爲了提高尋址能力,咱們可使用空間換時間的方式,將請求 path 拆分後,以特殊的數據結構存儲性能

存儲

咱們註冊如圖4個路由:測試

首先,全部路由按照請求 method 分紅對應的 method 樹優化

而後將請求根據 / 拆封後,組裝成樹形結構code

爲了提高匹配性能,存儲節點的時候會保存節點類型,而後根據類型進行匹配

搜索

咱們拿到請求路徑以後,一樣根據/拆分,

首先根據 method 找到對應的樹

而後在樹中進行遞歸搜索,若是匹配到當前節點,則進行下一層搜索 每一個節點都分爲兩種類型: 正則、字符串

若是當前節點爲正則類型則使用正則匹配,適用於正則路由與參數路由等

若是當前節點爲字符串類型則使用權等匹配,減小正則匹配次數,提高性能

優化

爲了更大的性能提高(減小匹配次數),將節點進行優先級分類,將通過節點的路徑最多的節點排在前面

這樣將熱門路由放在前面,用最少的次數就能夠匹配到(後續能夠增長手動設置優先級功能)

基準測試

機器比較爛,對比一下就好....

Dazejs + 1000個路由

Stat Avg Stdev Min
Req/Sec 33122.91 2705.63 25830
Bytes/Sec 4.8 MB 2.64 KB 25.22 KB

Express + 1000個路由

Stat Avg Stdev Min
Req/Sec 11809.64 1232.99 8115
Bytes/Sec 2.42 MB 1.2 KB 7.92 KB

Koa + Koa-router + 1000個路由

Stat Avg Stdev Min
Req/Sec 6851.46 571.17 5103
Bytes/Sec 1016.86 KB 571 B 4.98 KB

更多

項目地址:github.com/dazejs/daze

題外話

目前不少 node 應用都是中間層,一丟丟的路由尋址優化其實能夠忽略

相關文章
相關標籤/搜索