【发布时间】:2018-07-15 09:26:02
【问题描述】:
架构:
我们有一个使用 2 个发布订阅主题/订阅对的架构:
- 主题
T1由cronjob 定期触发(例如每5 分钟一次)。订阅S1是我们云功能的触发器。 - 主题
T2用作我们的一项服务发布的后台作业的队列。订阅S2由云函数在每次执行时读取,以服务排队的后台作业。
这使我们能够控制后台作业的服务频率,而与它们何时添加到队列无关。
云函数(由S1 触发)通过pulling 读取来自S2 的消息。它决定哪些后台作业已准备就绪,并在成功为作业提供服务后,它会确认相关的消息。未准备好或失败的作业不会被确认以供以后提供服务。
问题:
我们在使用来自 google 的官方 node.js pubusb client 时遇到问题:
- 有时 ACK 的消息会重新出现(似乎是无限的)。我们验证了消息在 ACK 截止日期之前得到确认,并通过调查我们的日志确定我们正在致电
ack()。 - 有时在第一次执行后(重新部署函数后),后续执行永远不会收到新消息。我们可以通过验证堆栈驱动程序中未确认的消息计数或通过重新部署函数并查看消息得到服务来验证消息是否在订阅
S2中排队。
我们认为这是 google 的 node.js pubsub 客户端的问题。云功能文档明确指出not start background activities。但是,查看 node.js pubsub 客户端源代码,它显然使用超时在后台服务确认。
google的node.js pubsub客户端不兼容google cloud的功能吗?谷歌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 客户端与云功能不兼容的事实。
【问题讨论】:
-
我做了一个类似的GitHub issue here
标签: node.js google-cloud-functions google-cloud-pubsub