为什么我们从 Python 迁移到 Node.js

最近在使用 NestJs 和 NextJs 在做一个协同文档 DocFlow,如果感兴趣,欢迎 star,有任何疑问,欢迎加我微信进行咨询 yunmz777

我们做了一件大事:在上线仅一周后,我们决定将后端彻底从 Python 转移到 Node.js。这一决定的核心原因是 扩展性。

当时,我们的系统还很小,用户量也不大,所以这个决定看起来既冒险又大胆,但从长远来看,我们认为这有助于解决潜在的技术瓶颈。

问题的根源:Python 异步编程的复杂性

我是 Django 的忠实粉丝,它让我能够快速构建应用,并且提供了很多便利的工具。然而,随着我们项目的不断推进,我们发现,Python 在处理异步操作时存在很多问题,尤其是在需要大量并发请求的情况下。

在我们需要异步执行多个 I/O 操作时,Python 的异步编程变得极其混乱。虽然 Python 也有异步支持,但由于其异步模型是后来加入的,导致其稳定性和性能并不理想。相比之下,JavaScript 和 Go 的异步模型更加直观且高效。对于 Python 来说,要使异步编程正常工作,需要大量了解底层实现,并且会受到诸多限制。

Python 异步的挑战:

  • Python 没有原生异步文件 I/O 支持。
  • Django 对异步的支持并不完善,尤其是 ORM(对象关系映射)部分。
  • 为了实现异步功能,开发者必须使用如 async_to_syncsync_to_async 这样的工具,增加了代码复杂性。
  • 异步操作的性能依赖于运行环境,如 Gunicorn 的工作模式等,这使得在 Python 中写出高效的异步代码变得更加困难。

为什么选择 Node.js?

在面对 Python 异步编程的困境时,我们决定转向 Node.js。Node.js 本身就为异步操作提供了很好的支持,它的事件循环机制使得并发处理变得更加高效。

虽然我们曾考虑过使用 Python 中的 FastAPI,它的异步支持确实比 Django 强,但我们最终还是选择了 Node.js,因为它更符合我们对未来可扩展性的需求。Node.js 的事件循环机制和丰富的生态系统使得它非常适合我们的业务需求。

迁移的收益

  1. 性能提升 我们的测试显示,在迁移到 Node.js 后,吞吐量提高了约 3 倍。随着我们在 Node.js 中实现更多并发操作(如文档 chunking 和重新排序),我们预期性能还会继续提升。

  2. 开发效率 Node.js 的事件驱动模型让我们能够更好地处理高并发任务,而无需担心像 Python 那样的异步陷阱。我们能更快速地实现新功能,同时减少了因底层异步问题带来的阻碍。

  3. 统一代码库 迁移到 Node.js 后,我们将原本分开的后台 worker 和 Web 服务器整合到一个代码库中,减少了重复代码,提升了代码的可维护性和一致性。

  4. 更好的测试和重构 迁移过程中,我们写了大量新的测试,确保新系统按预期工作。这也促使我们对现有代码进行了重构,提升了代码质量。

迁移的挑战

  1. 失去 Django 的便利 Django 是一个成熟的框架,它提供了很多现成的功能,例如 ORM 和中间件。迁移到 Node.js 后,我们需要自己手动实现很多功能,虽然可以使用 Express 等框架,但与 Django 的自动化功能相比,仍有一些缺失。

  2. Python 生态的丧失 虽然我们已经转向了 Node.js,但在机器学习和人工智能工具(如 RAG 和 agent)方面,Python 仍然是最强的语言。我们目前可以接受这个改变,但不排除未来可能会重新使用 Python。

总结

这次迁移带来了显著的性能提升和开发效率的提升,同时我们也学到了很多。虽然过程中面临了很多挑战,但整体来看,我们对这次决定感到非常满意。

如果你也正在面临类似的选择,迁移到 Node.js 或许是一个值得考虑的选项,尤其是在你对高并发和扩展性有较高要求的情况下。

相关推荐
Victor3562 小时前
Redis(117)Redis的分布式锁如何使用?
后端
Victor3562 小时前
Redis(116)Redis的内存管理如何实现?
后端
excel2 小时前
📘 全面解析:JavaScript 时间格式化 API 实战指南
前端
咖啡の猫3 小时前
Vue基本路由
前端·vue.js·状态模式
青衫码上行3 小时前
【Java Web学习 | 第七篇】JavaScript(1) 基础知识1
java·开发语言·前端·javascript·学习
咖啡の猫3 小时前
Vue编程式路由导航
前端·javascript·vue.js
星释3 小时前
Rust 练习册 10:多线程基础与并发安全
开发语言·后端·rust
WX-bisheyuange7 小时前
基于Spring Boot的教师个人成果管理系统的设计与实现
java·spring boot·后端
chxii7 小时前
spring boot 获取HTTP 请求参数
spring boot·后端·http