gpt4 book ai didi

node.js - 谷歌云 pubsub node.js 客户端与谷歌云功能不兼容

转载 作者:搜寻专家 更新时间:2023-10-31 23:19:46 27 4
gpt4 key购买 nike

架构:

我们有一个使用 2 个 pubsub 主题/订阅对的架构:

  • 主题 T1 由 cronjob 定期触发(例如每 5 分钟一次)。订阅 S1 是我们云函数的触发器。
  • 主题 T2 用作由我们的一项服务发布的后台作业的队列。云函数在每次执行时读取订阅 S2 以服务排队的后台作业。

这使我们能够控制后台作业的服务频率,而不管它们何时被添加到队列中。

云函数(由S1 触发)通过pullingS2 读取消息.它决定哪些后台作业已就绪,并在成功为该作业提供服务后,确认相关消息。未准备好或失败的作业不会被确认以便稍后提供服务。

问题:

我们在使用官方 node.js pubusb client 时遇到问题来自谷歌:

  1. 有时 ACK'ed 消息会重新出现(似乎无限)。我们已验证消息在 ACK 截止日期之前已被确认,并通过调查我们的日志确定我们正在调用 ack()
  2. 有时在第一次执行后(重新部署函数后),后续执行永远不会收到新消息。我们可以验证消息在订阅 S2 中排队,方法是验证 stackdriver 中未确认的消息计数,或者重新部署函数并查看消息是否得到服务。

我们认为这是 google 的 node.js pubsub 客户端的问题。云功能文档明确指出 not start background activities .然而,查看 node.js pubsub 客户端源代码,它显然在后台使用超时服务确认。

google 的 node.js pubsub 客户端与 google 云功能不兼容吗?谷歌recommends accessing the service API's only when a client library does not exist or does not meet other needs .在云功能中运行客户端是否需要“其他需求”,要求我们使用服务 API 编写自己的客户端?

尝试解决方法:

作为一种“解决方法”,我们尝试延迟 cloudfunction 执行的结束,以允许 node.js pubsub 客户端中的任何“后台”进程完成,但这并没有始终如一地消除我们的问题。似乎 pubsub 客户端对云功能不友好,无法从云功能执行之间的停止中恢复。

2018 年 2 月 22 日更新

我写了an article on our blog详细描述了为什么我们以这种方式使用 PubSub,以及我们如何解决 node.js pubsub 客户端与云功能不兼容的事实。

最佳答案

你是如何触发你的功能的?

根据docs ,如果您的函数正在使用 pubsub 消息,那么您应该使用 pubsub 触发器。使用 pubsub 触发器时,不需要该库。只需在函数末尾调用 callback(),pubsub 消息就会得到正确确认。

对于您打算做的事情,我认为您当前的架构不是正确的选择。

我会使用 cron task 将您的第一步转移到 Google App Engine ,并使此任务简单地将消息从 T2 移动到 T1,使函数具有触发器 S2 并处理消息。

因此,您的作业将在 T2 上发布,并且您将拥有一个 GAE 应用程序,其中包含由 cron 任务触发的拉取订阅 S2,并且该应用程序将将消息重新发布到 T1。然后您的函数将由订阅 S1 主题 T1 触发,并在消息中运行作业,避免导入 pubsub 库的额外处理,并使用符合预期的产品。

此外,我不确定您最初是如何将您的工作发布到该主题的,但是Task Queues是用于限速任务的良好 GAE(和 product-agnostic in Alpha)选项。

仅用于此(设置 1 个最大实例)的 GAE 应用程序将在 always free limit 内,因此成本不会显着增加。

关于node.js - 谷歌云 pubsub node.js 客户端与谷歌云功能不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48623991/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com