我有一个Cloud Function订阅了Pub / Sub主题。
根据docs,如果Cloud Function返回不成功的响应,它将重新发送消息:
端点通过返回HTTP成功状态代码来确认消息。不成功的响应指示应重新发送该消息。
我的问题是:如果未成功答复,则将立即重新发送邮件,或者Pub / Sub是否会遵守确认期限以重新发送邮件?
更新:
我认为这个问题没有道理,我将解释原因。
由于您无法访问Pub / Sub函数中的Response
对象,因此无法直接发送响应代码(我对此不太确定,如果我错了,请更正我)。
因此,无法成功响应只能由以下原因引起:
最佳答案
在调查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
,并开始等待两个订户的确认。每个订户具有不同的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-functions - 如果未成功响应,发布/订阅是否会立即重新发送消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56938025/