文章摘要
文章讲述了作者团队在项目上线一周后就将后端从Python迁移到Node.js的决定。尽管这违背了初创公司"先推出产品再考虑扩展"的常规建议,但团队认为Python的异步处理能力不足,而Node.js能更好地满足他们的扩展需求。虽然当前用户量不大,但团队选择在代码库还小时进行重构,为未来增长做准备。
文章总结
标题:从Python迁移到Node.js的背后原因
文章核心内容:
- 迁移背景
- 创业公司Skald在发布一周后就决定将后端从Python(Django)完全重写为Node.js
- 这一决定违背了初创企业"先发布再扩展"的常规建议
- 主要动机是为了更好地处理异步I/O操作
- Python异步编程的痛点
- Django对异步支持不完善,ORM尚未完全支持异步
- Python异步编程模型存在先天不足(后期添加而非原生支持)
- 需要频繁使用synctoasync和asynctosync转换
- 文件I/O缺乏原生异步支持
- 异步实现依赖各种非标准库(如aiofiles、Gevent)
- 替代方案评估
- 考虑过FastAPI+SQLAlchemy方案
- 最终选择Node.js(Express+MikroORM)的原因:
- 已有部分服务使用Node.js编写
- JavaScript事件循环模型的天然优势
- 统一技术栈的便利性
- 迁移收益与代价 收益:
- 性能提升约3倍
- 统一了前后端代码库
- 改善了测试覆盖率
- 获得了更符合需求的ORM(MikroORM)
代价: - 失去Django的便利性 - 需要自行实现更多中间件 - 脱离Python生态(特别是AI/ML领域)
- 迁移过程
- 耗时3天完成
- 前期主要手动重写以确保理解新架构
- 后期使用AI辅助生成非核心代码
- 过程中多次产生放弃念头
- 后续思考
- 团队对迁移决定感到满意
- 承认对Python异步编程经验不足
- 开源项目欢迎社区反馈
注:删减了部分技术细节和GitHub链接相关内容,保留了核心决策逻辑和关键对比信息。
评论总结
评论总结
1. 关于技术选型的争议
支持使用熟悉工具:多位评论者认为初创公司应优先使用熟悉的工具,而非追求"最佳"技术。
- "The best advice for a start-up is to use the tools that you know best." (评论10)
- "Django is massive and ton of baggage... sounds like standard case going with what developers know." (评论5)
反对Django的选择:认为Django不适合REST API开发,FastAPI或Node.js更合适。
- "Clearly, since they actually used Django instead of FastAPI, which should have been the right tool." (评论10)
- "I would not use Django for this... FastAPI/SQLAlchemy over Express." (评论16)
2. 对Python异步的批评
Python异步的缺陷:认为Python的异步实现复杂且不成熟。
- "Python's typing and async support feels like someone adding extension to a house." (评论24)
- "I hate writing code in golang... but with golang, goroutines... I could have had the same thing written in twenty minutes." (评论26)
Django异步的负面评价:认为Django的异步支持是资源浪费。
- "Async and Django don't mix well... I see the whole Django Async as wasted resources." (评论18)
3. 对Node.js和其他替代方案的推荐
支持Node.js:认为Node.js在性能和开发体验上更优。
- "node+typescript projects... have been pretty great the last 10+ years." (评论17)
- "nodejs excels for me on flow control... theres rxjs if you need observables." (评论21)
推荐其他技术:如Elixir、Hono等,认为它们在异步处理上更优。
- "do yourself a favor and write a spike in Elixir... built for async from the ground up." (评论25)
- "I would have picked Hono and Drizzle... Hono is much faster than Express." (评论11)
4. 对文章和决策的质疑
质疑文章价值:认为文章内容过时或无实际意义。
- "This feels like an article from 2013." (评论3)
- "Who is the audience for a post like this?" (评论14)
质疑决策合理性:认为过早优化或技术切换没有必要。
- "if PostHog was able to do what they're doing on the stack you're abandoning, do you think that stack is actually going to limit your scalability?" (评论30)
- "Looks like last week was coding week, current one is marketing week." (评论4)
5. 对ORM的争议
反对ORM:认为ORM在现代开发中不再必要。
- "Do we still need ORMs in the age of AI-assisted coding?" (评论19)
- "Should've ditched the ORM too." (评论9)
支持ORM:认为ORM在特定场景下仍有价值。
- "I would still pick FastAPI/SQLAlchemy over Express." (评论16)
关键引用保留
支持熟悉工具:
- "The best advice for a start-up is to use the tools that you know best." (评论10)
- "Django is massive and ton of baggage... sounds like standard case going with what developers know." (评论5)
Python异步批评:
- "Python's typing and async support feels like someone adding extension to a house." (评论24)
- "I hate writing code in golang... but with golang, goroutines... I could have had the same thing written in twenty minutes." (评论26)
Node.js推荐:
- "node+typescript projects... have been pretty great the last 10+ years." (评论17)
- "nodejs excels for me on flow control... theres rxjs if you need observables." (评论21)
Elixir推荐:
- "do yourself a favor and write a spike in Elixir... built for async from the ground up." (评论25)
- "Elixir has almost the same top libraries from Python... far less fragile and more reliable." (评论27)