Backend: Python¶
Books¶
-
Architecture Patterns with Python
实用的开发模式
介绍了 DDD, Repository Pattern, Unit of Work, Dependency injection 等常见且实用的设计模式。
-
Python Concurrency with asyncio 🌟🌟🌟🌟
Python 异步编程
-
介绍了 Python 异步编程的基础知识,以及如何使用 asyncio 来构建异步应用。对于理解 FastAPI 的异步编程模型有很大帮助。
-
本书前 3 章节介绍了 Python 的异步编程基础,后面的章节介绍了如何使用 asyncio 来构建异步应用,以及如何使用 asyncio 来处理并发问题。 个人感觉前 3 章对了解 asyncio 的原理帮助比较大:从 scoket 讲起,之后手动实现 blocking 和 non-blocking 的 socket, 最后基于 non-blocking 的 socket 实现了一个简单的 web server。这里相当于手动实现了一个简单的 asyncio,清晰地展示了其主要的工作原理。
-
后面在第 9 章讲解了 WSGI (web server gateway interface) 和 ASGI (asynchronous server gateway interface) 的一些基本原理, 这部分背景知识也值得学习一下 (可惜的是这部分讲解比较少也比较浅显)。
-
书中对很多高阶的异步编程模式也有介绍,比如异步队列,加锁同步等,在遇到复杂异步场景时也可以作为很好的参考资料。
- 总的来说还是比较值得一读。
-
Frameworks¶
FastAPI 🌟🌟🌟🌟🌟¶
很新也很好,对 ORM,异步等的支持也更好,接口文档等也可以原生地生成,感觉后续会逐渐取代 Flask。
FastAPI Practice
更多关于FastAPI的实践见[FastAPI Practice]
Flask 🌟🌟🌟🌟¶
轻量简便,应用较多的后端框架,比较适合简单的服务的构建。 但是对 ORM,接口文档管理等目前比较通用的需求无内部集成,需要结合很多第三方库来实现。
Django 🌟🌟🌟¶
更加完善的后端框架,更“重”一些,更适合大型项目的开发。
ORM(Object-relational mapping)¶
SQLAlchemy 🌟🌟🌟🌟🌟¶
较为流行,用的比较多的 ORM 框架,支持的数据库种类也比较多。
SQLModel 🌟🌟🌟🌟¶
很新的框架,基于 SQLAlchemy 和 Pydantic 构建,更加 Modern。 但是目前看距离 1.0 版本还要一段时间,文档也在完善中,所以可能还不太适合生产环境。
ODM(Object-document mapping)¶
ODMantic 🌟🌟🌟🌟¶
Sync and Async ODM (Object Document Mapper) for MongoDB based on python type hints
FastAPI ODMantic
FastAPI的NOSQL文档 提到说后续的Tutorail会采用ODMantic。ODMantic也给出了FastAPI中使用的示例, 所以如果是新的FastAPI项目,可以考虑使用ODMantic。
Beanie 🌟🌟🌟🌟¶
Asynchronous Python ODM for MongoDB. 当前业务中用的最多的 MongoDB ODM,支持异步,支持 Pydantic。 整体用下来也没有遇到太大的坑,还是比较推荐使用的。
大量数据 Validation 的性能问题
因为底层是用的Pydantic做数据校验, 所以Beanie在大量数据的Validation上可能会有一些性能问题
Bunnet¶
Synchronous Python ODM for MongoDB.(Beanie 的同步版本)
Database Migration¶
Alembic 🌟🌟🌟🌟🌟¶
Alembic 是使用非常广泛的数据库迁移工具,功能完善,且和 SQLAlchemy 集成得很好。
Alembic 的使用场景
随着业务的发展,数据库的表结构和数据的变更是不可避免的, 而数据库迁移工具就是用来管理这些变更的。 一般来说,数据库迁移工具会记录下数据库的变更历史, 并且可以根据这些历史记录来生成数据库迁移脚本, 以便在不同的环境中执行这些脚本来同步数据库的变更。
使用数据库迁移工具可以让数据库的变更更加可控,更加透明(以代码的方式记录变更历史)。
Observability¶
目前接触到的有 Skywalking 和 Sentry1.
Sentry 🌟🌟🌟🌟🌟¶
总体用下来 Sentry 要好用的多,支持足够好,使用足够简单,也可以同时满足问题排查和性能监控的需求。 Sentry 相对优于 Skywalking 的地方很多,比如在性能监控方面,Sentry 采集到的 Span 数据更加准确且精细, 可以很方便地基于性能监控数据来针对性地降低服务延时,而 Skywalking 的性能监控数据则相对粗糙,且采集的数据和实际有一定偏差。 另外在问题排查方面,Sentry 的事件分析功能也更加强大,可以很方便地定位问题,而 Skywalking 的事件分析功能也相对简单。
Skywalking 🌟🌟🌟¶
Skywalking 可以接 ElasticSearch 来收集日志,这对于日志的检索/分析来说是一个很好的选择, 相对来水 Sentry 对全局的日志检索/分析的支持得不够好。
Doc, Test, Lint & Format¶
MPPT: A Modern Python Package Template
MPPT是一个现代Python库模版,收集了目前社区应用最广泛的工具,这里只是列举一部分。 在MPPT文档中,还有更多的工具和实践,可以参考。
Domain | Tools |
---|---|
Documentation | Mkdocs(with Material theme) |
Testing | Pytest(unit), Hypothesis(property), Locust(stress) |
Linting & Formatting | black, flake8, isort, ruff, mypy |
Tools¶
Retry¶
Tenacity 🌟🌟🌟🌟🌟¶
tenacity是普遍使用的重试库,整体功能已经比较完善,可以满足大部分的重试场景。
stamina 🌟🌟🌟🌟¶
stamina: Production-grade retries for Python. 是对 tenacity 的封装,目的是提供更加好用的 API,更加方便的使用。