Airflowを使用して実装されたワークフローには、タスクA、B、C、およびDが含まれています。ワークフローがタスクCでイベントを待機するようにします。 Airflowでは、センサーを使用して、ある状態をポーリングすることである状態をチェックします。その条件がtrueの場合、ワークフローの次のタスクがトリガーされます。私の要件は、ポーリングを回避することです。 ここ エアフローの rest_api_plugin について言及している1つの回答は、エアフローCLIをトリガーするrest_apiエンドポイントを作成します-このプラグインを使用して、ワークフローでタスクをトリガーできます。ただし、私のワークフローでは、ポーリングせずにREST API呼び出し(非同期イベント)を待機するタスクを実装したいと考えています。RESTAPIリクエストを受信すると、タスクがトリガーされ、Airflowワークフローが再開されます。
ポーリングを回避する理由:非効率的であり、要件に従ってスケーリングされません。
更新
@Daniel Huangの回答に記載されている提案に従い、Falseを返すセンサーを作成しました。このセンサーはtask:start_evaluating_cycleに実装されていますが、このセンサータスクは何も検出していませんが、常に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_pluginを構成し、プラグインを使用して、ワークフローを続行するためにtask:start_evaluating_cyleを完了としてマークしようとしています。
Rest_api_pluginはタスクを正常に実行し、flowerを使用してタスクが実行されたことがわかります。
ただし、ワークフローでは、タスク:start_evaluating_cycleはまだ実行状態です:
rest_api_pluginは、ワークフローとは独立してタスクを実行しています。ワークフローに依存せずに、ワークフロー内でタスクを実行するようにrest_api_pluginを作成するにはどうすればよいですか。
ただし、airflow UI管理者からタスクを選択し、成功をマークすると、次のようになります。
確認すると、ワークフローはさらに進みます。これは私が望んでいることですが、RESTAPI呼び出しから成功をマークする必要があります。
私の懸念は次のとおりです。
考えられる解決策の1つは、外部の何かが手動で状態を成功に設定するまで永久に待機するセンサーを使用することです。
したがって、ある種のダミーセンサーがあります。
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が開始すると、実行状態になります。次に、REST APIプラグインを使用して、条件が満たされたときにタスクCの状態をSUCCESSに設定できます。その後、タスクDおよびその他のダウンストリームタスクが開始されます。
これの欠点は、ダミーセンサーが何もしないのを待っている間もワーカースロットを保持していることです。