如何在使用Airflow实现的工作流中等待DAG任务中的异步事件?

如何在使用Airflow实现的工作流中等待DAG任务中的异步事件?,airflow,apache-airflow,Airflow,Apache Airflow,使用Airflow实现的工作流包含任务A、B、C和D。我希望工作流在任务C等待事件。在中,气流传感器用于通过轮询某个状态来检查某个条件,如果该条件为真,则会触发工作流中的下一个任务。我的要求是避免投票。一个答案提到了一个创建rest_api端点以触发airflow CLI的airflow插件-使用此插件,我可以触发工作流中的任务。但是,在我的工作流中,我希望实现一个任务,该任务在接收到rest API请求后立即等待rest API调用(异步事件),该任务将被触发,工作流将恢复 避免轮询的原因:它

使用Airflow实现的工作流包含任务A、B、C和D。我希望工作流在任务C等待事件。在中,气流传感器用于通过轮询某个状态来检查某个条件,如果该条件为真,则会触发工作流中的下一个任务。我的要求是避免投票。一个答案提到了一个创建rest_api端点以触发airflow CLI的airflow插件-使用此插件,我可以触发工作流中的任务。但是,在我的工作流中,我希望实现一个任务,该任务在接收到rest API请求后立即等待rest API调用(异步事件),该任务将被触发,工作流将恢复

避免轮询的原因:它效率低下,不能按照我们的要求进行扩展

更新

我按照@Daniel Huang在回答中提到的建议,创建了一个返回False的传感器。此传感器在任务:开始评估循环中实现,现在此传感器任务不感测任何内容,但始终返回False:

class WaitForEventSensor(BaseSensorOperator):

    def poke(self, context):
        return False

start_evaluating_cycle = WaitForEventSensor(
    task_id="start_evaluating_cycle",
    dag=dag,
    poke_interval=60*60 # any number will do here, because it not polling just returning false
)

我配置了rest_api_插件,并使用该插件尝试将任务标记为“开始”以继续工作流

rest_api_插件成功执行任务,我可以看到任务是使用flower运行的:

但在工作流中,任务:开始\u评估\u循环仍处于运行状态:

rest_api_插件独立于工作流运行任务。如何使rest_api_插件在工作流内运行任务-不独立于工作流

但是,当我从airflow UI admin中选择task并标记成功时:

它将我带到这个url:

当我确认后,工作流将继续进行——这正是我想要的,但我需要通过rest API调用标记成功

我关注的是:

  • 如何使用
    rest\u api\u插件
  • 是否可以使用airflow admin创建的URL进行标记 从外部系统调用任务是否成功

  • 一种可能的解决方案是使用一个传感器,它会一直等待外部设备手动将其状态设置为成功

    所以你会有一些虚拟传感器:

    class DummySensor(BaseSensorOperator):
    
        def poke(self, context):
            return False
    
    初始化如下:

    task_c = DummySensor(
        dag=dag,
        task_id='task_c',
        interval=600,  # something fairly high since we're not polling for anything, just to check when to timeout
        timeout=3600,  # if nothing externally sets state to success in 1 hour, task will fail so task D does not run
    )
    
    当任务C启动时,它将处于运行状态。然后,您可以使用RESTAPI插件在满足条件时将Task C的状态设置为SUCCESS。任务D和其他下游任务将被启动


    这样做的缺点是,虚拟传感器仍然保持在一个工作插槽上,而它什么也不做。

    我尝试了你的建议,但没有成功。我更新了有问题的结果,@Daniel Huang.#1我对restapi插件不太熟悉,但它触发的命令看起来是正确的。你确定你看到的是正确的dag跑步路线吗?API调用尝试和UI标记成功窗口的屏幕截图显示了不同的执行日期#2也许有可能,我从未尝试过,但我会将其作为最后手段,因为这些端点不应该在UI之外使用。您还可以考虑添加现有的实验API或创建自己的API以使DB更新任务实例的状态。