支持 ETSI NFV 处理大型查询结果

https://blueprints.launchpad.net/tacker/+spec/paging-query-result

本提案旨在根据 ETSI NFV SOL013 [1] 支持处理大型查询结果。

问题描述

根据 ETSI NFV SOL013,如果大量查询结果影响服务器性能,则应返回 400 Bad Request 或使用 URI 查询参数“nextpage_opaque_marker”将其作为子集结果处理。当前 Tacker 中存在的目标 API 如下。

  • SOL002 [2]

    • {apiRoot}/vnflcm/v1/vnf_lcm_op_occs

  • SOL003 [3]

    • {apiRoot}/vnflcm/v1/vnf_instances

    • {apiRoot}/vnflcm/v1/vnf_lcm_op_occs

    • {apiRoot}/vnflcm/v1/subscriptions

    • {apiRoot}/vnfpkgm/v1/vnf_packages

  • SOL005 [4]

    • {apiRoot}/vnfpkgm/v1/vnf_packages

然而,即使使用上述 API,当前的 Tacker 仍然将所有查询结果作为单个查询处理。此外,即使存在大量查询结果,每个 API 也无法返回 400 Bad Request。

提议的变更

根据 SOL013 分页查询结果

在上述两种方案中,我们选择分页查询结果作为 Tacker 的行为。

当搜索数量达到某个值(为每个 API 设置)时,提供分页功能的 API 将已搜索的结果作为响应返回。在响应的 Link 标头中,包含一个查询参数“nextpage_opque_marker”及其任意值(UUID 格式),以及如下所示的 URL。

<http://example.com:9890/vnflcm/v1/vnf_lcm_op_occs?nextpage_opaque_marker=603b2a59-2483-4d0d-ad13-25b2a7e87eac>; rel="next"

客户端访问此 URL 并获取下一页。

Tacker 通过“nextpage_opaque_marker”参数的值识别之前的查询,然后通过检查已获取的搜索结果,返回属于下一页的子集。 此时,如果下一页也存在,Tacker 将以类似的方式将带有“nextpage_opaque 参数”的 URL 添加到 Link 标头中。 如果没有下一页,Tacker 将不再在响应中提供 Link 标头。

如果已返回的页面中存在已返回的页面,则这些页面将被删除。 此外,如果有未返回的页面并且经过了一定的时间段,这些页面也将被删除。 删除的时间段可以配置。

将整个记录作为结果获取

如果查询参数中存在“all_records=yes”,则 Tacker 即使设置了特定查询值,也会返回所有记录,而不进行分页行为。

上述描述的两种响应行为彼此不同,如下所示。

首先,每个目标 API 都有一个可配置的值,指示分页响应中包含的最大记录数。

如果 API 请求中没有查询参数,并且要响应的所有记录数不超过最大记录值,则 Tacker 将所有记录作为单个响应返回。 在类似的情况下,如果要响应的所有记录数超过最大记录值,Tacker 将根据该值分隔记录并返回。

另一方面,如果 API 请求中存在查询参数“all_records=yes”,则 Tacker 无论要响应的所有记录数是多少,都将所有记录作为单个响应返回,即使设置了最大记录值。

数据模型影响

REST API 影响

本规范为目标 API 添加了以下功能。

  • 新的查询参数“nextpage_opaque_marker”和“all_records=yes”可以设置为 URI。

  • 可以选择一次性接收所有查询结果。

  • 在分页的情况下,客户端和 Tacker 之间可以发生 REST API 的多次请求和响应。

安全影响

通知影响

其他最终用户影响

性能影响

API 请求的大型查询结果被分成较小的部分。 它可以提高服务器在 API 响应过程中的性能。

IPv6 影响

其他部署者影响

开发人员影响

社区影响

备选方案

实现

负责人

主要负责人

Koichi Edagawa <edagawa.kc@nec.com>

其他贡献者

井上 司 <inoue.tsk@nec.com>

工作项

  1. 为每个目标 API 配置页面中记录的最大值。

  2. 更改现有代码,以便在请求期间使用“nextpage_opaque_marker”以分页响应的形式显示目标 API 响应中的记录。

  3. 更改现有代码,以便在请求中设置“all_records=yes”的情况下,将目标 API 响应中的所有记录作为单个查询结果显示。

依赖项

测试

将添加单元和功能测试。

文档影响

将在贡献者指南中添加完整的 API 文档,以解释每个目标 API 的新查询作为请求参数。

参考资料