注意
BranchPythonOperator
/ ShortCircuitOperator
我们的工作流程中有一个multiplexer类似的用例
+-----------------------+
| |
+------------>+ branch-1.begin-task |
| | |
| +-----------------------+
|
|
| +-----------------------+
| | |
+------------>+ branch-2.begin-task |
| | |
+------------+ | +-----------------------+
| | |
| MUX-task +----+ +
| | | |
+------------+ |
| |
+- -- -- -- ->
| |
|
| |
| +
|
| +-----------------------+
| | |
+------------>+ branch-n.begin-task |
| |
+-----------------------+
该流程将按以下方式工作
MUX-task
监听外部队列上的事件(单个队列)假设
n
个事件到达队列,一个事件触发每个分支n
是动态已知的 :其值是在Variable
限制
n
队列(每个分支一个),因为分支随着时间增长(n是动态定义的)我们无法在Airflow的operators and sensors(或Airflow
内可用的任何此类东西)中提出解决方案来构建此
Sensor
可用于侦听外部队列上的事件;但我们必须听多个事件,而不是一个BranchPythonOperator
可用于触发多个分支中的单个分支的执行,但立即marks remaining branches as skipped 主要瓶颈
由于上述第二个限制,即使将Sensor
和BranchPythonOperator
的功能结合在一起的自定义运算符也不起作用。
我们试图围绕Sensors
,DummyOperator
和trigger_rules
的幻想组合来实现这一目标,但到目前为止没有成功。
这在气流中可行吗?
UPDATE-1
这里有一些背景信息,以了解工作流程的背景
MySQL
表(跨越多个Aurora
数据库)同步到我们的数据仓库AuroraDB
cluster)MySQL
同步管道
AuroraDB
集群)Aurora
快照中的snapshot lifecycle events 恢复过程被发布到SQS
队列
Lambda
s / SQS
/下文)答案 0 :(得分:0)
XCOM
来救援!
我们决定按以下方式对任务进行建模(这两个任务都是 custom operator
s)
MUX-task
更像是迭代式sensor
:它不断监听队列中的事件,并对到达队列中的每个事件采取一些措施branch-x.begin-task
都是简单传感器:它们监听XCOM
(其名称采用预定义的特定格式的发布) )工作流程如下
MUX-task
侦听队列中的事件(侦听部分包含在 for
循环中,迭代次数与分支数相同)MUX-task
将其捡起;它标识应触发的“分支”,并为各个分支发布XCOM
sensor
在下一个戳中捡起XCOM
,分支开始执行。实际上,分支的sensor
只是充当网关 ,它会通过外部事件(XCOM
)打开并允许执行分支由于传感器太多(每个分支一个),我们很可能employing mode='reschedule'
才能克服deadlocks
UPDATE-1
DAG
,而不是为每个分支发布XCOM
,则触发分支的{ {1}}就像 DAG
一样TriggerDagRunOperator
是通过复杂的逻辑通过程序编程生成的 ,因此这种更改将非常困难(大量代码重写)。因此,我们决定继续使用基于民意调查的方法,并在已经花费了几个小时才能完成的管道中忍受了几分钟的额外延迟UPDATE-2
[参考问题的 UPDATE-1 部分]
由于我们的实际实现要求我们仅等待数据库的创建,因此我们决定简化工作流程,如下所示
DAG
进行了修复(每次恢复DNS
快照时它们都没有更改)Aurora
(以及 Aurora恢复生命周期事件的MUX-task
队列)SQS
被建模为尝试触发 dummy SQL查询(branch-x.begin-task
的简单sensor
)检查数据库端点是否已激活