支持 Watcher 中后台任务的 HA¶
https://blueprints.launchpad.net/watcher/+spec/background-jobs-ha
问题描述¶
当前后台任务调度的实现存在的主要问题是,如果两个或多个决策引擎服务将存储在数据库中的持久化任务获取过来,那么每个决策引擎服务都会重复获取这些任务两次或更多次。
目前没有“任务 <-> 服务”的绑定关系,因此此 BP 的主要目标是提供一种机制,根据服务实例将任务标记(路由)给决策引擎。 此功能的另一个未来目标是在绑定“service_id”被标记为失败时,提供任务重新排队机制。
用例¶
作为 Watcher 管理员,我希望确保在 HA 模式下使用后台任务的所有 Watcher 服务都能与已调度的任务同步。
提议的变更¶
APScheduler 已经有 SQLAlchemyJobStore 类,该类会创建包含以下列的表
id
next_run_time
job_state
‘job_state’ 列包含转储的 Job 对象。正如我们所见,SQLAlchemyJobStore 没有决策引擎与其任务之间的关系。我建议添加新的列 ‘service_id’,它将是 Service.id 的外键。这种关系应该完全定义任务和服务之间的关系。还应该添加一个新的列 ‘tag’,它将包含一个包含键和值的字典,用于唯一标识服务。通常它应该包含 ‘host’ 和 ‘name’ 键。每种类型的任务都应该有自己的 tag,以便我们可以轻松地对任务列表进行一些分类/过滤。
备选方案¶
无
数据模型影响¶
应该添加一个新的表 ‘apscheduler_jobs’,包含以下列:* id * next_run_time * job_state * service_id * tag
REST API 影响¶
无
安全影响¶
无
通知影响¶
由于这是内部更改,不应影响用户体验和常用工作流程,因此预计不会有新的通知。
其他最终用户影响¶
‘apscheduler_jobs’ 表应该包含在 Watcher DB 的新的 alembic 版本中。
性能影响¶
无
其他部署者影响¶
无
开发人员影响¶
无
实现¶
负责人¶
- 主要负责人
Alexander Chadin <alexchadin>
工作项¶
从 SQLAlchemyJobStore 继承一个新的类,该类将包含 ‘service_id’ 列并覆盖适当的方法。
更新 watcher/decision_engine/audit/continuous.py 以使其与新的 job store 协同工作。
实现适当的单元测试来测试各种场景。
依赖项¶
预计没有
测试¶
适当的单元测试将被调整以适应新的更改。
文档影响¶
无
参考资料¶
https://blueprints.launchpad.net/watcher/+spec/background-jobs-ha
历史¶
无历史记录