✏️ 编者按:
前段时间,Milvus demo 使用的服务框架从 Flask 切换为 FastAPI,这一改动引发了社区小伙伴们讨论:为什么要改服务框架?改了以后有什么好处?为了解答社区小伙伴们的疑问,Zilliz 数据工程师云梅写下这篇文章。
加入 Zilliz 以来,云梅致力于为开源向量数据库 Milvus 探索解决方案,帮助用户打造场景应用。她深入关注自然语言处理技术和搜索推荐系统,日常喜欢一个人猫着乱翻书。
如果你也想参与讨论,欢迎加入我们的技术交流群,加群方式请见文末 🤩
为了让用户轻松上手向量数据库 Milvus,我们在 GitHub 上开源了 Milvus Bootcamp 项目。该项目除了提供测试性能的脚本和数据外,还提供了一些使用 Milvus 数据库实现的小项目,比如以图搜图、视频分析、自动问答机器人、推荐系统等。这些项目不仅生动地展示了向量数据库 Milvus 的应用场景,还可以帮你在实际项目中真实体验向量数据库 Milvus 有多好用。
仓库地址:https://github.com/milvus-io/bootcamp
在这些项目中,我们提供了前端和后端服务。起初,这些项目的后端使用了 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 是一个基于 Python 的轻量级 Web 应用框架。Flask 框架核心简单,用户可以轻松地开发自己的 Web 应用。此外,Flask 有一个简单且易于扩展的核心,用户在使用 Flask 开发网站时,可以根据自己的需求添加不同的功能,各种插件库可以让用户完全按照自己的意愿开发出功能强大的网站。
Flask 具有以下特点:
FastAPI 是一个现代化的高性能 Python Web 应用框架,具有与 Go 和 NodeJS 一样高的性能。FastAPI 核心建立在 Starlette 和 Pydantic 基础之上。Starlette 是一种轻量级的 ASGI 框架的工具包,是构建高性能 Asyncio 服务的选择;Pydantic 是一个基于 Python 类型提示来定义数据验证、序列化和文档的库。
FastAPI 具有以下特点:
HTTP
、HTTP2
和 WebSocket
。在为 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 基金会的毕业项目,能够管理大量非结构化数据集,在新药发现、推荐系统、聊天机器人等方面具有广泛的应用。
解锁更多应用场景