美文网首页
Dazejs高性能路由设计-前缀树路由

Dazejs高性能路由设计-前缀树路由

作者: 弦止音凉 | 来源:发表于2020-03-11 14:03 被阅读0次

介绍

首先介绍一下什么是路由,**路由就是根据请求信息将请求定位到具体的实现逻辑的过程**

这个过程我们称之为 **路由寻址**

而衡量路由的性能就是通过寻址的时间来判断,时间越短性能越高

传统路由结构

我们都用过 `expess` 或者 `koa + koa-router` 来开发项目

它们通过数组的形式保存路由映射表,通过**正则匹配**的方式遍历路由表来进行寻址

这种方式直观、简单,但是路由多的情况下,会消耗非常多的资源去做大量不必要的匹配

基于"前缀树"的路由结构

为了提升寻址能力,我们可以使用空间换时间的方式,将请求 path 拆分后,以特殊的数据结构存储

存储

我们注册如图4个路由:

首先,所有路由按照请求 method 分成对应的 method 树

然后将请求根据 `/` 拆封后,组装成树形结构

**为了提升匹配性能,存储节点的时候会保存节点类型,然后根据类型进行匹配**

搜索

我们拿到请求路径之后,同样根据`/`拆分,

首先根据 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 |

更多

项目地址

题外话

目前很多 node 应用都是中间层,一丢丢的路由寻址优化其实可以忽略

相关文章

  • Dazejs高性能路由设计-前缀树路由

    介绍 首先介绍一下什么是路由,**路由就是根据请求信息将请求定位到具体的实现逻辑的过程** 这个过程我们称之为 *...

  • gin源码阅读之四 -- gin的路由算法

    gin的是路由算法其实就是一个Trie树(也就是前缀树). 有关数据结构的可以自己去网上找相关资料查看. 注册路由...

  • go-gin框架初探

    gin框架初探 参数req的获取、修改、封装 路由定义(底层结构:前缀树) 全局中间件、路由中间件 run的几种方...

  • Vapor文档学习十七:ROUTING - Group

    将多个路由进行组合,可以令多个路由共用相同的前缀、middleware、hosts。路由组有两种不同的形式: Gr...

  • 【网络工程师路由篇】——华为静态路由基础

    一、浮动静态路由功能介绍: 当网络中存在多条相同路由前缀时,会优先选取AD值(路由可信度,值越小,路由越优先)小的...

  • 3.路由

    1,路由前缀router.prefix('/users') 这样就可以方便的模块化的管理路由了 2,路由请求及返回格式

  • Angular笔记7(知识点)

    pathMatch :路由重定向prefix:前缀匹配full:全部匹配

  • vapor学习教程-Group

    Route Groups 将路由分组可以轻松地将多个路由添加公用的前缀,中间件或主机。路由组有两种不同的形式:组和...

  • Zuul基本路由配置(二)

    接着前一篇的文章Zuul基本路由配置(二) 1.功能前缀配置路由规则的时候,我们可以配置一个统一的代理前缀。 访问...

  • 手撸博客3 文章列表及文章

    1 设计思路 1.1 路由设计 /article路由到文章列表页面/article/aid路由到具体的文章页面 1...

网友评论

      本文标题:Dazejs高性能路由设计-前缀树路由

      本文链接:https://www.haomeiwen.com/subject/dgqcjhtx.html