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 死信主题的主要内容,如果未能解决你的问题,请参考以下文章
使用TensorFlow作为依赖项部署Google Cloud Functions
Spark 计划中 Firebase Cloud Functions 的“Google 拥有的服务”的定义
Google Cloud Functions 在没有错误消息的情况下崩溃
如何使用 Google Python Client for Cloud Functions 获取 Google Cloud Functions 列表?
Cloud Functions for Firebase:无法访问 BigQuery
Google Cloud Functions - 客户端调用错误(Android Studio):FirebaseFunctionsException:响应不是有效的 JSON 对象