首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >全局速率限制从多台机器上的工作人员命中API?

全局速率限制从多台机器上的工作人员命中API?
EN

Software Engineering用户
提问于 2017-08-29 18:33:45
回答 1查看 343关注 0票数 1

我必须设计一个系统,在那里必须命中API才能获得有关某些数据的元信息。我们有多个工人,他们从多个队列中接受工作。现在API的速率限制是每分钟500。

由于我们使用python,所以获得解释器锁并等待时间间隔将无法工作,因为这里的工作人员位于不同的机器上。

我必须确保在不同机器上运行的工作人员,在全球范围内不会耗尽API的速率限制。

很少有影响设计的因素是,这些数据是突然出现的,比如每次2万,000,000。多个工作人员可以选择处理每个数据突发且不应超过API速率限制的作业。

研究完成:

因此,在研究过程中,我发现最适用的解决方案是使用漏桶算法的实现。系统以恒定速率发出请求,而不考虑输入的突发。

这是不适用的,因为它是多个工人。

提出的解决方案:

下面是我想出的一个解决方案:

它是漏桶算法的一个变体,它也使用分布式缓存锁。

  1. 一个输入突发出现了
  2. 工人选择数据(比如20,000项)
  3. 通过在缓存服务器中设置缓存密钥来获取锁。
  4. 在这20,000项上执行漏桶算法,方法是在限制范围内以恒定速率命中API。
  5. 完成后,释放缓存密钥锁。
  6. 如果另一个突发出现,而前一个突发正在处理,并由另一个工作人员选择。
  7. 它检查是否已获得分布式缓存锁,从而在5分钟的回退时间内将其添加回队列。

通过这种方式,我们可以确保每次只有一个工作人员使用允许的速率访问API。

通过批处理这些项,还可以在一个查询中有效地将它们更新到数据。

考虑到这些因素,如何以尽可能健壮的方式实现上述系统?在所提出的解决方案中,可以改进什么?

EN

回答 1

Software Engineering用户

发布于 2017-08-29 23:07:05

您应该采取的方法将取决于非api依赖工作的速度。

  • 如果工作人员正在等待api。在利率限制间隔结束之前完成其他工作。

只需一个队列和一个工作人员。

  • 如果工作人员花费的时间超过api间隔,则处理项。但是api请求在工作之前就知道了。

使用单个工作人员发出api请求。一次处理一批,并存储结果。让多个工作人员处理非api限制的工作,并使用api工作者的结果。

如果将api请求拆分成批处理,则会减慢或阻止批处理的完成。您的策略应该优先考虑最重要的批次,并首先对它们进行研究。

  • 如果非apu的工作很慢,但是直到工作完成之后才知道api请求。

让多个工作人员针对优先级批运行并存储所需的api请求。

让一个api工作者处理存储的api请求并完成。

  • 解决方案中的缺陷

您建议使用缓存服务器作为锁定方法是很困难的。如果批处理工作人员在没有释放锁的情况下崩溃,所有工作都将停止,直到缓存过期。

类似地,如果缓存过期或缓存服务器重新启动,则随机工作人员将启动并阻止部分完成的批处理。

更重要的是,你浪费了处理时间,让工人们坐在那里等着。当他们可以协助非api工作时。

如果非api工作是快速的,那么现有的队列解决方案已经提供了阻塞机制。

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/356484

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档