Google Cloud Functions 无法使用 Pub/Sub 死信主题
Posted
技术标签:
【中文标题】Google Cloud Functions 无法使用 Pub/Sub 死信主题【英文标题】:Google Cloud Functions can't use Pub/Sub dead-letter topic 【发布时间】:2020-08-31 16:38:55 【问题描述】:似乎 GCP 云函数在调用时总是 ACK Pubsub PUSH 消息,即使函数崩溃或失败。
这可以防止使用新的 Pub/Sub“死信”主题功能,该功能需要消息传递失败,然后才能将其转发到其他主题。 目前,消息永远不会失败。
有没有办法通过 Cloud Functions 使用“死信主题”或 pubsub 重新交付? 除了在函数本身上设置“重试”标志外,这并不能解决这个问题。
【问题讨论】:
你的意思是你有推送订阅?并且函数错误码是400、500或者crash的情况下为空? 是的@guillaumeblaquiere,云函数注册为推送订阅(谷歌在将函数触发器设置为pubsub主题时定义)。我相信错误代码是 500,但由于它是带有 pubsub 触发器的“背景”类型函数,因此错误没有定义并从函数本身返回,而是从谷歌调用包装器返回(与用户控制返回的 http 类型函数相反代码) 【参考方案1】:推送订阅意味着两件事:
在 --trigger-http 模式下创建你的函数 创建使用 Cloud Functions URL 的推送 PUSH 订阅。这里你已经创建了一个 --trigger-topic 模式的函数,它是一个后台函数。
你有here what you have to do for marking the function as failed。
如果您需要更多帮助,请分享您的代码
【讨论】:
使用 --trigger-topic 模式创建的背景函数仍然是 PUSH 订阅。查看 pubsub 主题,我们可以看到为该函数创建了一个订阅者。此外,为函数设置重试行为不是 pubsub 重新传输,并且不允许使用 pubsub“死信”主题。 你是对的 - 死信和重新传输适用于 HTTP 类型的函数。但它没有背景类型的功能。【参考方案2】:解决此问题的一种方法(直到 GCP 开始支持手动确认云功能)是重新排队到相同的主题,并在失败的情况下增加重试计数。您可以将重试计数存储在有效负载本身中,例如:
"retry_count": 1,
"data": ...
另外,为了避免错误消息被永久重试,您可以将其配置为在重试尝试 > x 时推送到死信。
这只有在 Topi 只有一个订阅者的情况下才能解决问题。
【讨论】:
当以这种方式实现时,还可以保持消息中的原始数据完整,但仍然可以使用属性添加 retry_count - cloud.google.com/pubsub/docs/publisher#using_attributes以上是关于Google Cloud Functions 无法使用 Pub/Sub 死信主题的主要内容,如果未能解决你的问题,请参考以下文章