云任务条件执行

时间:2020-04-15 07:36:00

标签: google-cloud-platform google-cloud-functions google-cloud-tasks

我正在使用Cloud Tasks。仅当任务A和任务B成功完成后,才需要触发任务C的执行。因此,我需要某种方式来读取/通知已触发任务的状态。但是我在GCP的文档中看不到这样做的方法。使用Node.js SDK创建任务和Cloud Functions作为任务处理程序,如果有帮助的话。

编辑:

根据要求,这是我们正在做的更多信息:

任务1-10各自发出HTTP请求,获取数据,并基于此数据更新Firestore中的各个集合。这10个任务可以并行运行并且没有特定的顺序,因为它们彼此之间没有任何依赖性。所有这些任务实际上都是在GCF内部实现的。

任务11实际上取决于任务1-10更新的Firestore收集数据,因此它只能在任务1-10成功完成后运行。

我们确实发布了RunID作为通用标识符,以将所有任务的特定运行分组(1-11)。

2 个答案:

答案 0 :(得分:3)

Cloud Task仅触发任务,您只能定义时间条件。运行任务C时,您必须手动编写检查代码。

以下是流程示例:

  • 任务A正在运行,最后,任务已在Firestore中写入完毕
  • 任务B正在运行,最后,任务已在Firestore中写入完毕
  • 任务C启动,并检查A和B是否在Firestore中完成。
    • 否则,任务将错误退出
    • 是的,继续操作

您必须自定义C任务队列,以便在出现错误时重试该任务。

另一种昂贵的解决方案是使用Cloud Composer来处理此工作流程

关于工作流管理,暂时没有其他解决方案

答案 1 :(得分:1)

在这种情况下,Cloud Tasks不是您要使用的工具。看一下Cloud Composer,它是基于Apache Airflow for GCP构建的。

编辑:您可以创建一个GCF来处理这些请求的状态

import requests
from concurrent.futures import ThreadPoolExecutor, as_completed

################ TASK A
taskA_list = [
    "https://via.placeholder.com/400",
    "https://via.placeholder.com/410",
    "https://via.placeholder.com/420",
    "https://via.placeholder.com/430",
    "https://via.placeholder.com/440",
    "https://via.placeholder.com/450",
    "https://via.placeholder.com/460",
    "https://via.placeholder.com/470",
    "https://via.placeholder.com/480",
    "https://via.placeholder.com/490",
]

def call2TaskA(url):
    html = requests.get(url, stream=True)
    return (url,html.status_code)


processes = []
results = []
with ThreadPoolExecutor(max_workers=10) as executor:
    for url in taskA_list:
        processes.append(executor.submit(call2TaskA, url))

isOkayToDoTaskB = True
for taskA in as_completed(processes):
    result = taskA.result()
    if result[1] != 200: # your validation on taskA
        isOkayToDoTaskB = False
    results.append(result)

if not isOkayToDoTaskB:
    raise ValueError('Problems: {}'.format(results))

################ TASK B
def doTaskB():
    pass

doTaskB()
相关问题