三周精通FastAPI:40 部署应用程序或任何类型的 Web API 概念

官方文档:部署概念 - FastAPI

部署概念¶

在部署 FastAPI 应用程序或任何类型的 Web API 时,有几个概念值得了解,通过掌握这些概念您可以找到最合适的方法来部署您的应用程序

一些重要的概念是:

  • 安全性 - HTTPS
  • 启动时运行
  • 重新启动
  • 复制(运行的进程数)
  • 内存
  • 开始前的先前步骤

我们接下来了解它们将如何影响部署

我们的最终目标是能够以安全的方式为您的 API 客户端提供服务,同时要避免中断,并且尽可能高效地利用计算资源( 例如服务器CPU资源)。 🚀

我将在这里告诉您更多关于这些概念的信息,希望能给您提供直觉来决定如何在非常不同的环境中部署 API,甚至在是尚不存在的未来的环境里。

通过考虑这些概念,您将能够评估和设计部署您自己的 API的最佳方式。

在接下来的章节中,我将为您提供更多部署 FastAPI 应用程序的具体方法

但现在,让我们仔细看一下这些重要的概念。 这些概念也适用于任何其他类型的 Web API。 💡

安全性 - HTTPS¶

在上一章有关 HTTPS 中,我们了解了 HTTPS 如何为您的 API 提供加密。

我们还看到,HTTPS 通常由应用程序服务器的外部组件(TLS 终止代理)提供。

并且必须有某个东西负责更新 HTTPS 证书,它可以是相同的组件,也可以是不同的组件。

HTTPS 示例工具¶

您可以用作 TLS 终止代理的一些工具包括:

  • Traefik
    • 自动处理证书更新 ✨
  • Caddy
    • 自动处理证书更新 ✨
  • Nginx
    • 使用 Certbot 等外部组件进行证书更新
  • HAProxy
    • 使用 Certbot 等外部组件进行证书更新
  • 带有 Ingress Controller(如Nginx) 的 Kubernetes
    • 使用诸如 cert-manager 之类的外部组件来进行证书更新
  • 由云服务商内部处理,作为其服务的一部分(请阅读下文👇)

另一种选择是您可以使用云服务来完成更多工作,包括设置 HTTPS。 它可能有一些限制或向您收取更多费用等。但在这种情况下,您不必自己设置 TLS 终止代理。

我将在接下来的章节中向您展示一些具体示例。


接下来要考虑的概念都是关于运行实际 API 的程序(例如 Uvicorn)。

程序和进程¶

我们将讨论很多关于正在运行的“进程”的内容,因此弄清楚它的含义以及与“程序”这个词有什么区别是很有用的。

什么是程序¶

程序这个词通常用来描述很多东西:

  • 您编写的 代码Python 文件
  • 操作系统可以执行文件,例如:pythonpython.exeuvicorn
  • 在操作系统上运行、使用CPU 并将内容存储在内存上的特定程序。 这也被称为进程

什么是进程¶

进程 这个词通常以更具体的方式使用,仅指在操作系统中运行的东西(如上面的最后一点):

  • 在操作系统上运行的特定程序。
    • 这不是指文件,也不是指代码,它具体指的是操作系统正在执行和管理的东西。
  • 任何程序,任何代码,只有在执行时才能做事。 因此,是当有进程正在运行时。
  • 该进程可以由您或操作系统终止(或“杀死”)。 那时,它停止运行/被执行,并且它可以不再做事情
  • 您计算机上运行的每个应用程序背后都有一些进程,每个正在运行的程序,每个窗口等。并且通常在计算机打开时同时运行许多进程。
  • 同一程序可以有多个进程同时运行。

如果您检查操作系统中的“任务管理器”或“系统监视器”(或类似工具),您将能够看到许多正在运行的进程。

例如,您可能会看到有多个进程运行同一个浏览器程序(Firefox、Chrome、Edge 等)。 他们通常每个tab运行一个进程,再加上一些其他额外的进程。


现在我们知道了术语“进程”和“程序”之间的区别,让我们继续讨论部署。

启动时运行¶

在大多数情况下,当您创建 Web API 时,您希望它始终运行、不间断,以便您的客户端始终可以访问它。 这是当然的,除非您有特定原因希望它仅在某些情况下运行,但大多数时候您希望它不断运行并且可用

在远程服务器中¶

当您设置远程服务器(云服务器、虚拟机等)时,您可以做的最简单的事情就是手动运行 Uvicorn(或类似的),就像本地开发时一样。

它将会在开发过程中发挥作用并发挥作用。

但是,如果您与服务器的连接丢失,正在运行的进程可能会终止。

如果服务器重新启动(例如更新后或从云提供商迁移后),您可能不会注意到它。 因此,您甚至不知道必须手动重新启动该进程。 所以,你的 API 将一直处于挂掉的状态。 😱

启动时自动运行¶

一般来说,您可能希望服务器程序(例如 Uvicorn)在服务器启动时自动启动,并且不需要任何人为干预,让进程始终与您的 API 一起运行(例如 Uvicorn 运行您的 FastAPI 应用程序) 。

单独的程序¶

为了实现这一点,您通常会有一个单独的程序来确保您的应用程序在启动时运行。 在许多情况下,它还可以确保其他组件或应用程序也运行,例如数据库。

启动时运行的示例工具¶

可以完成这项工作的工具的一些示例是:

  • Docker
  • Kubernetes
  • Docker Compose
  • Docker in Swarm Mode
  • Systemd
  • Supervisor
  • 作为其服务的一部分由云提供商内部处理
  • 其他的...

我将在接下来的章节中为您提供更具体的示例。

重新启动¶

与确保应用程序在启动时运行类似,您可能还想确保它在挂掉后重新启动

我们会犯错误¶

作为人类,我们总是会犯错误。 软件几乎总是在不同的地方隐藏着bug。 🐛

作为开发人员,当我们发现这些bug并实现新功能(也可能添加新bug😅)时,我们会不断改进代码。

自动处理小错误¶

使用 FastAPI 构建 Web API 时,如果我们的代码中存在错误,FastAPI 通常会将其包含到触发错误的单个请求中。 🛡

对于该请求,客户端将收到 500 内部服务器错误,但应用程序将继续处理下一个请求,而不是完全崩溃。

更大的错误 - 崩溃¶

尽管如此,在某些情况下,我们编写的一些代码可能会导致整个应用程序崩溃,从而导致 Uvicorn 和 Python 崩溃。 💥

尽管如此,您可能不希望应用程序因为某个地方出现错误而保持死机状态,您可能希望它继续运行,至少对于未破坏的路径操作

崩溃后重新启动¶

但在那些严重错误导致正在运行的进程崩溃的情况下,您需要一个外部组件来负责重新启动进程,至少尝试几次......

Tip

...尽管如果整个应用程序只是立即崩溃,那么永远重新启动它可能没有意义。 但在这些情况下,您可能会在开发过程中注意到它,或者至少在部署后立即注意到它。

因此,让我们关注主要情况,在未来的某些特定情况下,它可能会完全崩溃,但重新启动它仍然有意义。

您可能希望让这个东西作为 外部组件 负责重新启动您的应用程序,因为到那时,使用 Uvicorn 和 Python 的同一应用程序已经崩溃了,因此同一应用程序的相同代码中没有东西可以对此做出什么。

自动重新启动的示例工具¶

在大多数情况下,用于启动时运行程序的同一工具也用于处理自动重新启动

例如,可以通过以下方式处理:

  • Docker
  • Kubernetes
  • Docker Compose
  • Docker in Swarm mode
  • Systemd
  • Supervisor
  • 作为其服务的一部分由云提供商内部处理
  • 其他的...

复制 - 进程和内存¶

对于 FastAPI 应用程序,使用像 Uvicorn 这样的服务器程序,在一个进程中运行一次就可以同时为多个客户端提供服务。

但在许多情况下,您会希望同时运行多个工作进程。

多进程 - Workers¶

如果您的客户端数量多于单个进程可以处理的数量(例如,如果虚拟机不是太大),并且服务器的 CPU 中有 多个核心,那么您可以让 多个进程 运行 同时处理同一个应用程序,并在它们之间分发所有请求。

当您运行同一 API 程序的多个进程时,它们通常称为 workers

工作进程和端口¶

还记得文档 About HTTPS 中只有一个进程可以侦听服务器中的端口和 IP 地址的一种组合吗?

现在仍然是对的。

因此,为了能够同时拥有多个进程,必须有一个单个进程侦听端口,然后以某种方式将通信传输到每个工作进程。

每个进程的内存¶

现在,当程序将内容加载到内存中时,例如,将机器学习模型加载到变量中,或者将大文件的内容加载到变量中,所有这些都会消耗服务器的一点内存 (RAM) 。

多个进程通常不共享任何内存。 这意味着每个正在运行的进程都有自己的东西、变量和内存。 如果您的代码消耗了大量内存,每个进程将消耗等量的内存。

服务器内存¶

例如,如果您的代码加载 1 GB 大小的机器学习模型,则当您使用 API 运行一个进程时,它将至少消耗 1 GB RAM。 如果您启动 4 个进程(4 个工作进程),每个进程将消耗 1 GB RAM。 因此,您的 API 总共将消耗 4 GB RAM

如果您的远程服务器或虚拟机只有 3 GB RAM,尝试加载超过 4 GB RAM 将导致问题。 🚨

多进程 - 一个例子¶

在此示例中,有一个 Manager Process 启动并控制两个 Worker Processes

该管理器进程可能是监听 IP 中的 端口 的进程。 它将所有通信传输到工作进程。

这些工作进程将是运行您的应用程序的进程,它们将执行主要计算以接收 请求 并返回 响应,并且它们将加载您放入 RAM 中的变量中的任何内容。

当然,除了您的应用程序之外,同一台机器可能还运行其他进程

一个有趣的细节是,随着时间的推移,每个进程使用的 CPU 百分比可能会发生很大变化,但内存 (RAM) 通常会或多或少保持稳定

如果您有一个每次执行相当数量的计算的 API,并且您有很多客户端,那么 CPU 利用率 可能也会保持稳定(而不是不断快速上升和下降)。

复制工具和策略示例¶

可以通过多种方法来实现这一目标,我将在接下来的章节中向您详细介绍具体策略,例如在谈论 Docker 和容器时。

要考虑的主要限制是必须有一个单个组件来处理公共IP中的端口。 然后它必须有一种方法将通信传输到复制的进程/worker

以下是一些可能的组合和策略:

  • Gunicorn 管理 Uvicorn workers
    • Gunicorn 将是监听 IP 和 端口 的 进程管理器,复制将通过 多个 Uvicorn 工作进程 进行
  • Uvicorn 管理 Uvicorn workers
    • 一个 Uvicorn 进程管理器 将监听 IP 和 端口,并且它将启动 多个 Uvicorn 工作进程
  • Kubernetes 和其他分布式 容器系统
    • Kubernetes 层中的某些东西将侦听 IP 和 端口。 复制将通过拥有多个容器,每个容器运行一个 Uvicorn 进程
  • 云服务 为您处理此问题
    • 云服务可能为您处理复制。 它可能会让您定义 要运行的进程,或要使用的 容器映像,在任何情况下,它很可能是 单个 Uvicorn 进程,并且云服务将负责复制它。

Tip

如果这些关于 容器、Docker 或 Kubernetes 的内容还没有多大意义,请不要担心。

我将在以后的章节中向您详细介绍容器镜像、Docker、Kubernetes 等:容器中的 FastAPI - Docker。

启动之前的步骤¶

在很多情况下,您希望在启动应用程序之前执行一些步骤。

例如,您可能想要运行数据库迁移

但在大多数情况下,您只想执行这些步骤一次

因此,在启动应用程序之前,您将需要一个单个进程来执行这些前面的步骤

而且您必须确保它是运行前面步骤的单个进程, 即使之后您为应用程序本身启动多个进程(多个worker)。 如果这些步骤由多个进程运行,它们会通过在并行运行来重复工作,并且如果这些步骤像数据库迁移一样需要小心处理,它们可能会导致每个进程和其他进程发生冲突。

当然,也有一些情况,多次运行前面的步骤也没有问题,这样的话就好办多了。

Tip

另外,请记住,根据您的设置,在某些情况下,您在开始应用程序之前可能甚至不需要任何先前的步骤

在这种情况下,您就不必担心这些。 🤷

前面步骤策略的示例¶

这将在很大程度上取决于您部署系统的方式,并且可能与您启动程序、处理重启等的方式有关。

以下是一些可能的想法:

  • Kubernetes 中的“Init Container”在应用程序容器之前运行
  • 一个 bash 脚本,运行前面的步骤,然后启动您的应用程序
    • 您仍然需要一种方法来启动/重新启动 bash 脚本、检测错误等。

Tip

我将在以后的章节中为您提供使用容器执行此操作的更具体示例:容器中的 FastAPI - Docker。

资源利用率¶

您的服务器是一个资源,您可以通过您的程序消耗或利用CPU 上的计算时间以及可用的 RAM 内存。

您想要消耗/利用多少系统资源? 您可能很容易认为“不多”,但实际上,您可能希望在不崩溃的情况下尽可能多地消耗

如果您支付了 3 台服务器的费用,但只使用了它们的一点点 RAM 和 CPU,那么您可能浪费金钱💸,并且可能 浪费服务器电力 🌎,等等。

在这种情况下,最好只拥有 2 台服务器并使用更高比例的资源(CPU、内存、磁盘、网络带宽等)。

另一方面,如果您有 2 台服务器,并且正在使用 100% 的 CPU 和 RAM,则在某些时候,一个进程会要求更多内存,并且服务器将不得不使用磁盘作为“内存” (这可能会慢数千倍),甚至崩溃。 或者一个进程可能需要执行一些计算,并且必须等到 CPU 再次空闲。

在这种情况下,最好购买一台额外的服务器并在其上运行一些进程,以便它们都有足够的 RAM 和 CPU 时间

由于某种原因,您的 API 的使用量也有可能出现激增。 也许它像病毒一样传播开来,或者也许其他一些服务或机器人开始使用它。 在这些情况下,您可能需要额外的资源来保证安全。

您可以将一个任意数字设置为目标,例如,资源利用率在 50% 到 90% 之间。 重点是,这些可能是您想要衡量和用来调整部署的主要内容。

您可以使用“htop”等简单工具来查看服务器中使用的 CPU 和 RAM 或每个进程使用的数量。 或者您可以使用更复杂的监控工具,这些工具可能分布在服务器等上。

回顾¶

您在这里阅读了一些在决定如何部署应用程序时可能需要牢记的主要概念:

  • 安全性 - HTTPS
  • 启动时运行
  • 重新启动
  • 复制(运行的进程数)
  • 内存
  • 开始前的先前步骤

了解这些想法以及如何应用它们应该会给您足够的直觉在配置和调整部署时做出任何决定。 🤓

在接下来的部分中,我将为您提供更具体的示例,说明您可以遵循的可能策略。 🚀

实践

本章节主要讲述了一些部署方面的知识,比如多进程。提到了Gunicorn 管理 Uvicorn workers多进程的例子。具体将在42节进行实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/469302.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【算法一周目】双指针(1)

目录 1.双指针介绍 2.移动零 解题思路 C代码实现 3.复写零 解题思路 C代码实现 4.快乐数 解题思路 C代码实现 5.盛水最多的容器 解题思路 C代码实现 1.双指针介绍 常见的双指针有两种形式,一种是对撞指针,一种是快慢指针。 对撞指针&#x…

ARXML汽车可扩展标记性语言规范讲解

ARXML: Automotive Extensible Markup Language (汽车可扩展标记语言) xmlns: Xml name space (xml 命名空间) xsd: Xml Schema Definition (xml 架构定义) 1、XML与HTML的区别,可扩展。 可扩展,主要是…

自监督学习:机器学习的未来新方向

引言 自监督学习(Self-Supervised Learning, SSL)是近年来机器学习领域的一个重要发展方向,迅速成为许多研究和应用的热点。与传统的监督学习不同,自监督学习利用未标注数据,通过设计自我生成标签的任务,帮…

FFMPEG录屏(22)--- Linux 下基于X11枚举所有显示屏,并获取大小和截图等信息

众人拾柴火焰高,github给个star行不行? open-traa/traa traa is a versatile project aimed at recording anything, anywhere. The primary focus is to provide robust solutions for various recording scenarios, making it a highly adaptable tool…

多媒体信息检索

文章目录 一、绪论二、文本检索 (Text Retrieval)(一) 索引1.倒排索引2.TF-IDF (二) 信息检索模型 (IR模型,Information Retrieval)1.布尔模型 (Boolean模型)(1)扩展的布尔模型 (两个词)(2)P-Norm模型 (多个词) 2.向量空间模型 (Vector Space Model,VSM)…

MySql-8.0.40安装详细教程

文章目录 原创下载安装包安装配置初始化MySQL数据库安装mysql服务并启动启动MySQL服务连接MySQL配置环境变量 原创 MySql-8.0.26安装详细教程(保姆级) 下载安装包 MySQL Community Downloads 直接到选择MySQL Community Server版本页面 MySQL Commun…

openai Realtime API (实时语音)

https://openai.com/index/introducing-the-realtime-api/ 官方demo https://github.com/openai/openai-realtime-console 官方demo使用到的插件 https://github.com/openai/openai-realtime-api-beta?tabreadme-ov-file 装包配置 修改yarn.lock 这个包是从github下载的 &q…

杨辉三角-一维数组与二维数组解法

这种问题是很有规律的 这里 总结一下 这类问题输出&#xff1a;对称 且数据相同的很多 就比如首位都是1 如果计算中间值遇到困难 可以试着把边界值单独输出 一维数组 // // Created by 徐昌真 on 2024/11/11. // #include <stdio.h> //一维数组 int main() {int n; /…

无人机反制技术与方法:主动防御,被动防御技术原理详解

无人机反制技术与方法主要分为主动防御和被动防御两大类&#xff0c;以下是关于这两类防御技术的原理详解&#xff1a; 主动防御技术原理 主动防御系统旨在通过直接干扰或摧毁来攻击入侵的无人机。这类系统通常包括电子干扰、激光武器、定向能武器以及硬杀伤手段&#xff08;如…

计算机毕业设计Python+图神经网络考研院校推荐系统 考研分数线预测 考研推荐系统 考研爬虫 考研大数据 Hadoop 大数据毕设 机器学习 深度学习

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

小白初入Android_studio所遇到的坑以及怎么解决

1. 安装Android_studio 参考&#xff1a;Android Studio 安装配置教程 - Windows(详细版)-CSDN博客 Android Studio超级详细讲解下载、安装配置教程&#xff08;建议收藏&#xff09;_androidstudio-CSDN博客 想下旧版本的android_studio的地址&#xff08;仅供参考&#xf…

020_Servlet_Mysql学生选课系统(新版)_lwplus87

摘 要 随着在校大学生人数的不断增加&#xff0c;教务系统的数据量也不断的上涨。针对学生选课这一环节&#xff0c;本系统从学生网上自主选课以及课程发布两个大方面进行了设计&#xff0c;基本实现了学生的在线信息查询、选课功能以及教师对课程信息发布的管理等功能&…

Vue Cli 脚手架目录文件介绍

小试牛刀 //vetur高亮; vuetab 快速生成 <template><div class"box">我是个盒子<button click"fn">按钮</button></div> </template><script> export default {methods:{fn(){alert("Hello Vue")}} …

[安洵杯 2019]easy_web 详细题解

知识点: 编码转换 命令执行 linux空格_关键字绕过 打开页面 发现url 是 /index.php?imgTXpVek5UTTFNbVUzTURabE5qYz0&cmd 有img参数和cmd参数 cmd参数是没赋值的,随便赋值为123456 页面没有反应 鼠标移动到图片下面时发现有东西,当然直接查看页面源代码也可以发现 尝…

完整培训教程:骨折图像分割

骨折图像分割系统源码&#xff06;数据集分享 [yolov8-seg-efficientViT&#xff06;yolov8-seg-C2f-CloAtt等50全套改进创新点发刊_一键训练教程_Web前端展示] 1.研究背景与意义 项目参考ILSVRC ImageNet Large Scale Visual Recognition Challenge 项目来源AAAI Global A…

文本语义分块、RAG 系统的分块难题:小型语言模型如何找到最佳断点

文本语义分块、RAG 系统的分块难题&#xff1a;小型语言模型如何找到最佳断点&#xff1f; 转自jina最新的关于文本语义分块的分享和模型 之前我们聊过RAG 里文档分块 (Chunking) 的挑战&#xff0c;也介绍了 迟分 (Late Chunking) 的概念&#xff0c;它可以在向量化的时候减…

物联网技术及其在智慧城市中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 物联网技术及其在智慧城市中的应用 物联网技术及其在智慧城市中的应用 物联网技术及其在智慧城市中的应用 引言 物联网概述 定义…

新的服务器Centos7.6 安卓基础的环境配置(新服务器可直接粘贴使用配置)

常见的基础服务器配置之Centos命令 正常来说都是安装一个docker基本上很多问题都可以解决了&#xff0c;我基本上都是通过docker去管理一些容器如&#xff1a;mysql、redis、mongoDB等之类的镜像&#xff0c;还有一些中间件如kafka。下面就安装一个 docker 和 nginx 的相关配置…

金属箔电阻

6.金属箔电阻如何实现“高精度” 电阻的阻值会受到各种“应力”影响而发生改变&#xff0c;离开稳定性的高精度是没有意义的。 例如&#xff0c;电阻出厂时的精度时0.01%&#xff0c;为了实现精度付出了高昂的费用&#xff0c;但在几个月的存储或几百个小时的负载后阻值的变化…

在Django中安装、配置、使用CKEditor5,并将CKEditor5录入的文章展现出来,实现一个简单博客网站的功能

在Django中可以使用CKEditor4和CKEditor5两个版本&#xff0c;分别对应软件包django-ckeditor和django-ckeditor-5。原来使用的是CKEditor4&#xff0c;python manager.py makemigrations时总是提示CKEditor4有安全风险&#xff0c;建议升级到CKEditor5。故卸载了CKEditor4&…