NodeJS 如何限制Google云发布/订阅队列的速率

rsl1atfo  于 2023-03-01  发布在  Node.js
关注(0)|答案(3)|浏览(137)

bounty将在6天后过期。此问题的答案可获得+400声望奖励。quickshiftin希望奖励现有答案:Akash的答案是最好的,我已经亲自验证过了。另外,由于评论中提到的原因,唯一一个奖金适中的答案是不受欢迎的。由于我不能接受Akash的答案,其他人可能会找到他们的方式来这个页面,我想奖励他,并吸引其他人来我认为是最好的答案。

我使用Google的发布/订阅队列来处理服务之间的消息,一些订阅者连接到限速API。
例如,我正在将街道地址推送到一个pub/sub主题上,我有一个云函数,它订阅(通过推)这个主题,并调用一个外部的限速地理编码服务。理想情况下,我的街道地址可以毫无延迟地推送到主题上,主题将保留这些消息--以限速的方式调用订阅者。
有没有办法配置这样的延迟或消息分发速率限制?增加Ack窗口实际上没有帮助:我设计这个系统是为了防止函数长时间运行。

zf2sa74q

zf2sa74q1#

因为到目前为止还没有解决方法,我现在要回答这个问题,说明目前没有办法做到这一点。有解决方法(请参阅问题的评论,解释如何使用云调度程序创建一个排队系统),但没有办法只是设置一个拉式订阅的设置,创建它和它的主题之间的速率限制。
我打开了一个功能请求,如果你喜欢这个功能,请在跟踪的问题上说出来。
https://issuetracker.google.com/issues/197906331

6jjcrrmo

6jjcrrmo2#

解决问题的方法是使用:async.queue
这里有一个并发属性,可以用来管理速率限制。

// create a queue object with concurrency 2
var q = async.queue(function(task, callback) {
    console.log('hello ' + task.name);
    callback();
}, 2);

// assign a callback
q.drain = function() {
    console.log('all items have been processed');
};

// add some items to the queue
q.push({name: 'foo'}, function(err) {
    console.log('finished processing foo');
});

// quoted from async documentation
vjrehmav

vjrehmav3#

GCP云任务队列允许您限制任务数量。检查此doc

相关问题