我必须设计一个系统,在那里必须命中API才能获得有关某些数据的元信息。我们有多个工人,他们从多个队列中接受工作。现在API的速率限制是每分钟500。
由于我们使用python,所以获得解释器锁并等待时间间隔将无法工作,因为这里的工作人员位于不同的机器上。
我必须确保在不同机器上运行的工作人员,在全球范围内不会耗尽API的速率限制。
很少有影响设计的因素是,这些数据是突然出现的,比如每次2万,000,000。多个工作人员可以选择处理每个数据突发且不应超过API速率限制的作业。
因此,在研究过程中,我发现最适用的解决方案是使用漏桶算法的实现。系统以恒定速率发出请求,而不考虑输入的突发。
这是不适用的,因为它是多个工人。
下面是我想出的一个解决方案:
它是漏桶算法的一个变体,它也使用分布式缓存锁。
通过这种方式,我们可以确保每次只有一个工作人员使用允许的速率访问API。
通过批处理这些项,还可以在一个查询中有效地将它们更新到数据。
考虑到这些因素,如何以尽可能健壮的方式实现上述系统?在所提出的解决方案中,可以改进什么?
发布于 2017-08-29 23:07:05
您应该采取的方法将取决于非api依赖工作的速度。
只需一个队列和一个工作人员。
使用单个工作人员发出api请求。一次处理一批,并存储结果。让多个工作人员处理非api限制的工作,并使用api工作者的结果。
如果将api请求拆分成批处理,则会减慢或阻止批处理的完成。您的策略应该优先考虑最重要的批次,并首先对它们进行研究。
让多个工作人员针对优先级批运行并存储所需的api请求。
让一个api工作者处理存储的api请求并完成。
您建议使用缓存服务器作为锁定方法是很困难的。如果批处理工作人员在没有释放锁的情况下崩溃,所有工作都将停止,直到缓存过期。
类似地,如果缓存过期或缓存服务器重新启动,则随机工作人员将启动并阻止部分完成的批处理。
更重要的是,你浪费了处理时间,让工人们坐在那里等着。当他们可以协助非api工作时。
如果非api工作是快速的,那么现有的队列解决方案已经提供了阻塞机制。
https://softwareengineering.stackexchange.com/questions/356484
复制相似问题