预览
您有一个应用程序在本地计算机上运行, 现在你想分享它。 本章分享了许多关于如何将其迁移到生产环境的场景, 并保持其正确有效地运行。 因为有些细节可以详细, 在某些情况下,我会参考有用的外部文档 而不是把它们塞在这里。
部署
到目前为止,在本书的所有代码示例中, 我使用了 uvicorn 的单个实例 在本地主机上运行,端口 8000 。 为了处理大量流量,您需要多个服务器, 运行 在现代硬件提供的多个内核上。 您还需要这些服务器上的内容才能:
- 保持它们运行()
- 收集和馈送外部请求())
- 返回响应
- 提供 HTTPS“终止”
多个工作线程
你可能已经看到了另一个叫做的Python服务器。 这可以监督多个工人, 但它是一个WSGI服务器,而FastAPI是基于ASGI的。 幸运的是,有一个特殊的乌维角兽工人阶级 这可以通过Gunicorn管理。
示例 13-X 设置这些 uvicorn 工作线程 在本地主机上,端口 8000 (这改编自)。 引号保护外壳免受任何特殊解释。
将枪角兽与乌角兽工人一起使用
$ pip install "uvicorn[standard]" gunicorn
$ gunicorn main:app --workers 4 --worker-class \
uvicorn.workers.UvicornWorker --bind 0.0.0.0:8000
在执行您的出价时,您会看到许多行。 它将启动一个顶级的枪角兽过程, 与四个 uvicorn 工人子流程交谈, 本地主机上的所有共享端口 8000 ( 0.0.0.0 )。 如果需要其他内容,请更改主机、端口或工作器数量。 main:app 指的是 ,而 FastAPI 对象 使用变量名应用程序 . 枪角兽声称:
Gunicorn 应该只需要 4-12 个工作进程来每秒处理数百或数千个请求。
事实证明,狸藻本身可以 还激发了多个 uvicorn 工人:
将 uvicorn 与 uvicorn 工人一起使用
$ uvicorn main:app --host 0.0.0.0 --port 8000 --workers 4
但是这种方法不做流程管理, 因此,通常首选古尼角兽方法。 uvicorn还有其他流程管理器: 请参阅其。
这将处理前面提到的四个作业中的三个 部分 但不是 HTTPS 加密。
HTTPS
这 官方 FastAPI , 像所有官方的 FastAPI 文档一样, 信息量极大。 我建议阅读这篇文章, 接下来是 Sebastián 关于如何将 HTTPS 支持添加到 FastAPI 的 通过使用。 Traefix 位于您的 Web 服务器“之上”, 类似于 nginx 作为反向代理和负载均衡器, 但它包括HTTPS的魔力。
尽管过程中有许多步骤, 它仍然比以前简单得多。 特别 您曾经定期向证书颁发机构支付大笔费用 用于提供的数字证书 适用于您网站的 HTTPS。 幸运的是,这些权威在很大程度上被免费服务所取代。
Docker
当 Docker 突然出现时 (在dotCloud的Solomon Hykes的五中 在 PyCon 2013), 这是我们大多数人第一次听说 Linux 容器。 随着时间的推移,我们了解到Docker更快更轻。 比虚拟机。 而不是模拟完整的操作系统, 每个容器共享服务器的 Linux 内核, 并将进程和网络隔离到它们自己的命名空间中。 突然 通过使用免费的Docker软件,您可以托管多个 单台机器上的独立服务, 不用担心他们互相踩踏。
十年后,Docker得到了普遍的认可和支持。 如果要在某些云服务上托管 FastAPI 应用程序, 您通常需要先创建它的 。 包括有关如何构建的全面描述 FastAPI 应用程序的 Docker 化版本。 一个步骤是编写一个 : 包含一些 Docker 配置信息的文本文件, 比如要使用的应用程序代码和要运行的进程。 只是为了证明这不是火箭发射期间的脑部手术, 这是该页面中的 Dockerfile:
FROM python:3.9
WORKDIR /code
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt
COPY ./app /code/app
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "80"]
我建议阅读官方文档, 或谷歌搜索fastapi Docker将产生的。
云服务
网上有许多付费或免费托管的来源。 有关如何使用它们托管 FastAPI 的一些演练包括:
- 德塔
- 利诺德
- 希罗库
Kubernetes
Kubernetes 是从一些用于管理的 Google 内部代码发展而来的 内部系统变得越来越复杂。 系统管理员(当时称为)习惯于手动 配置负载均衡器、反向代理等工具, 雪茄盒,依此类推。 Kubernetes 旨在获取大部分知识并将其自动化: 不要告诉我这个问题,。 这包括保持服务运行等任务, 或者在流量激增时启动更多服务器。
关于如何部署 FastAPI 有很多描述 在 Kubernetes 上,包括这个。
性能
FastAPI的性能目前是所有Python Web框架中。 甚至可以与Golang等更快语言的框架相媲美。 但其中大部分是由于 ASGI,避免了异步等待 I/O 的过程。 Python本身是一种相对较慢的语言。 以下是一些 提高整体性能的提示和技巧。
异步
通常,Web服务器不需要非常快。 它花费大量时间获取HTTP网络请求 并返回结果(本书中的 Web 层)。 在这两者之间,Web 服务执行业务逻辑(服务层) 并访问数据源(数据层), 并再次将大量时间花在网络 I/O 上。
每当 Web 服务中的代码必须等待响应时, 使用异步函数是一个很好的候选者 ( 异步 def 而不是 def )。 这让 FastAPI 和 Starlette 可以调度异步函数 并在等待它得到响应的同时做其他事情。 这就是为什么FastAPI的基准测试优于的原因之一 基于WSGI的框架,如Flask和Django。
性能有不同的方面:
- 处理单个请求的时间
- 一次可以处理的请求数
缓存
如果你有一个最终从中获取数据的 Web 终结点 静态源(如很少更改或从不更改的数据库记录), 可以在函数中数据。 这可以位于任何图层中。 Python 提供了标准的 模块和函数 cache() 和 lru_cache()。
数据库、文件和内存
网站运行缓慢的最常见原因之一 是足够大小的数据库表的缺失索引。 通常,在表增长到 特定大小,然后查询突然变得慢得多。 在 SQL 中,应为 WHERE cluse 中的任何列编制索引。
在本书的许多例子中,主键 生物和探索者表一直是文本字段名称。 创建表时,名称被声明为 主键 。 对于你到目前为止在本书中看到的小桌子, SQLite无论如何都会忽略该键,因为它更快。 只是为了扫描表格。 但是,一旦表达到合适的大小(例如一百万行),缺少索引将产生明显的差异。 解决方案:运行。
即使表很小,也可以使用 Python 脚本或开源工具进行一些数据库。
如果要进行许多顺序数据库查询, 可以将它们组合成一个。
如果您要上传或下载大文件, 使用流媒体版本而不是大口大口地喝。
队列
如果您正在执行任何花费超过一小部分的任务 一秒钟 (如发送确认电子邮件或缩小图像大小), 可能值得将其交给像 这样的工作队列。
蟒蛇本身
如果您的 Web 服务看起来很慢,因为 它用Python进行重要的计算, 你可能想要一个“更快的Python”。 替代方案包括:
- 使用 而不是标准的 CPython。
- 用 C、C++ 或 Rust 编写 Python 。
- 将慢速 Python 代码转换为 (由 Pydantic 和 乌维角兽自己)。
最近一个非常有趣的公告是语言。 它的目标是成为Python的完整超集, 具有新功能(具有相同的友好 Python 语法) 这可以将 Python 示例加速倍。 主要作者克里斯·拉特纳(Chris Lattner)之前曾从事过 编译器工具,如,, 和, 加上苹果的 语言。
Mojo的目标是成为人工智能发展的单一语言, 现在(在Pytorch和TensorFlow中) 需要难以开发的Python/C/C++三明治, 管理和调试。 但Mojo也是一个很好的通用语言。 除了人工智能。
我用C编码多年,并一直在等待继任者 它的性能和Python一样好,但很容易使用。 D,Golang,Julia,Zig和Rust是可能性, 但如果魔术 可以不辜负它, 我会广泛使用Mojo。
故障 排除
自下而上看 从您遇到问题的时间和地点开始。 这包括时间和空间性能问题, 还有逻辑和异步陷阱。
问题的种类
乍一看,您得到了什么 HTTP 响应代码?
- 404:身份验证或授权错误。
- 422:通常是皮丹蒂克人对使用模型的抱怨。
- 500 : 您的 FastAPI 后面的某些服务失败了。
伐木
Uvicorn 和其他 Web 服务器通常会将日志写入标准输出。 您可以检查日志以查看实际进行的调用, 包括 HTTP 动词和 URL,但不包括正文中的数据、标头、 或饼干。
如果特定终结点返回 400 级状态代码, 您可以尝试将相同的输入反馈回去,看看错误是否 再次发生。 如果是这样,我的第一个穴居人调试本能是添加 print() 相关 Web、服务和数据功能中的语句。
此外,无论在哪里引发异常,请添加详细信息。 如果数据库运行失败。 包括输入值和特定错误,例如 尝试将唯一键字段加倍。
指标
术语、、、 和似乎重叠。 在 Pythonland 中,使用:
- 收集指标。
- 显示它们。
- 用于测量计时的。
您可以将这些图层应用于站点的所有图层: 网络、服务和数据。 服务可能更具业务倾向, 而其他更具技术性, 对网站开发人员和维护人员很有用。
用于收集 FastAPI 指标的一些链接:
- 普罗米修斯快速API仪器器
- 入门:使用 Grafana 和 Prometheus 监控 FastAPI 应用程序 - 分步指南
- 快速 API 可观测性
- OpenTelemetry FastAPI Instrumentation
- 开放遥测快速 API 教程 - 完整的实施指南
- Python中OpenTelemetry的特定语言实现
回顾
很明显,生产并不容易。 问题包括网络机器本身, 网络和磁盘过载, 和数据库问题。 本章提供了有关如何获取所需信息的一些提示, 以及当问题出现时从哪里开始挖掘。
本文暂时没有评论,来添加一个吧(●'◡'●)