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

时间:2019-07-08 15:19:31

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

我有一个Cloud Function订阅了发布/订阅主题。

根据https://github.com/mikeyhew/shopify_api_mixins,如果Cloud Function返回带有错误代码的状态,它将重新发送消息:

  

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

我的问题是:如果未成功答复,则消息将立即重新发送,或者Pub / Sub将遵守确认截止日期以重新发送消息?

2 个答案:

答案 0 :(得分:4)

在调查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,并开始等待两个订户的确认。每个订户具有不同的确认响应时间,即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主题,因为它只关心已传递的消息。

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

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

答案 1 :(得分:1)

Cloud Functions依靠Cloud Pub / Sub Push交付来触发执行。系统传递并发消息的速度持续加倍,直到传递失败或系统达到配额或资源限制为止。对于每个传递失败,到端点的并发请求数减半。

但是,

Cloud Pub / Sub不会等到确认到期期限重新发送该消息(如果该消息被非正常状态明确拒绝)。相反,它将暂时回退推送消息。您可以预期,在多次传递失败之后,这种延迟大约为几秒钟。

您可以阅读有关配额和投放率here的更多信息。

相关问题