为什么我们从 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 或许是一个值得考虑的选项,尤其是在你对高并发和扩展性有较高要求的情况下。

相关推荐
AI3D_WebEngineer几秒前
企业级业务平台项目设计、架构、业务全解之平台篇
前端·javascript·vue
ziwu1 分钟前
【动物识别系统】Python+TensorFlow+Django+人工智能+深度学习+卷积神经网络算法
后端·深度学习·图像识别
该用户已不存在3 分钟前
免费 SSL 证书缩短至 90 天,你的运维成本还能hold住吗
前端·后端·https
00后程序员3 分钟前
怎么在 iOS 上架 App,从构建端到审核端的全流程协作解析
后端
Z***G4795 分钟前
SpringBoot线程池的使用
java·spring boot·后端
L***d6705 分钟前
Spring Boot 整合 Keycloak
java·spring boot·后端
n***271910 分钟前
工作中常用springboot启动后执行的方法
java·spring boot·后端
程序员西西18 分钟前
Redis看门狗底层原理深度解析:Redisson续期机制源码与实战指南
java·后端
七月十二18 分钟前
【Vite】离线打包@iconify/vue的图标
前端·vue.js
米花丶20 分钟前
解决前端监控上报 Script Error实践
前端·javascript