当前位置: 首页 > 后端技术 > Python

深潜#2:API与PythonSDK详解

时间:2023-03-26 12:13:58 Python

作者:杨轩编者按:什么是API?什么是PythonSDK?熟悉Milvus数据库的朋友应该第一时间想到Milvus协议API和PyMilvus。本期可以帮助您从一个新的角度来看待Milvus和Milvus开源社区。讲师简介:杨轩,pymilvus-admin,Milvus贡献者,负责维护PyMilvus项目,开发Milvus的DataNode模块。开源社区的狂热爱好者,积极参与各种开源活动,是GDG上海核心志愿者成员。武汉大学软件工程硕士。除了在Zilliz担任软件开发工程师外,他还是一名vim小学生,让部门里的所有人都放弃了vscode转向了vim。分享大纲:PyMilvus和Milvus协议API背景介绍协议API使用PyMilvus代码深入PyMilvus开发目标和计划背景介绍让我们把Milvus看成一个黑盒子。下图展示了SDK通过gRPC与Milvus交互的过程。gRPC使用Protocolbuffers作为一种接口定义语言来描述服务器的接口以及它们传递的消息的信息结构。Protocolbuffers的语言文件通常以proto结尾。因此,黑盒Milvus的所有行为实际上都定义在协议API中。PyMilvus协议API的具体内容为:milvus.protocommon.protoschema.protoSDK要想正常工作,需要使用这三个proto文件与Milvus进行交互。本次分享的MilvusAPI就是对这三个文件的初步解读。感兴趣的小伙伴可以参考Milvus2.0SDK路线图:https://milvus.io/docs/v2.0.0...同时,PyMilvus2.0版本引入了一套新的接口——对象关系映射(ORM),它它与以前版本的界面有很大不同。今天,我们也来谈谈ORM接口的特点和PyMilvus未来的发展路径。Milvus协议APImilvus.protoMilvus协议API中最重要的部分是milvus.proto,它定义了MilvusService,MilvusService继续定义了Milvus的所有RPC接口。因此,在与Milvus交互的过程中,一定要注意这里。下图中的RPC接口参数是CreatePartitionRequest,主要的两个参数是字符串类型的collection_name和partition_name。基于这些点,可以创建一个集合分区。这个协议是什么样的?进入PyMilvus仓库(https://github.com/milvus-io/...),可以在第19行找到上面提到的例子:我们可以在这个文件中找到CreatePartitionRequest的定义:如果你需要开发新的功能或开发新的SDK,PyMilvus存储库可以帮助您找到Milvus通过RPC提供的接口。common.proto顾名思义,common.proto部分就是一些常用的类型。这部分的结构包括常用的ErrorCode和S`tatus`等:当Schema.proto传参时,这部分定义了需要的schema。C`ollectionSchema`的一个例子如下:上面三个protos组合起来形成了Milvus外部API,在这里可以找到所有的Milvus外部行为。可以阅读源码观察create_index(),发现create_index这样的外部接口实际上调用了多个RPC接口,如describe_collection、describe_index。总结一下,Milvus中的很多对外接口其实都是由多个RPC接口组成的函数。所以,当你了解了这些RPC的行为后,你就可以在SDK级别通过组合来创建新的功能。欢迎大家在本版块发挥自己的创造力和想象力,为Milvus社区做出贡献!PyMilvus2.0Object-relationalmapping(ORM)ORM用一句话简单的表达:对本地对象的操作会影响服务端点的对象。PyMilvus的ORM接口具有以下三个特点:直接对对象进行操作。直接对对象进行操作。隔离业务逻辑和数据访问细节。隐藏实现的复杂性,到处都是相同的代码。第三点,对于Milvus来说,不管是作为DBS,本地库,还是云服务,不管中间实现过程是RPC还是python,只要使用ORM风格的代码,这些代码无需任何更改即可使用。Milvus服务器的状态。这就是ORM抽象的好处。ORM风格的APIORM风格的API最大的特点是可以控制与Milvus的连接。例如,您可以添加多个Milvus服务器别名,并选择使用别名连接或关闭其中一个服务。您还可以通过删除本地服务器地址来精确控制哪些对象使用哪台机器和哪个连接。第二个特点是所有的操作都是直接面向对象的,对象包括集合、分区、索引。当这三个对象被抽象出来后,所有对它们的操作都可以直接在对象上进行。比如我们要提取一个集合对象,不管这个集合是新创建的还是已经存在于Milvus服务器中,我们都可以通过集合接口创建一个对象。您也可以将连接绑定到对象上,使用DEV别名来引用Milvus服务器作为电影对象。影片在本地会有一些状态,我们可以直接对这个对象进行各种操作。如果要构建分区对象,有两种方法。这里只提供一个:我们可以通过电影的集合对象创建一个分区,得到这个冒险之后,分区也会有自己的一些状态。我们可以像对集合一样对分区做同样的事情。这里还有一个对象索引。和partition类似,我们也可以使用这个集合对象films来为后续的操作创建索引。除了创建新添加和新索引之外,如果电影集合中已经存在分区或索引,也可以通过电影集合对象将其提取出来。如需更多帮助,我建议您阅读PyMilvus文档以真正深入地了解如何使用它。PyMilvus文档由两部分组成,第一部分是在APIdoc-strings中自动生成的,第二部分是PyMilvus贡献者根据用户使用的透视文档编写的,非常实用。您可以在这里查看我们所有的文档:https://milvus.io/docsPyMilvus文档源码查看地址:pymilvus/docsatmastermilvus-io/pymilvus