google-cloud-functions - 如果未成功响应,发布/订阅是否会立即重新发送消息?

标签 google-cloud-functions google-cloud-pubsub

我有一个Cloud Function订阅了Pub / Sub主题。

根据docs,如果Cloud Function返回不成功的响应,它将重新发送消息:

端点通过返回HTTP成功状态代码来确认消息。不成功的响应指示应重新发送该消息。

我的问题是:如果未成功答复,则将立即重新发送邮件,或者Pub / Sub是否会遵守确认期限以重新发送邮件?

更新:

我认为这个问题没有道理,我将解释原因。

由于您无法访问Pub / Sub函数中的Response对象,因此无法直接发送响应代码(我对此不太确定,如果我错了,请更正我)。

因此,无法成功响应只能由以下原因引起:

  • 超时,它基于确认期限,因此在这种情况下,确认期限显然将受到尊重。
  • An error in the Cloud Function,正如Andrei Cusnir所说,默认情况下,Pub / Sub甚至不会重试,因此,关注确认截止时间毫无意义。
  • 最佳答案

    在调查Google Cloud Functions行为时,我发现,如果Cloud Function失败并返回错误消息,它将不会重试该操作。我创建了一个Cloud Function,该事件将由Pub / Sub事件触发,然后返回一条错误消息。该消息已记录在Stackdriver日志页面中,然后也记录了该错误,但该函数从未重新发送该消息,因此也从未重新触发过。此后,在实际读取Pub / Sub消息之前,我还尝试了使用错误代码进行响应,但它仍然在日志中失败,但是从不重新发送该消息以再次实际重试其操作。
    这是Google Cloud Function保护自己免受无限循环运行的预期行为。如果基于发布/订阅主题事件的云功能触发失败,则很可能在重试期间再次失败。因此,如果它在将消息重新发送到主题的过程中一直保持调用状态,则它也将陷入循环中,从而产生计费费用。
    要使用Google Cloud Function的重试功能,您必须在部署时使用标志将其启用。有关更多信息,请参见Retrying Background Functions文档。根据您将在Google Cloud Function重试策略的配置中设置的内容,它将触发重试。
    但是,重试将立即进行,并且不会遵守确认期限。
    更新
    使用发布/订阅事件触发器创建Google Cloud Function时,将为所选主题创建订阅,如您在主题的详细信息页面(Google Cloud Platform > Pub/Sub > Topics > [TOPIC_NAME])中所见。订阅负责阅读在主题中发布的消息,并将ack发送回主题。一个主题可以有多个订阅,并且它将每个接收到的消息至少发送给每个订阅一次。如Subscriber overview文档中所述。
    在同一链接中,声明A message is considered outstanding once it has been sent out for delivery and before a subscriber acknowledges it.。也有人说The subscriber has a configurable, limited amount of time -- known as the ackDeadline -- to acknowledge the outstanding message.。要进一步详细说明该系统的工作方式,请想象有一个TopicA,然后SubscriberA和SubscriberB订阅了该主题。现在,一条消息正在发送到TopicA,因此TopicA将消息转发到Subscriber-ASubscriber-B,并开始等待两个订户的确认。每个订户具有不同的ack响应时间,即ackDeadline。如果SubscirberA响应为ack,则TopicA将继续等待Subscriber-B。如果Subscriber-B在指定的时间内未发送确认,则Topic-A将仅将消息重新发送到Subscriber-B
    现在,您已经提到了文档的The endpoint acknowledges the message by returning an HTTP success status code. A non-success response indicates that the message should be resent.部分。这部分是在谈论订户的响应,而不是Google Cloud Function的响应。由于调用Google Cloud Function是由于在主题中发布了消息,因此从那时起,与该Cloud Function关联的订户将向该主题发送确认消息。之后,无论是Google Cloud Function还是无法处理该消息,它都不会以任何方式影响Pub / Sub主题,因为它只关心已传递的消息。
    在问题的更新部分中进一步详细说明两点:

  • 如果将执行Google Cloud Function,则意味着确认消息已发送回主题。想象一下,将一个订户的应答响应时间设置为10秒,而需要5分钟超时的Cloud Function。显然,当订户已过去10秒钟时,云功能将不再等待4分50秒。因此,这意味着该确认已经在调用Google Cloud Function时由订阅者发送。
  • 我在第一个响应中提到的错误是Google Cloud Function的错误。因此,如果您的Cloud Function无法处理收到的消息,则您将必须实现重试方法,该方法将重试特定的时间,然后将停止操作以避免循环。但是,该主题已被告知该消息已传递给订户,因此在开始执行Cloud Function时已经发送了确认。
  • 关于google-cloud-functions - 如果未成功响应,发布/订阅是否会立即重新发送消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56938025/

    相关文章:

    javascript - 如何在 Firebase 函数中处理字体等资源

    javascript - Firestore云函数: Getting "ReferenceError: firebase is not defined"

    node.js - Promise.all() 允许失败的替代方案?

    google-cloud-platform - 如何让 Google Cloud Functions 保持温暖?

    python-2.7 - 通过 GKE POD 内的 Cron 执行时,无法使用 Python SDK 将消息发布到 GCP Pub/Sub

    java - 是否可以在javascript中直接调用Pubsub的订阅拉取,而不是调用java方法来获取数据?

    android - flutter -用户打开推送通知消息(FCM)后如何执行任务

    javascript - 如何从 Firebase Cloud Function 在 Google Pub/Sub 中发布消息?

    Firebase:我可以在 Firebase 云函数中 "not acknowledge"发布一条 PubSub 消息吗?

    logging - kubernetes中的集中式应用程序日志记录