相关疑难解决方法(0)

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

建筑学:

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

  • 主题T1由 cronjob 定期触发(例如每 5 分钟)。订阅S1是我们云功能的触发器。
  • 主题T2充当由我们的服务之一发布的后台作业的队列。云函数在每次执行时都会读取订阅S2,以便为排队的后台作业提供服务。

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

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

问题:

我们在使用google 的官方Node.js pubusb 客户端时遇到问题:

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

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

google的node.js pubsub客户端与google云功能不兼容吗?Google建议仅在客户端库不存在或不能满足其他需求时才访问服务 API。在云功能中运行客户端是否是“其他需求”,要求我们使用服务 API 编写自己的客户端?

尝试的解决方法:

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

2018 年 2 月 22 日更新

在我们的博客上写了一篇文章,详细描述了我们为什么 …

node.js google-cloud-pubsub google-cloud-functions

5
推荐指数
1
解决办法
1184
查看次数