繁体   English   中英

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

[英]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客户端有问题:

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

我们认为谷歌的node.js pubsub客户端存在问题。 云功能文档明确指出不启动后台活动 但是,查看node.js pubsub客户端源,它显然使用超时在后台提供确认。

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

尝试的解决方法:

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

2018年2月22日更新

在我们的博客上了一篇文章 ,详细描述了为什么我们以这种方式使用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个最大实例)将在始终免费限制内 ,因此成本不会显着增加。

来自node.js pubsub客户端的开发人员确认使用客户端从云功能中提取消息不是受支持的用例。

另一种方法是使用服务API 但是,在尝试从订阅中提取所有消息时,REST API会有自己的注意事项

我遇到了同样的问题,我想更好地控制.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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM