【问题标题】:pubsub triggered cloud function not ack the message, even after func executes successfullypubsub 触发云函数不确认消息,即使在 func 执行成功后
【发布时间】:2020-09-23 17:40:05
【问题描述】:

我有这个简单的 python 函数,我只是从 pubsub 主题中获取输入然后打印它。

import base64,json

def hello_pubsub(event, context):
    """Triggered from a message on a Cloud Pub/Sub topic.
    Args:
         event (dict): Event payload.
         context (google.cloud.functions.Context): Metadata for the event.
    """
    pubsub_message = base64.b64decode(event['data'])
    data           = json.loads(pubsub_message)
    for i in data:
         for k,v in i.items():
              print(k,v)

如果我使用了 pubsub_v1 库,我可以做以下事情。

subscriber = pubsub_v1.SubscriberClient()

def callback(message):
        message.ack()

subscriber.subscribe(subscription_path, callback=callback)

如何在 pubsub 触发函数中确认消息?

【问题讨论】:

  • 您的主题有多少订阅?你怎么能说消息没有被确认呢?
  • 我有一个关于这个主题的订阅。即使函数成功退出,我仍然可以从队列中提取消息。 "函数执行耗时 3346 毫秒,完成状态为:'ok'"

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


【解决方案1】:

根据您的最新消息,我理解了(常见)错误。使用 Pubsub,您拥有

  • 主题,发布者可以在其中发布消息
  • (推送或拉取)订阅。主题中发布的所有消息都在每个订阅中重复。消息队列属于每个订阅。

现在,如果您仔细查看有关您的主题的订阅,您将至少有 2 个。

  • 您创建的拉取订阅。
  • 在主题上部署 Cloud Function 时自动创建的推送订阅。

推送订阅的消息被正确处理并确认。但是pull订阅的不是,因为Cloud Function不消费和确认它们;订阅是独立的。

所以,您的 Cloud Function 代码是正确的!

【讨论】:

  • 是的,是的,就是这样,我完全错过了这一部分。非常感谢:)
  • 无论如何要确认或让 pubsub 知道从云功能再次交付?如果我抛出错误,函数实例将完全关闭,再次冷启动。
  • 在http触发中,http return code not in (102,200,201,202,204)代表NACK。该实例没有关闭,并且您不会对下一条消息(或同一条消息的新演示文稿)进行冷启动。但是,如果函数崩溃/终止实例(未处理的异常,或者只是代码中的exit),是的,实例需要重新启动(所以,冷启动)
【解决方案2】:

如果函数正常终止且没有错误,则应自动确认消息。

【讨论】:

  • 但这并没有发生,即使函数成功退出,我仍然可以从队列中提取消息。 "函数执行耗时 3346 毫秒,完成状态为:'ok'"
  • 如果您有一个特定的场景,事情没有按照您的预期工作,您应该提出一个问题,概述任何人都可以采取的步骤来重现和观察问题所在。
猜你喜欢
  • 1970-01-01
  • 2021-06-18
  • 2020-12-06
  • 2021-09-19
  • 2020-08-08
  • 2018-01-01
  • 2018-01-10
  • 2021-04-17
  • 2020-11-26
相关资源
最近更新 更多