[英]google cloud pubsub node.js client not compatible with google cloud functions
我们有一个使用2个pubsub主题/订阅对的架构:
T1
由cronjob定期触发(例如每5分钟)。 订阅S1
是我们的云功能的触发器。 T2
用作由我们的某个服务发布的后台作业的队列。 在每次执行时由云功能读取订阅S2
以服务排队的后台作业。 这允许我们控制后台作业的服务频率,而不管它们何时被添加到队列中。
云功能(由S1
触发)通过拉动从S2
读取消息。 它决定哪些后台作业准备就绪,并在成功为作业提供服务后,确认相关消息。 未准备好或未通过的作业不会被确认以后再进行维修。
我们使用谷歌的官方node.js pubusb客户端有问题:
ack()
。 S2
中排队。 我们认为谷歌的node.js pubsub客户端存在问题。 云功能文档明确指出不启动后台活动 。 但是,查看node.js pubsub客户端源,它显然使用超时在后台提供确认。
谷歌的node.js pubsub客户端与谷歌云功能不兼容吗? Google 建议仅在客户端库不存在或不满足其他需求时才访问服务API 。 在云功能“其他需求”中运行客户端,要求我们使用服务API编写自己的客户端吗?
作为“解决方法”,我们尝试延迟执行云功能以允许node.js pubsub客户端中的任何“后台”进程完成,但这并不能始终如一地消除我们的问题。 似乎pubsub客户端不是云功能友好的,无法在云功能执行之间停止恢复。
我在我们的博客上写了一篇文章 ,详细描述了为什么我们以这种方式使用PubSub以及我们如何处理node.js pubsub客户端与云功能不兼容的事实。
你是如何触发你的功能的?
根据文档 ,如果您的函数正在使用pubsub消息,那么您应该使用pubsub触发器。 使用pubsub触发器时,不需要库。 只需在函数末尾调用callback()
,就可以正确确认pubsub消息。
对于您打算做的事情,我不认为您当前的架构是正确的选择。
我将使用cron任务将您的第一步移至Google App Engine,并将此任务简单地从T2
移至T1
,使该功能具有触发器S2
并处理该消息。
因此,您的工作将在T2
上发布,并且您将拥有一个GAE应用程序,其中包含由cron任务触发的请求订阅S2
,此应用程序将重新将该消息发布到T1
。 然后,您的功能将由订阅S1
到主题T1
触发,并将在消息中运行作业,避免导入pubsub库的额外处理,并按预期使用产品。
此外,我不确定您最初如何将作业发布到该主题,但任务队列是一个很好的GAE(与Alpha中的产品无关 )选项,用于速率限制任务。
仅用于此的GAE应用程序(设置1个最大实例)将在始终免费限制内 ,因此成本不会显着增加。
我遇到了同样的问题,我想更好地控制.ack()
。 从google查看nodejs库,可以选择重构ack()
以返回一个promise,这样函数就可以等待ack()
完成。
Subscriber.prototype.ack_ = function(message) {
var breakLease = this.breakLease_.bind(this, message);
this.histogram.add(Date.now() - message.received);
if (this.writeToStreams_ && this.isConnected_()) {
this.acknowledge_(message.ackId, message.connectionId).then(breakLease);
return;
}
this.inventory_.ack.push(message.ackId);
this.setFlushTimeout_().then(breakLease);
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.