如果响应不成功,Pub/Sub 是否会立即重新发送消息?

Hug*_*sos 4 google-cloud-pubsub google-cloud-functions

我有一个订阅了 Pub/Sub 主题的云函数。

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

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

我的问题是:如果响应不成功,消息将被立即重新发送还是 Pub/Sub 将遵守确认截止日期重新发送消息?

更新:

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

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

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

  1. 超时,这是基于确认截止日期,因此在这种情况下,确认截止日期显然将受到尊重。

  2. Cloud Function 中的一个错误,正如Andrei Cusnir所说,默认情况下 Pub/Sub 甚至不会重试,所以关心确认截止日期是没有意义的。

And*_*nir 6

在调查 Google Cloud Functions 行为时,我发现如果 Cloud Functions 失败并以错误消息响应,它将不会重试该操作。我创建了一个由 Pub/Sub 事件触发的云函数,然后以错误消息进行响应。该消息记录在 Stackdriver 日志记录页面中,然后也记录了错误,但该函数从未重新发送该消息,因此它从未被重新触发。在那之后,我还尝试在实际读取 Pub/Sub 消息之前使用错误代码进行响应,但它仍然在日志中失败,但从未重新发送消息以再次实际重试其操作。

这是 Google Cloud Function 保护自己免于在无限循环中运行的预期行为。如果基于 Pub/Sub 主题事件触发器的 Cloud Function 失败,它很可能会在重试期间再次失败。因此,如果它在向主题重新发送消息时一直调用自己,它也会陷入循环,产生计费成本。

要使用 Google Cloud Function 的重试功能,您必须在部署时使用标志启用它。有关更多信息,您可以在重试后台函数中查看文档中。根据您将在配置中为 Google Cloud Function 重试策略设置的内容,它将触发重试。

但是,重试将立即进行,并且不会遵守确认截止日期。

更新

使用 Pub/Sub 事件触发器创建 Google Cloud Function 时,会为所选主题创建订阅,您可以在主题的详细信息页面 ( Google Cloud Platform > Pub/Sub > Topics > [TOPIC_NAME]) 中看到这一点。订阅负责读取主题中发布的消息并将消息发送ack回主题。一个主题可以有多个订阅,并且它至少向每个订阅发送每条收到的消息一次。正如订阅者概述文档中所述。

在同一链接中,指出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在指定的时间内不会发送 ack,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 是由于在 Topic 中发布消息而被调用的,从那时起,与该 Cloud Function 关联的订阅者会将 ack 消息发送回该主题。在此之后,无论 Google Cloud Function 是否无法处理消息,它都不会以任何方式影响 Pub/Sub 主题,因为它只关心已经交付的消息。

要进一步详细说明问题更新部分中的两点:

  1. 如果将执行 Google Cloud Function,这意味着 ack 消息已经发送回主题。想象一下,将 10 秒设置为 ack 响应时间的订阅者和需要 5 分钟超时的云功能。显然,当订阅者的 10 秒已经过去时,它不会再等待 4 分 50 秒让 Cloud Function 超时。因此,这意味着一旦调用 Google Cloud Function,订阅者就已经发送了 ack。
  2. 我在第一个回复中提到的错误是 Google Cloud Function 的错误。因此,如果您的 Cloud Function 无法处理收到的消息,您将必须实现一个重试方法,该方法将重试特定次数,然后停止以避免循环。但是,主题已经被告知消息已交付给订阅者,因此在开始执行 Cloud Function 时已经发送了确认。