如何使用消息排序部署 pubsub 触发的云功能?

Posted

技术标签:

【中文标题】如何使用消息排序部署 pubsub 触发的云功能?【英文标题】:How to deploy pubsub-triggered cloud function with message ordering? 【发布时间】:2021-04-17 21:32:54 【问题描述】:

我想部署一个具有消息排序的 Pubsub 触发的云函数: https://cloud.google.com/pubsub/docs/ordering

gcloud functions deploy 没有设置--enable-message-ordering 选项的选项: https://cloud.google.com/sdk/gcloud/reference/functions/deploy

我应该在部署函数之前预先创建订阅吗?如果是这样,Cloud Functions 是否具有与订阅名称匹配的众所周知的格式?格式似乎是:gcf-function-name-region-topic-name,但名称格式似乎也随着时间而改变,例如较旧的部署函数在订阅中没有区域名称。有没有稳定的方法来做到这一点?

【问题讨论】:

【参考方案1】:

在使用类似云函数声明 Pub/Sub 主题时:

exports.pubsub = functions.pubsub.topic('some-topic').onPublish((message, context) => 

问题在于消息排序仅适用于订阅,但不适用于主题。在部署时,推送订阅会自动创建在:cloudpubsub/subscription/list(以gcf-* 开头的那个)。这仅在手动订阅主题时才有效:Enabling message ordering。我还没有尝试过它是否会接收同名的订阅;如果一切都失败了,仍然可以记录消息,然后按时间戳或“序列令牌”排序:https://www.youtube.com/watch?v=nQ9_Xur2aM4。

【讨论】:

【参考方案2】:

您必须手动创建消息排序发布/订阅和云功能。

首先,创建一个 pub/sub 主题,然后创建一个订阅,使用--enable-message-ordering 订阅 pub/sub 主题

其次,创建一个云函数来提供有序的发布/订阅消息。

最后,回到发布/订阅订阅,编辑交付类型以推送并指定您的云功能端点。

所以最终的图表如下所示。

发布者 -> 发布/订阅主题 -> 发布/订阅订阅者 -> 云功能

您尝试直接将 Pub/sub 主题与 Cloud 功能建立连接。

但是对于消息排序,Pub/sub 需要主题 -> 订阅者连接。

所以只有发布/订阅主题 -> 发布/订阅订阅者 -> 云函数连接才能将有序消息传递给您的函数。

【讨论】:

您建议的方法将使用 http 触发函数,而我更希望它本身由 pubsub 触发。这样,我就不用担心身份验证配置了,函数可以直接接受消息数据,而不是实现一个快速请求处理程序。顺便说一句,总会有一个 pubsub 订阅者。只是 pubsub 触发的函数设置处理自动创建订阅。 遗憾的是,消息排序没有本地 pubsub 触发方式。您应该在带有 order 的 http-triggerd 方式和带有 unorder 的 pubsub-triggerd 方式之间进行选择。因为pubsub触发的Cloud功能只会触发bia pubsub topic。但是消息排序需要pubsub topic和pubsub订阅连接。 您在 Google 工作吗?你声称没有办法的依据是什么。例如为什么不能使用函数使用的定义好的订阅名称预先定义订阅然后部署函数? 如您所见,自动创建的推送订阅(gcf-function-name-region-topic-name) 的 URL 端点为 appspot.com。这是用于 Cloud函数的 pubsub 触发。您不能重复使用此订阅,因为它隐式使用 Appengine。当您删除此 pubsub 订阅以使用消息排序重新创建时,您无法再次指定此 URL 端点。总之,你不能重复使用自动创建的 pubsub 订阅,你也不需要这样做来达到你的目的

以上是关于如何使用消息排序部署 pubsub 触发的云功能?的主要内容,如果未能解决你的问题,请参考以下文章

使用 pubsub 推送触发器运行云功能

GCP - 验证 PubSub 推送的云功能 https 端点的所有权

如何从事件触发的云功能中检索 delivery_attempt?

云功能不向 PubSub 发送消息

我们如何在通过 EventARc 触发器创建的云发布订阅中启用排序?

无证约束?发布到主题 *from* pubsub 触发器