为什么现在越来越多项目选择混合开发?从 WebAssembly 在无服务器中的表现说起

引言:混合开发的"老方法"仍然有效

"混合式的方法出奇地有效。"

这句话虽然简单,但在计算机发展的几十年中反复被验证。从早期用汇编语言加速 BASIC 写的游戏,到 C 语言中保留内联汇编优化关键路径,再到现代微服务架构中以 Go 写数据层、以 JS 写交互逻辑------"让合适的语言处理合适的任务"一直是工程理性的体现。

这种思维在前端开发中同样适用。我曾在一篇文章《Tried Replacing JavaScript with Rust + WASM for Front-End Development》中,尝试用 Rust 和 WebAssembly 完全替代 JavaScript。虽然性能的确提升了,但开发效率却断崖式下滑,生态支持和调试体验都严重影响了可维护性。最后得出的结论是:用 JavaScript 管理 UI 和逻辑,用 WebAssembly 加速关键计算任务,反而更高效更靠谱。

这种"混合式"的思维方式,不仅是工程实践的产物,也正在被学术研究重新验证。最近我读到的一篇关于 WebAssembly 的论文,就为这种策略提供了实验支持。


一、论文概览:Serverless 与 Wasm 的真实表现

这篇论文来自 SSDBM 2024,标题是《WebAssembly Serverless Join: A Study of its Application》。它探讨了一个颇具现实意义的主题:如何在 Serverless 环境中高效运行数据库 Join 操作?

Join 是数据库中最常见、也最复杂的操作之一。它对资源管理、状态保持、算子调度提出了很高的要求。而 Serverless 虽然具备弹性伸缩、自动调度等优势,但也有冷启动慢、无状态计算、共享数据困难等天然限制。

论文作者设计了一个名为 Blossom 的执行框架,将核心 Join 算法用 Rust 编写,并编译为 WebAssembly 模块,部署在多种执行环境中,包括:

  • 原生容器(Docker):提供接近裸金属的性能;
  • Serverful WebAssembly(例如 WASI 容器);
  • 真正的 Serverless 平台(如 Cloudflare Workers)。

通过在不同环境下执行三种主流 Join 算法(Nested Loop、Hash Join、Sort-Merge),论文提供了一组翔实的对比数据。


二、实验数据解读:性能不是唯一指标

性能对比中,Wasm 相比原生环境确实存在一定差距:

  • Nested Loop Join:慢了约 100%;
  • Hash Join:约慢 25%;
  • Sort-Merge Join:慢 47%。

这些数字看似不理想,但论文真正有价值的部分,是它对这些差异的归因分析:

论文中提到,Join 操作 90% 以上的运行时间都集中在算子本体,冷启动时间和模块通信几乎可以忽略不计(<1%)。这意味着,只需将关键路径做深度优化,外围逻辑是否在 Wasm 或其他环境中并不影响整体性能瓶颈。

这正是混合开发思维的核心逻辑:用最强的工具处理最慢的部分,其它部分选用最合适、最易维护、最可扩展的实现方式。

此外,Wasm 的部署优势也在实验中凸显:

  • 模块可移植性强,不依赖底层操作系统;
  • 启动快,适合 Serverless 短生命周期模型;
  • 天然沙盒化,提供更强的边界安全性。

简而言之,Wasm 并不一定要"胜过原生",它只需"足够好"地完成非关键任务,就足以胜任混合架构中的角色。


三、混合架构的现实落地:开发者视角下的价值

回到现实开发,我们并不是每天都在实现数据库 Join。但我们每天都在处理类似的架构挑战:性能瓶颈在哪里?哪些代码可以共享?部署如何快速测试?哪里可以先上线试错?

这些问题正是混合式架构的生存土壤。

我自己也在前端开发中遇到过类似问题。当我尝试用 Rust + Wasm 完全替代 JS 构建 UI 时,虽然理论上可行,但实际效率低下,调试极其困难。最有效的策略仍是混合结构:主流程使用 JS 管理交互,性能瓶颈(如图像处理、排序)交给 Rust 编译成 Wasm 模块。

这种结构也对实验工具提出了新要求------我们需要更快速、低成本地测试不同模块组合与性能影响。这正是像 ServBay 这样的轻量级本地 serverless 工具能发挥作用的地方。

我过去通常依赖浏览器和 CLI 工具来测试 Wasm 模块的性能。虽然可行,但配置繁琐、模拟请求不方便,也很难在本地复现后端接口联动场景。

而使用 ServBay 后,事情变得简单许多:

ServBay 支持直接在本地运行 Wasm 模块,并能绑定 HTTP 接口模拟服务调用,极大提升了混合架构的测试效率。不需要 Docker,不依赖云函数,启动快、改动立刻可见,非常适合边开发边验证逻辑正确性与性能瓶颈。

比如,我可以只用一个配置文件就部署一个 Rust 编译的图像处理模块,同时与 JavaScript 前端本地联调。甚至能模拟多种资源配置(低内存、高并发等)验证系统弹性。

这类"本地 serverless 实验工具"让我能在架构落地前就发现问题,选出最优组合,也更容易做团队内部知识传递。

css 复制代码
# 快速本地运行 Wasm 模块
servbay run --wasm ./build/resize.wasm --port 8080

或使用配置更丰富的 YAML 方式:

bash 复制代码
services:
  img_resize:
    type: wasm
    source: ./target/wasm32-wasi/release/resize.wasm
    route: /api/resize

四、未来趋势:混合开发将成为默认路径

WebAssembly 正在经历快速演进:

  • Wasm64 标准化,将解除当前内存寻址限制;
  • 组件模型(Component Model) 开始普及,支持模块间语言互操作;
  • 线程与并发能力增强,使 Wasm 更适合复杂多任务场景。

而 Serverless 架构也在走向边缘计算、分布式运行、多运行时混合部署。这一切都指向一个趋势:

未来系统不会是单一技术栈,而是多语言、多环境、多工具并存的混合生态。

从论文 Blossom 的实验,到我的开发经验,再到工具链如 ServBay 的兴起,混合开发不是一时之计,而是一种顺应复杂性与效率需求的自然演化。


小结:混合不是过渡,而是成熟的常态

通过对 SSDBM 论文的分析,我们看到:

  • 性能瓶颈往往集中于局部;
  • WebAssembly 即使不"最快",在部署与隔离性方面具备实际优势;
  • 本地混合架构测试可以显著提升开发效率。

配合工具如 ServBay,本地测试、Wasm 实验、服务联调变得轻松可行。我们不必等到系统上线才能验证架构选择,而是在开发之初就能构建起敏捷、模块化、面向真实瓶颈的开发模型。


🔗 参考资料

相关推荐
转转技术团队31 分钟前
打造亿级流量开放平台的架构演进与工程实战
后端·微服务·架构
RustFS39 分钟前
用 mc 对 RustFS 对象存储进行操作
rust
景天科技苑1 小时前
【Rust多进程】征服CPU的艺术:Rust多进程实战指南
开发语言·后端·rust·rust多进程·rust进程·多进程编程
hello早上好1 小时前
Spring AOP MethodInvocation 工作原理
java·后端·架构
拳打南山敬老院1 小时前
从零构建一个插件系统(五)其他领域插件探讨
前端·javascript·架构
姜 萌@cnblogs1 小时前
Rust并发编程中的所有权挑战与解决方案:从实际项目看Clone策略的应用
ai·rust·tauri
cui_win4 小时前
Prometheus实战教程 01 - Prometheus 简介和架构
架构·prometheus
SoFlu软件机器人12 小时前
秒级构建消息驱动架构:描述事件流程,生成 Spring Cloud Stream+RabbitMQ 代码
分布式·架构·rabbitmq
之墨_13 小时前
【大语言模型入门】—— Transformer 如何工作:Transformer 架构的详细探索
语言模型·架构·transformer
集成显卡17 小时前
Rust 实战三 | HTTP 服务开发及 Web 框架推荐
开发语言·前端·http·rust·web