✏️ 编者按:
前段时间,Milvus demo 应用的服务框架从 Flask 切换为 FastAPI,这一改变引发了社区小伙伴们探讨:为什么要改服务框架?改了当前有什么益处?为了解答社区小伙伴们的疑难,Zilliz 数据工程师云梅写下这篇文章。
退出 Zilliz 以来,云梅致力于为开源向量数据库 Milvus 摸索解决方案,帮忙用户打造场景利用。她深刻关注自然语言解决技术和搜寻举荐零碎,日常喜爱一个人猫着乱翻书。
如果你也想参加探讨,欢送退出咱们的技术交换群,加群形式请见文末 🤩
概述
为了让用户轻松上手向量数据库 Milvus,咱们在 GitHub 上开源了 Milvus Bootcamp 我的项目。该我的项目除了提供测试性能的脚本和数据外,还提供了一些应用 Milvus 数据库实现的小我的项目,比方以图搜图、视频剖析、主动问答机器人、举荐零碎等。这些我的项目不仅活泼地展现了向量数据库 Milvus 的利用场景,还能够帮你在理论我的项目中实在体验向量数据库 Milvus 有多好用。
仓库地址:https://github.com/milvus-io/…
在这些我的项目中,咱们提供了前端和后端服务。起初,这些我的项目的后端应用了 Web 框架 Flask 来提供 Web 服务,起初采纳 FastAPI 替换了 Flask。切换之后,社区的一些小伙伴提出了疑难,为什么咱们最终抉择应用 FastAPI 而不是 Flask?咱们在社区内进行了一些很有价值的探讨,这篇文章将系统地讲述这所有换的目标。
让咱们来先看一下什么是 Web 框架,以及 Flask 和 FastAPI 各自有什么特点。
Python web
Web 框架是一组包或模块的汇合,是用于进行 Web 开发的一套软件架构,容许开发人员编写 Web 应用程序或服务,而无需解决诸如协定、套接字或过程 / 线程治理之类的低级细节,缩小了开发人员开发 Web 利用的工作量。应用 Web 框架进行 Web 开发的时候,在进行数据缓存、数据库拜访、数据安全校验等方面,不须要本人再从新实现,而是将业务逻辑相干的代码写入框架就能够。
目前已有很多 Python web 框架,其中常见的如 Django、Flask、Tornado、FastAPI 等。本文将基于 Milvus Bootcamp 中的理论利用,聚焦 Flask 和 FastAPI 并探讨两者的不同,以及咱们抉择 FastAPI 的起因。
Flask
Flask 是一个基于 Python 的轻量级 Web 利用框架。Flask 框架外围简略,用户能够轻松地开发本人的 Web 利用。此外,Flask 有一个简略且易于扩大的外围,用户在应用 Flask 开发网站时,能够依据本人的需要增加不同的性能,各种插件库能够让用户齐全依照本人的志愿开发出功能强大的网站。
Flask 具备以下特点:
- Flask 是一个微框架,因为它不须要特定的工具或库。它没有数据库形象层、表单验证或任何其余事后存在的第三方库提供通用性能的组件。然而,Flask 反对能够增加应用程序性能的扩大,就如同它们是在 Flask 自身中实现的一样。存在对象关系映射器、表单验证、上传解决、各种凋谢身份验证技术和一些常见框架相干工具的扩大。
- Flask 是一个基于 WSGI(Web Server Gateway Interface)的 Web 利用框架。WSGI 是为 Python 语言定义的 Web 服务器和 Web 应用程序或框架之间的一种简略而通用的接口。
- Flask 蕴含了 Werkzeug 和 Jinja2 两个外围函数库。Werkzeug 是一个 WSGI 工具包,它实现了申请、响应对象和实用功能,这使得用户能够在其上构建 Web 框架,Flask 框架应用 Werkzeg 作为其根底之一;Jinja2 是一个风行的 Python 的功能齐全的模板引擎,它有残缺的 unicode 反对,一个可选的集成沙箱执行环境,被宽泛应用。
FastAPI
FastAPI 是一个现代化的高性能 Python Web 利用框架,具备与 Go 和 NodeJS 一样高的性能。FastAPI 外围建设在 Starlette 和 Pydantic 根底之上。Starlette 是一种轻量级的 ASGI 框架的工具包,是构建高性能 Asyncio 服务的抉择;Pydantic 是一个基于 Python 类型提醒来定义数据验证、序列化和文档的库。
FastAPI 具备以下特点:
- FastAPI 是一个基于 ASGI(Asynchronous Server Gateway Interface)的 Web 利用框架。ASGI 是异步网关协定接口,一个介于网络协议服务和 Python 利用之间的标准接口,可能解决多种通用的协定类型,包含 HTTP、HTTP2 和 WebSocket。
- FastAPI 基于的 Pydantic 提供了接口数据类型查看的性能。用户不须要做额定的接口参数校验,不必写大量代码验证参数是否为空、类型是否正确,无效缩小了代码中的人为谬误,进步开发效率。
- FastAPI 反对 OpenAPI(前身是 Swagger)和 Redoc 两种文档格局。对于使用者来说,不必破费大量工夫写额定的接口文档。FastAPI 提供的 OpenAPI 文档如图:
Why FastAPI
在为 Milvus Bootcamp 中的项目选择 Web 利用框架时,咱们调研了包含 Django、Flask、FastAPI、Tornado 等在内的多种 Python Web 利用框架。因为 Milvus Bootcamp 中的我的项目是作为案例提供给 Milvus 用户参考的,那咱们首先思考的点就是,依赖的内部框架应该尽可能轻量、简略易上手,因而初步筛选出了 Flask 和 FastAPI。
接着,让咱们深刻调研 Flask 和 FastAPI,我这里对两者之间的比拟做了一个简略的总结:
网上比拟 Flask 和 FastAPI 这两个 Web 利用框架的文章十分多,大多基于以上表格中的这几点进行比拟。这里,我将基于 Milvus Bootcamp 中的我的项目和理论利用来剖析抉择了应用 FastAPI 而不是 Flask 的起因。
- 一是基于性能的思考。对于以图搜图、问答零碎、类似文本检索等我的项目来说,这些零碎的实时性要求都绝对较高。因而在抉择 Web 框架时,性能是咱们思考的一个重点。家喻户晓,高性能是 FastAPI 的一大亮点。
- 二是基于开发效率的思考。FastAPI 提供了主动验证数据类型的性能,能够无效缩小开发时人为的代码谬误,极大进步开发效率。而对于 Flask 来说,每一个接口都须要在代码中实现数据类型的验证,判断传入的数据是否为空等,减少了我的项目中的代码量。Bootcamp 是面向用户的一个 Milvus 训练营,简略易上手的代码和较低的出错率,能极大地优化用户的应用感。
- 三是基于 FastAPI 原生反对异步的思考。此前,Milvus 官网上线了可供用户自行上传数据并查问的以图搜图、视频剖析、问答机器人和化学式检索这四个我的项目。用户上传数据时,因为对视频和文本等数据的处理过程绝对耗时,所以咱们抉择了在服务端承受到用户申请时就立即给用户返回 ✅「已接管到申请」的音讯,等后盾服务解决完数据后,再给用户发送一个 ✅✅「数据上传胜利」的提醒。因为 FastAPI 自身反对异步的个性,这一点实现起来也非常容易。
- 四是 FastAPI 提供了主动交互式文档。无论是在开发过程中调试代码接口,还是在和前端团队开发 Web 前端时的对接过程中,咱们都能够间接关上 FastAPI 提供的 OpenAPI 文档进行调试。而如果应用其余不提供这类文档的 Web 框架,那么在实现 Web 服务端代码开发后,咱们还须要写一个接口文档,额定应用 Postman 一类的工具调试接口。此外,对于用户来说,如果只想启动 Bootcamp 中提供的我的项目的 Web 服务端,而不想额定的启动一个 Web 网页端服务,只须要关上 FastAPI 提供的 OpenAPI 文档,也能以一个直观的形式去体验这些我的项目。
- 最初,咱们思考的是两个框架对用户敌对水平的不同。FastAPI 的开发和应用更加简略,使得 Milvus 数据库的用户在学习理解 Milvus Bootcamp 中的我的项目时,能够更多地关注我的项目自身的具体实现,而不必破费过多的工夫去学习依赖的 Web 框架等。
总结
Flask 和 FlastAPI 各有其突出的特点。FlastAPI 作为一个绝对比拟新的 Web 利用框架,其外围依赖 Starlette 和 Pydantic,堪称是一个站在伟人肩膀上的产物,其高性能、异步框架、数据验证等特点十分吸引开发者。Flask 是一个晚期的 Web 框架,在根底性能之上还反对灵便地增加各种插件,具备欠缺的性能,也有欠缺的官网文档和大量用户公布的应用教训,以及沉闷的用户社区。总体而言,在理论利用过程中,开发者应该基于理论利用需要去抉择适合的框架。
Zilliz 以从新定义数据迷信为愿景,致力于打造一家寰球当先的开源技术创新公司,并通过开源和云原生解决方案为企业解锁非结构化数据的暗藏价值。
Zilliz 构建了 Milvus 向量数据库,以放慢下一代数据平台的倒退。Milvus 数据库是 LF AI & Data 基金会的毕业我的项目,可能治理大量非结构化数据集,在新药发现、举荐零碎、聊天机器人等方面具备宽泛的利用。