What We Learned Building a Rust Runtime for TypeScript
7 days ago
- #Backend Development
- #Rust
- #TypeScript
- Encore的TypeScript支持涉及在Rust中创建新运行时,而非扩展Go运行时或直接使用TypeScript,以避免为每种新语言重新实现基础设施,并克服Node.js单线程的限制。
- Rust运行时处理所有基础设施问题,如HTTP生命周期、数据库连接、发布/订阅和追踪,仅将业务逻辑留给TypeScript,通过利用多线程提升性能。
- 使用Go作为Node.js侧车的原型因IPC开销导致高延迟和管理多进程的操作复杂性而被弃用。
- 运行时通过Rust NAPI绑定集成到Node.js进程中,允许直接交互并避免序列化,同时增强了处理JavaScript承诺和取消保护的功能。
- 应用元数据(编译时生成)和运行时配置(部署时生成)分离,使得同一应用可在不同环境中运行而无需代码更改。
- 使用Pingora的嵌入式网关在同一进程中处理路由、身份验证等,允许用户定义的TypeScript身份验证处理程序直接执行而无需IPC。
- 发布/订阅和对象存储系统通过特征对象抽象化云提供商的差异,支持NSQ、GCP和AWS并提供一致接口。
- 采用具有高效序列化和时间锚定的自定义二进制追踪协议,提供详细、抽样的追踪而无额外开销,但计划提供OpenTelemetry适配器。
- 基于SWC构建的TypeScript解析器从代码中提取基础设施声明以生成元数据,支持架构图和API文档等功能。
- 关键经验包括投资结构化错误类型、优先支持OpenTelemetry、使用更多快照测试,以及探索Go和Rust的统一运行时。
- 基准测试显示Encore.ts在吞吐量和延迟方面优于Express.js等框架,尤其在启用验证时表现显著。