Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python将确认从后台函数返回到pubsub_Python_Google Cloud Platform_Google Cloud Functions_Google Cloud Pubsub - Fatal编程技术网

如何使用python将确认从后台函数返回到pubsub

如何使用python将确认从后台函数返回到pubsub,python,google-cloud-platform,google-cloud-functions,google-cloud-pubsub,Python,Google Cloud Platform,Google Cloud Functions,Google Cloud Pubsub,我正在建立一个新的GCP项目,以便在CSV文件上传到bucket后立即读取和解析该文件。在某种程度上,我创建了一个发布到pub/sub的触发器。pub/sub本身向后台函数发送消息 一切似乎都很正常,例如,一旦上传了文件,触发器就会启动,向Pubsub发送消息,然后发送到函数。我还可以看到该函数传递的消息 但是,问题是将Ack发送回发布/订阅。在我读过的某个地方,发送回任何2xx状态应该可以完成这项工作(从队列中删除消息),但事实并非如此。因此,pubsub“认为”消息尚未传递,并反复发送消息

我正在建立一个新的GCP项目,以便在CSV文件上传到bucket后立即读取和解析该文件。在某种程度上,我创建了一个发布到pub/sub的触发器。pub/sub本身向后台函数发送消息

一切似乎都很正常,例如,一旦上传了文件,触发器就会启动,向Pubsub发送消息,然后发送到函数。我还可以看到该函数传递的消息

但是,问题是将Ack发送回发布/订阅。在我读过的某个地方,发送回任何2xx状态应该可以完成这项工作(从队列中删除消息),但事实并非如此。因此,pubsub“认为”消息尚未传递,并反复发送消息

def parse_数据(数据、上下文):
如果数据中有“数据”:
args=base64.b64解码(数据['data']).decode('utf-8')
pubsub_message=args.replace('\n','')
properties=json.loads(pubsub_消息)
myBucket=validate_消息(属性“bucket”)
myFileName=验证消息(属性,“名称”)
fileLocation='gs://'+myBucket+'/'+myFileName
readAndEnhanceData(文件位置)
返回“OK”,200
其他:
返回“出现问题,未收到数据”
下面是一个日志文件,它显示函数正在被连续调用

D  CSV_Parser_Raw_Data 518626734652287 Function execution took 72855 ms,
 finished with status: 'ok' CSV_Parser_Raw_Data 518626734652287

D  CSV_Parser_Raw_Data 518626708442766 Function execution took 131886 ms, 
finished with status: 'ok' CSV_Parser_Raw_Data 518626708442766 

D  CSV_Parser_Raw_Data 518624470100006 Function execution took 65412 ms, 
finished with status: 'ok' CSV_Parser_Raw_Data 518624470100006 

D  CSV_Parser_Raw_Data 518626734629237 Function execution took 68004 ms, 
finished with status: 'ok' CSV_Parser_Raw_Data 518626734629237

D  CSV_Parser_Raw_Data 518623777839079 Function execution took 131255 ms, 
finished with status: 'ok' CSV_Parser_Raw_Data 518623777839079 

D  CSV_Parser_Raw_Data 518623548622842 Function execution took 131186 ms, 
finished with status: 'ok' CSV_Parser_Raw_Data 518623548622842 

D  CSV_Parser_Raw_Data 518623769252453 Function execution took 133981 ms, 
finished with status: 'ok' CSV_Parser_Raw_Data 518623769252453 

所以我很高兴知道我在这里错过了什么!也就是说,我怎样才能打破这个循环

*关于该问题的最新消息* 感谢@kamal,他强迫我睁开眼睛,让我自己重新创建存储桶/主题等。当我在执行任务时,重新检查了所有内容并意识到,我在子文件夹中使用了一个临时文件,但与上载文件位于同一存储桶中!这就是问题所在。Finalize事件适用于bucket中任意位置创建的任何对象。所以Kamal是对的多次上传正在进行中

如果您以同样的方式处理项目,请确保创建一个tmp文件夹,并且确保不向该文件夹添加任何触发器



您不能仅从函数返回200。您需要实际“确认”pubsub消息。您还没有显示从pubsub实际获取消息的代码,但我假设在该代码的某个地方,您有如下内容:

queue = Queue.Queue()
message = queue.get()
parse_data(message.data, context)
这就是您需要确认消息的地方:

queue = Queue.Queue()
message = queue.get()
if parse_data(message.data, context):
    message.ack()

一般来说,谷歌云发布/订阅消息保证。这意味着总是有可能得到重复的,尽管它们应该相对较少。在您的情况下,不是同一条消息被反复处理,而是不同的消息。518626734652287等数字是消息ID。由于每次都不同,这意味着发布了多条消息。很可能发生了以下两种情况之一:

  • 这些文件被上传了多次
  • 地面军事系统触发器设置多次。您可以通过运行
    gsutil通知列表gs://
    来检查这一点
  • 如果后者是问题所在,您将看到多个条目,例如:

    projects/_/buckets/my-bucket/notificationConfigs/1
        Cloud Pub/Sub topic: projects/cloud-pubsub-training-examples/topics/my-topic
    
    projects/_/buckets/my-bucket/notificationConfigs/2
        Cloud Pub/Sub topic: projects/cloud-pubsub-training-examples/topics/my-topic
    
    projects/_/buckets/my-bucket/notificationConfigs/3
        Cloud Pub/Sub topic: projects/cloud-pubsub-training-examples/topics/my-topic
    
    您可以通过使用配置名称发出delete来删除额外通知,例如,
    gsutil notification delete projects/\uu/bucket/my bucket/notificationConfigs/2

    还值得注意的是,对于云函数和Pub/Sub,可以设置两种类型的订阅:由用户配置的订阅和由云函数本身配置的订阅。默认情况下,前者的确认截止时间为10秒。这意味着,如果消息在10秒内未被确认,将重新发送。对于后者,默认值为600秒。如果处理邮件的时间长于此时间段,则可能会发生重新传递

    您可以尝试减少处理邮件所需的时间,也可以增加确认截止时间。您可以使用
    gcloud
    工具增加确认截止日期:

    gcloud pubsub订阅更新——确认截止日期=180

    这将把截止时间增加到3分钟。您也可以在中通过单击订阅,单击“编辑”,然后将“确认截止日期”更改为更大的值来完成此操作


    使用云函数,您不需要返回HTTP状态。仅当您直接使用时才需要此选项。

    仅当您直接使用Cloud Pub/Sub中的客户端库时才需要此选项。使用云函数时,消息会在函数运行结束时自动确认。请参阅.Ah结尾的注释。我忽略了它使用云函数的事实。为什么你的代码要花这么长时间才能运行?确认截止日期设置为什么?它在引擎盖下调用NLP以获取CSV格式接收的句子的情感分析确认截止日期设置为什么?这是一个由主题触发的后台函数,如此处所述:。我不认为我需要一个sub来运行这个函数,是吗?事实上,我没有任何潜艇,因此没有设定最后期限。这就是问题所在吗?我给你一个提示,你的问题在哪里。你不能花这么长时间来确认。谢谢,这是有道理的,因为我的函数需要一点时间来运行(它在引擎盖下调用NLP)。但是,该函数直接从主题(后台函数)触发。事实上,您不需要让函数直接从主题触发任何sub(这已在前面提到的同一页中描述)。你知道在这种情况下我如何延长邮件的截止日期吗?@AmirAryanpour我已经更新了我的答案。我认为您的问题可能有所不同,我已经解释了您的案例可能发生的情况。您是对的@kamal,发现了问题并相应地更新了问题。谢谢你抽出时间。非常感谢。@KamalAboul Hosn我在Gmail PubSub通知中遇到了类似的问题,请您告知: