如何解决Google Cloud Functions,Google Compute Engine和排队请求
我具有启动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,instance=instance,body=bodydata)
res = meta.execute()
instanceget = service.instances().get(project=project,instance=instance).execute()
request = service.instances().start(project=project,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 Function。因此,您的云任务是HTTP目标。您可以按照Google Cloud Taks Creating HTTP Target tasks的说明和示例代码进行操作。
GCP还提供了Using Cloud Tasks to trigger Cloud Functions教程,完全相同的系统设计完全符合您当前的需求。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。