首页 / 文章

Node与Bun与Deno:多路由测试胜过单一RPS指标对比

Node.js、Bun与Deno的多方案性能对比:原始吞吐量确实存在差异,但开发人员的熟悉程度、权限设置、内存使用以及受数据库限制的路由才是决定架构的关键因素。

发布者:REACTAPP.TOP阅读约 7 分钟1713 词

来源: I Rebuilt the Same API on Node.js, Bun, and Deno. The Surprising Difference Wasn’t Throughput

真正重要的基准测试包含多种测试路径

仅通过HTTP RPS图表就判定胜负未免草率:Bun遥遥领先,Deno紧随其后,Node则落后。架构决策不能仅依赖单一的合成测试路径。

export async function handle(request: Request): Promise<Response> {
  const url = new URL(request.url);

  if (url.pathname === "/health") {
    return Response.json({ status: "ok" });
  }

  if (url.pathname.startsWith("/v1/accounts/")) {
    const account = await accounts.find(url.pathname.split("/").pop()!);

    if (!account) {
      return Response.json({ error: "not_found" }, { status: 404 });
    }

    return Response.json(account);
  }

  return Response.json({ error: "not_found" }, { status: 404 });
}
// Bun
Bun.serve({ fetch: handle, port: 3000 });

// Deno
Deno.serve({ port: 3000 }, handle);
deno serve \
  --allow-net=0.0.0.0:3000,postgres.internal,redis.internal \
  --allow-env=DATABASE_URL,REDIS_URL,OTEL_EXPORTER_OTLP_ENDPOINT \
  --allow-read=./config \
  main.ts

原始吞吐量虽真实,却无法决定架构选择

在成本曲线接近临界点时,吞吐量才真正重要。大多数业务API早在达到运行时的RPS上限之前,就已受到数据库、身份验证及下游I/O的限制。

Node是最无趣的运行时环境,但这反而是种褒奖

Node强大的生态系统、易于操作的特性以及可预测的部署流程,仍使其成为默认选择。当需要值班的人员数量有限时,乏味反倒成了一种优势。

Bun在能充分发挥自身优势时速度最快

Bun 拥有自身的 API 和工具集,优势显著。强行追求 Node 兼容性会削弱这一优势,应诚实地评估 Bun 原生方案的优势。

Deno 将权限管理与遥测功能纳入应用设计

Deno 的权限模型和标准库将安全性与可观测性直接融入运行时层面,而不仅仅是作为中间件的附加功能。

内存使用是决定胜负的关键

在真实负载下的内存分配、垃圾回收及 RSS 使用情况比峰值 RPS 更为重要。在容器环境中,内存管理不善会直接导致成本上升。

运营简易性取决于现有基础设施

如果组织已经在 Kubernetes 上运行 Node 并拥有成熟的监控面板,更换运行时会给所有人带来额外负担。而对于全新项目或侧重边缘计算的场景,Bun/Deno 应通过多路径基准测试进行对比:包括 JSON API、多部分上传、WebSocket 以及数据库相关处理功能。

总结

在不同的运行时环境下重新构建相同的 API,以此了解各种权衡——而非仅通过一次 HTTP 流量测试就判定某个方案永远最优。应选择符合运营需求、权限设置以及实际瓶颈的运行时环境。

将基准测试工具及文章中的结论一同发布。无法复现的 RPS 截图不应成为制定平台策略的依据。

在函数/边缘计算的评估指标中,除了稳态 RPS 外,还需考虑冷启动时间和 CLI 使用体验。

需关注兼容性方面的限制:原生插件、node: imports 以及依赖 Node 全局变量的测试库。

对于每种运行时环境,都要详细记录实际部署时的生产流程模型(集群、监控工具、隔离机制等)。

需计算相关工作的工程师工作日成本;即便 RPS 提高了 4 倍,但如果需要重写认证机制和持续集成流程,那也并非真正的免费性能提升。

如果真的要在多个环境部署应用,建议每晚为每个运行时保留一个兼容性测试版本,用于执行排名前二十的路由。

将基准测试工具及相应结论一同发布。无法复现的每秒请求数截图不应成为制定平台策略的依据。

在功能/边缘节点的评估指标中,除了稳态下的每秒请求数外,还应包括冷启动时间和命令行接口的响应速度。

需关注那些可能影响兼容性的因素:原生插件、node: imports 以及依赖 Node 全局变量的测试库。

对于每个运行时,都要详细记录实际会使用的生产环境架构模型(集群、监控工具、隔离机制等)。

需计算相关工作的工程师工作量;即便每秒请求数提升了4倍,但如果需要重写认证系统和持续集成流程,那也并非真正的免费性能提升。

如果真的要在多个环境部署应用,建议每晚为每个运行时保留一个兼容性测试版本,用于执行排名前二十的路由。

将基准测试工具与文章的结论一同发布。无法复现的 RPS 截图不应成为制定平台策略的依据。

在功能/边缘节点的评分体系中,除了稳态 RPS 外,还应纳入冷启动时间和 CLI 开发效率指标。

需关注兼容性方面的问题:原生插件、node: imports 以及依赖 Node 全局变量的测试库。

对于每种运行时环境,都要记录实际会使用的生产流程模型(集群、监控工具、隔离机制)。

需计算相关工作的工程师工作日成本;即便 RPS 提高了 4 倍,但如果需要重写认证系统和持续集成流程,那也并非真正的免费性能提升。

如果真的要在多个环境部署应用,建议每晚在每个运行时环境中运行排名前二十的路由,以此作为兼容性检测。

将基准测试工具与文章的结论一同发布。无法复现的 RPS 截图不应成为制定平台策略的依据。

在函数/边缘计算的评分体系中,应纳入冷启动时间和 CLI 操作效率指标,而不仅仅是稳态下的 RPS 值。

需跟踪各种兼容性问题:原生插件、节点导入依赖,以及那些依赖 Node 全局变量的测试库。

对于每种运行时环境,都要详细记录实际部署时的生产流程模型(集群架构、监控工具、隔离机制等)。

需以工程师工作日来评估优化成本;即便 RPS 提高了4倍,但如果需要重写认证系统和持续集成流程,那也并非真正的免费性能提升。

如果真的要在多个环境部署应用,应每晚在每个运行时环境中运行排名前二十的路由,以此作为兼容性测试样本。

应将基准测试工具及文章中的分析结论一同发布;无法复现的 RPS 测试截图不应成为制定平台策略的依据。

在函数/边缘计算的评分体系中,应纳入冷启动时间和 CLI 操作效率指标,而不仅仅是稳态下的 RPS 值。

跟踪兼容性限制因素:原生插件、node模块的导入依赖,以及假定使用Node全局变量的测试库。

针对每种运行时环境,需记录实际部署的生产流程模型(集群、监督进程、隔离机制)。

需以工程师工作日来评估优化成本;即便RPS提升4倍,但若需要重写认证机制和持续集成流程,那也并非真正的免费性能提升。

如果真的要在多个平台部署应用,应每晚在每个运行时环境中运行排名前二十的路由,作为兼容性测试用例。

需将基准测试工具及文章中的分析结论一同发布;无法复现的RPS测试截图不应成为制定平台策略的依据。

在函数/边缘计算的评估指标中,除了稳态RPS外,还需考虑冷启动时间和命令行使用体验。

跟踪兼容性限制因素:原生插件、node模块的导入依赖,以及假定使用Node全局变量的测试库。

对于每种运行时环境,都需要记录实际会部署的生产流程模型(集群、监控进程、隔离机制)。

需以工程师工作日来评估成本;即便RPS提升了4倍,但如果需要重写认证机制和持续集成流程,那也并非真正的免费性能提升。

如果真的要在多个环境部署应用,建议每晚为每种运行时环境运行排名前二十的路由,以此作为兼容性测试。

应将基准测试工具及文章中的分析结论一同发布;无法复现的RPS截图不应成为制定平台策略的依据。

在功能/边缘计算的评分体系中,除了稳态RPS外,还需考虑冷启动时间和命令行开发体验。

需关注那些可能影响兼容性的因素:原生插件、node: imports语句,以及依赖Node全局变量的测试库。

对于每种运行时环境,都需要记录实际会部署的生产流程模型(集群、监控进程、隔离机制)。

将竞赛成本换算成工程师工作日;即便能提升4倍的RPS,但若需要重写认证和CI系统,这种性能提升并非真正免费。

如果真的要支持多环境部署,建议每晚运行兼容性测试用例,覆盖排名前二十的路由。

应将基准测试工具及文章中的分析结论一同发布。无法复现的RPS截图不应成为制定平台策略的依据。

在功能/边缘服务的评估体系中,除了稳态RPS外,还需考虑冷启动时间和CLI开发效率。

要关注那些可能影响兼容性的因素:原生插件、node: imports语句,以及依赖Node全局变量的测试库。

对于每种运行环境,都需要详细记录实际会采用的部署流程模型(集群、监控工具、隔离机制)。

将竞赛成本换算成工程师工作日;即便能提升4倍的RPS,但若需要重写认证和CI系统,这种性能提升并非真正免费。

如果真的采用多环境部署,建议每晚在每个运行时环境中执行前二十条路由的兼容性测试。

将基准测试工具及文章中的结论一同发布。无法复现的每秒请求数截图不应影响平台策略的制定。

在函数/边缘计算的评分体系中,除了稳态下的每秒请求数外,还应考虑冷启动时间和命令行接口的响应速度。

多路由基准测试应包含带身份验证的JSON POST请求、文件上传限制以及复杂的ORM操作路径——这些是运行时在完成简单GET请求后会出现差异的场景。

团队技能水平也很重要:即便使用Bun取得了优势,但如果一半员工不熟悉测试工具,那也相当于延迟出现了故障。

需关注TLS和HTTP/2协议栈的表现;仅基于普通HTTP进行的微基准测试无法反映网络层带来的性能损耗。

容器镜像大小和CVE扫描结果会因不同运行时使用的基础镜像而有所差异,运维人员会在评估时将这些因素与每秒请求数一起考虑。

通过 OpenAPI 进行的契约测试能够在处理程序在不同端口间切换时确保公平性。

应记录高并发场景下的 p99 延迟,而不仅仅是中位数 RPS;调度器会掩盖不同的尾部行为特征。

如果采用 Deno 权限模型,需将每项权限授予记录为架构决策文档,以避免后续服务在后台悄悄扩大沙箱范围。

Bun 的 npm 兼容层应当明确列出那些在生产环境中不允许运行的包的允许/拒绝列表。

Node 依然是兼容性基准:应在实际请求路径上以 Node 为参照来衡量其他框架的差异。

需每季度重新评估这些决策;虽然运行时指标会变化,但瓶颈问题同样会随之改变。

多路径基准测试应包括带身份验证的 JSON POST 请求、文件上传限制,以及需要频繁交互的 ORM 路径——这些都是在简单的 GET 请求之后运行时表现出现差异的场景。

团队技能图表很重要:如果使用Bun导致一半员工无法操作陌生的测试工具,那其实属于延迟性故障。

需关注TLS和HTTP/2协议栈;仅通过普通HTTP进行的微基准测试无法体现网络层中的终止开销。

容器镜像大小与CVE扫描结果会因底层运行时镜像的不同而有所差异,运维人员会在考虑RPS的同时也评估这些因素。

针对OpenAPI的契约测试能够在处理程序在不同端口间切换时确保测试结果的准确性。

应记录高负载下的p99延迟值,而不仅仅是中位数RPS;调度器会掩盖不同的尾部行为特征。

如果采用Deno权限模型,需将每项权限授予记录为架构决策文档,以避免后续服务在不知情的情况下扩大沙箱范围。

Bun的npm兼容层应当明确列出那些在生产环境中不允许运行的包,形成允许/禁止列表。

Node 仍是兼容性基准:在实际路由中,以 Node 为标准来衡量其他技术的差异。

每季度重新评估这一决策;虽然运行时指标会变化,但瓶颈问题同样如此。

多路由基准测试应包括带身份验证的 JSON POST 请求、文件上传限制,以及涉及 ORM 操作的路径——这些是在简单的 GET 请求之后运行时表现出现差异的地方。

团队技能水平也很重要:如果使用 Bun 获得了优势,但却导致一半员工无法熟练使用测试工具,那其实只是延迟了故障发生的时间而已。

需关注 TLS 和 HTTP/2 技术栈;仅基于普通 HTTP 的微基准测试无法体现网络层带来的额外开销。

容器镜像大小和 CVE 扫描结果会因所使用的运行时基础镜像而有所不同,运维人员会在考虑 RPS 的同时权衡这些因素。

通过针对 OpenAPI 的契约测试,即便处理程序在不同端口之间切换,也能确保测试结果的公正性。

应记录竞争条件下的 p99 延迟,而不仅仅是中位数 RPS;调度器会掩盖不同的尾部行为。

如果采用 Deno 权限模型,需将每项权限授予记录为架构决策记录,以避免后续服务在后台扩大沙箱范围。

Bun 的 npm 兼容层应当明确列出那些在生产环境中不允许运行的包的允许/拒绝列表。

Node 依然是兼容性基准:应在实际请求路径上将其他引擎的性能作为相对于 Node 的差异值来衡量。