gpt4 book ai didi

Laravel 多个 worker 并且速率受限

转载 作者:行者123 更新时间:2023-12-01 13:12:20 25 4
gpt4 key购买 nike

我有一个应用程序,它有一个包含多个工作人员的队列。工作人员根据队列中的作业数量进行缩放。工作人员正在处理的工作的要点之一是对外部服务进行 API 调用以检索一些数据。外部服务使用漏桶算法 ( https://en.wikipedia.org/wiki/Leaky_bucket ) 以每秒 2 次调用的速率实现 api 速率限制。我的 api 调用不是针对单个服务,而是针对该服务的帐户。因此,仅当我对服务帐户进行多次 api 调用时,速率限制才适用。不同帐户之间不共享速率限制。进行 api 调用的作业数以千计(仅针对一个帐户),因此存储桶总是满的,我将开始受到速率限制。

这样的问题是,如果我的工作在我达到它之前没有遵守速率限制,我可能会尝试延迟它们并在发生这种情况时将它们放回队列中,但因为我有多个工作人员和数千个我可能会陷入速率限制的无限循环中。

我考虑过使用诸如 memcache 或 redis 之类的东西来存储某种可以在工作人员之间共享的信息,这样在我尝试在工作中进行 api 调用之前,我会停止、延迟工作并将其放置回到队列中,这样它就不会提高速率限制。这种方法的问题是,每次我做类似的事情时,我都会增加工作的尝试次数。我对每项工作的尝试次数有上限。我还意识到,尝试次数不能以任何方式改变 Laravel worker,我对此很好,我相信这会使 worker 更加稳定和可预测。重置尝试次数的唯一选择是删除作业并将其重新分配为新作业(但这感觉非常困惑)。

如果有人遇到过这样的问题,您是否愿意分享在这种情况下队列实现的样子?工作人员是否应该在他们之间共享状态(这感觉不对)?

注意:我不认为让工作人员休眠是解决速率限制的好方法,因为我可能正在对服务的不同帐户进行 api 调用(基于队列中的下一个作业) ) 因此,如果工作人员为一个帐户 sleep 而它可以为另一个帐户服务,这会让人感觉浪费了时间。

谢谢

最佳答案

听起来您正在使用 Shopify API?

我设法在 Laravel 5.5 中使用它来让它工作。来自文档:

Redis::throttle('key')->allow(2)->every(1)->then(function () {
// Job logic...
}, function () {
// Could not obtain lock...

return $this->release(10);
});

https://laravel.com/docs/5.5/queues#rate-limiting

关于Laravel 多个 worker 并且速率受限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43691365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com