繁体   English   中英

Google Cloud Functions、Google Compute Engine 和排队请求

[英]Google Cloud Functions, Google Compute Engine, and Queueing Requests

我有一个启动 Compute Engine 实例的云函数。 但是,当触发多个函数时,之前在 Compute Engine 上运行的操作会被传入的函数/命令中断。 Compute Engine 正在运行 pytorch 实现......有没有办法将这些传入函数发送到队列,以便在关闭机器之前选择下一个传入操作之前在 Compute Engine 上运行的当前操作完成? 任何概念性指导将不胜感激。

编辑

我的功能是在更改存储桶(上传)时触发的。 在该函数中,我启动了一个 GCE 实例并使用启动脚本自定义其启动行为,如下所示(为简洁起见,简化了一些命令和目录):

import os
from googleapiclient.discovery import build


def start(event, context):
    file = event
    print(file["id"])

    string = file["id"]

    newstring = string.split('/')
    userId = newstring[1]
    paymentId = newstring[2]
    name = newstring[3]

    print(name)

    if name == "uploadcomplete.txt":
        startup_script = """#! /bin/bash
                cd ~ && pwd 1>>/var/log/log.out 2>&1
                PATH=$PATH://usr/local/cuda 1>>/var/log/log.out 2>&1
                cd program_directory 1>>/var/log/log.out 2>&1
                source /opt/anaconda3/etc/profile.d/conda.sh 1>/var/log/log.out 2>&1
                conda activate env
                cd keras-retinanet/ 1>>/var/log/log.out 2>&1
                export PYTHONPATH=`pwd` 1>>/var/log/log.out 2>&1
                cd tracker 1>>/var/log/log.out 2>&1
                python program_name --gcs_input_path gs://input/{userId}/{paymentId} --gcs_output_path gs://output/{userId}/{paymentId} 1>>/var/log/log.out 2>&1
                sudo python3 gcs_to_mongo.py {userId} {paymentId} 1>>/var/log/log.out 2>&1
                sudo shutdown -P now
                """.format(userId=userId, paymentId=paymentId)
                
        service = build('compute', 'v1', cache_discovery=False)
        print('VM Instance starting')
        project = 'XXXX'
        zone = 'us-east1-c'
        instance = 'YYYY'
        metadata = service.instances().get(project=project, zone=zone, instance=instance)
        metares = metadata.execute()
        print(metares)
    
        fingerprint = metares["metadata"]["fingerprint"]
        print(fingerprint)
        bodydata = {"fingerprint": fingerprint,
                    "items": [{"key": "startup-script", "value": startup_script}]}

        print(bodydata)        
        meta = service.instances().setMetadata(project=project, zone=zone, instance=instance,
                                               body=bodydata)
        res = meta.execute()
        instanceget = service.instances().get(project=project, zone=zone, instance=instance).execute()
        request = service.instances().start(project=project, zone=zone, instance=instance)
        response = request.execute()
        print('VM Instance started')
        print(instanceget)
        print("'New Metadata:", instanceget['metadata'])

将多个批次上传到 Cloud Storage 时会出现此问题。 每个新函数都将使用新的启动脚本重新启动 GCE 实例并开始处理新数据,而保留未完成的先前数据。

Cloud Tasks 确实满足您的要求,Cloud Tasks 让您可以在主应用程序流之外分离出可以独立执行的工作,并使用您创建的处理程序异步发送它们以进行处理。 如果您有更多关于将 Cloud Tasks 适配到您当前的系统结构的问题,请告诉我。

由于您的 GCE 实例是由 Cloud Function 创建的。 Cloud Tasks 可以使用公共 IP 地址通过其 HTTP 端点调用您的 Cloud Functions。 所以你的云任务是 HTTP 目标。 您可以按照Google Cloud Taks 创建 HTTP 目标任务的说明和示例代码进行操作。

此外,GCP 提供了使用 Cloud Tasks 触发 Cloud Functions的教程,完全相同的系统设计完全符合您当前的要求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM