可选择性翻译器

https://blueprints.launchpad.net/congress/+spec/selectable-translator

问题描述

数据源驱动程序会在初始化时创建所有翻译器并发布其模式。如果驱动程序是轮询驱动程序,它会从相关服务轮询所有翻译器的数据,即使任何策略规则不使用该模式。这种行为会导致不必要的翻译器花费很长时间从相关服务获取数据,从而导致性能问题。

管理员可以通过配置 congress.conf 和通过 API 创建数据源来选择使用或不使用哪个数据源驱动程序。另一方面,管理员无法选择已创建的数据源中哪个翻译器发布其模式。因此,当一个不必要的翻译器的更新频率很高时,也会发生上述问题。

提议的变更

此 BP 提出一项新功能,允许管理员设置延迟,直到其他服务需要数据源的模式才从服务轮询数据。在通常情况下,不会发生上述问题。因此,数据源默认轮询所有表中的数据。如果管理员不希望数据源轮询不必要的数据,他们可以禁用数据源的轮询标志,然后数据源在不需要时不会轮询数据。

管理员在实例化新的数据源时,在数据源配置参数中定义一个延迟表列表。只要任何策略规则没有订阅该表,数据源就不会轮询与列表中表相关的数据。如果数据源注意到/接收到订阅,它将开始轮询数据。

存在 2 种可能的边界情况。

  • 延迟的父翻译器和非延迟的子翻译器

    当父翻译器定义为延迟但子翻译器未定义时,会发生此问题。每个表映射到一个翻译器,并且一些翻译器具有层次结构,用于将提取的一个轮询数据提取到一些表。当管理员将映射到子翻译器的表指定为延迟但父翻译器未延迟时,问题的细节在于数据源是否应该轮询数据。

    在此提案中,数据源尝试轮询数据。拥有层次结构取决于数据源使用的客户端的实现。如果客户端具有用于轮询两种数据的分离方法,数据源可以使用每种方法。

  • 延迟表的列表表行 API

    当用户在任何服务订阅它之前调用延迟表的列表表行 API 时,会发生此问题。该表没有关于该表的数据,并且数据源无法返回行数据。问题的细节在于数据源是否应该轮询数据并在用户调用 API 时返回行响应。

    在此提案中,API 将返回 400 Bad Request 错误,并附带一条消息,说明该表未开始轮询,因为该表被定义为延迟。如果 API 返回带有行数据的响应,用户将无法识别该表是延迟的,并且该行数据是否是最新的。

备选方案

指定不轮询的表是另一种选择。这允许管理员手动处理每个表以轮询或不轮询。此外,即使定义了使用该表的策略规则,数据源在不轮询状态下也不会轮询数据。但这也需要管理员手动管理所有表。操作起来很困难。

为每个翻译器启用配置轮询时间差是解决轮询性能问题的一种方法。优点是管理员可以随时编写与翻译器相关的策略规则,因为 PolicyEngine 具有其模式。然而,缺点是策略计算可能会延迟,因为 delta 比通常情况下更长。

管理员还可以通过配置文件为每个翻译器设置启用标志。使用配置文件是一种禁用它的简单方法,并且对代码的影响很小。但是,每当他们想要更改标志时,他们都必须重新启动数据源。

策略

N/A

策略动作

N/A

数据源

数据源驱动程序具有从服务开始/停止轮询数据的功能。数据源在初始化后默认开始轮询所有数据。如果为某些表指定了延迟配置,则数据源将等待直到其他服务订阅该表才开始轮询与这些表相关的数据。然后,当没有订阅延迟表的订阅者时,数据源将停止轮询数据。

从 PolicyEngine 的角度来看,没有变化。

数据模型影响

数据源在其配置值中具有延迟表列表。当前,所有配置值都存储在 DB 中,因此该列表也存储在那里。

REST API 影响

此提案扩展了现有 API 的参数。

  • 定义延迟表列表

    • API 模式

      POST /v1/data-sources

    • 请求体

    {
        "config": {
            ...
            "lazy_table": "[table1-a, table-b]",
            ...
        },
        ...
    }
    
    • 响应体

    {
        "config": {
            ...
            "lazy_table": "[table1-a, table-b]",
            ...
        },
        ...
    }
    

列出显示数据源详细信息

  • API 模式

    GET /v1/data-sources/<datasoure-id>

  • 响应体

{
    "config": {
        ...
        "lazy_table": "[table1-a, table-b]",
        ...
    },
    ...
}

安全影响

N/A

通知影响

N/A

其他最终用户影响

N/A

性能影响

如“问题描述”部分所述,该功能是为了改进 PollingDataSource 驱动程序。它减少了轮询时间以及从数据源发送到 PolicyEngine 的数据量。

其他部署者影响

N/A

开发者影响

编写另一个 PollingDataSource 驱动程序的开发人员

实现

负责人

主要负责人

muroi-masahito

其他贡献者

muroi-masahito

工作项

  1. 禁用轮询数据 当没有延迟表的订阅者时,PollingDataSourceDriver 停止轮询数据。并且当其他服务开始订阅该表时,驱动程序开始轮询数据。

  2. “lazy_table”配置 PollingDataSourceDriver 的子类将在其配置参数中具有“lazy_table”键。此键是可选配置。

依赖项

N/A

测试

  • 添加与该功能相关的单元测试

文档影响

API 参考将根据 API 更改进行更新。

参考资料

N/A