我的 Node.js 有点生锈了。

  • 博客文章曾在“草稿”模式停留许久,最终决定发布,可能存在一些不妥之处但生活就是如此,渴望听取他人想法。
  • 2020 年 Wix 团队推出 CDN Stats 平台,可展示和汇总 Wix CDN 的数据统计。同年进行了将单个模块重写为使用 Rust 的原生 Node.js 插件的实验,性能提升 25 倍。
  • CDN Stats 平台为 Wix 前端开发者提供实时数据,帮助识别需优化的捆绑包及优化紧迫性,曾因人工错误导致主要 JavaScript 资产膨胀至 33MB。
  • 要填充数据表格需筛选存储在 Amazon S3 中的 TSV 文件(每天约 290k 个文件,达 200GB),每天下载前一天的 TSV 文件并解析存储到数据库,通过将日志文件入队到作业队列实现并行处理,每天用约 3 小时用 25 个实例解析。每几小时生成上周的聚合,约 1 小时在数据库中用 MongoDB 聚合完成,MongoDB 查询较复杂。
  • 曾考虑用 AWS Athena 解决但当时不可行,之前尝试用内部 Wix Serverless 框架处理日志文件并发时遇到内存问题,迁移到 Wix Node.js 平台也有内存问题且处理速度慢,最终采用作业队列模式,将服务器扩展到 25 个容器后处理时间更合理,但仍思考运行 25 个实例是否合理。
  • 分析 JavaScript 在处理大量 TSV 文件时的内存问题,如 line.split('\t')会创建新数组和字符串导致内存占用,而 Rust 内存管理是其优势,可嵌入其他语言和虚拟机。
  • 在 Rust 中通过定义 RecordEnhancedRow 结构体来优化内存使用,实现从借用字符串安全地解析为记录,创建 ResourceCounter 进行聚合,仅在必要时克隆数据。
  • 编写 Node.js 基准测试工具进行测试,结果显示 Rust 解析器在运行时间和内存使用上优于 JavaScript 解析器,在 Wix 部署预览模型中用 Rust 实现的处理速度更快,资源使用更少,说明选择合适工具很重要,可先分析优化再考虑用 Rust 重写。最后引用 Zach Holman 或 Tom Preston-Werner 的话强调根据需求选择工具。
阅读 7
0 条评论