我有一个Cloud Function订阅了发布/订阅主题。
根据https://github.com/mikeyhew/shopify_api_mixins,如果Cloud Function返回带有错误代码的状态,它将重新发送消息:
端点通过返回HTTP成功状态代码来确认消息。不成功的响应表明该消息应重新发送。
我的问题是:如果未成功答复,则消息将立即重新发送,或者Pub / Sub将遵守确认截止日期以重新发送消息?
答案 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-A
和Subscriber-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 :(得分:1)
Cloud Functions依靠Cloud Pub / Sub Push交付来触发执行。系统传递并发消息的速度持续加倍,直到传递失败或系统达到配额或资源限制为止。对于每个传递失败,到端点的并发请求数减半。
但是,Cloud Pub / Sub不会等到确认到期期限重新发送该消息(如果该消息被非正常状态明确拒绝)。相反,它将暂时回退推送消息。您可以预期,在多次传递失败之后,这种延迟大约为几秒钟。
您可以阅读有关配额和投放率here的更多信息。