2016-11-14 90 views
2

我有一个关于如何减慢我的API请求的问题。对于我打的特定的第三方API,我允许每2秒发出3次请求。如果我翻过那个数字,我会返回status code 429以及以毫秒为单位的等待时间。速率限制请求和亚马逊SQS

这个API经常被调用,并且是我自己的服务器有传入请求的直接结果,这些请求不受速率限制。

因为我没有任何需要同步处理第三方API请求,所以我决定将工作卸载到AWS上的弹性beanstalk工作箱,默认情况下从Amazon SQS读取。

因此,如果状态码429从第三方api返回,我的工作人员会将SQS消息放回队列中。当等待时间到时,这不可避免地使api呼叫工作。然而,这似乎是一个不好的解决方案

有什么办法告诉守护程序在工人箱上留在队列中的消息分配的等待时间?或者我可以设置守护进程从队列中读取的速率?我正在寻找一种适当的方式(具体实现),以使用AWS上的工作者和队列来限制速率。十分感谢你的帮助!

编辑: 我会假设有一些配置可以在AWS上进行修改来完成我所要求的功能,但无论哪种方式我都在寻找我所描述的设置的特定解决方案。我不太清楚如何修改或控制弹性beanstalk worker框中的守护进程。

+0

击中第三方API的目的是什么?调用它的触发器是什么? –

+0

我正在使用第三方电子邮件营销服务来填充/更新客户的电子邮件营销帐户。我的产品中有很多触发器,主要用于实时更新和填充这些营销帐户。 – AIntel

回答

1

据我所知,你有一堆触发器来调用第三方服务,你需要限制你的API调用。

最好的方法是限制从SQS读取的守护进程。根据写入守护程序的语言,您应该能够轻松找到可以重用的速率限制器库。例如,Java和Python分别具有经过良好测试的库herehere

请记住,这些库将允许每个工作者每秒发出X个请求。如果你有一个守护进程在运行,X将会是1.5,用于你的用例。如果你有两个守护进程(例如,在两台不同的机器上各有一个守护进程),X应该是0.75

+0

这听起来正是我所需要的。但我不确定如何修改Amazon在node.js工作者实例上运行的守护进程。你能否提供一些关于在弹性beanstalk工作者上实现这一点的更多细节? – AIntel

+0

我认为这个问题已经在这里得到了充分的回答 - 你要求一个高层次的设计,我想你已经在这里了。我建议你提出另一个问题,详细介绍你当前的设置。 –

+0

我添加了一个编辑以尝试更清晰。我的确描述了我的设置,而你的回答大多只是我最初发布的可能解决方案的重述。我的问题是如何实现这一点。感谢您的帮助! – AIntel

1

听起来你从SQS队列中获取消息,并且在处理该消息的同时,发现你将无法现在完成处理,并且您希望在未来的某个已知时间之后放弃重试。

如果是这样,那么你可能想看看changing the message visibility时间。

当您从队列中读取消息时,它不会自动删除。相反,如果您未在可见性超时范围内删除该消息,它将自动再次交付。这个想法是确保所有消息都被重试直到它们被删除,但是在消费者有机会处理和删除消息之前不会重试。该队列具有默认的可见性超时,您可以基于每个消息进行覆盖。

请注意,这种方法只会使您不会在超时之前从队列中收到特定消息。如果您的客户端进程继续尝试读取消息,则会在此期间收到其他消息。如果不同的消息有不同的速率限制,这可能是你想要的。但是,如果没有,您可能更愿意让客户端线程休眠,直到达到限速等待时间。关于如何让多个服务器上的多个线程停止工作,直到设定的时间点与AWS无关并且与您正在使用的语言高度相关的详细信息。如果你决定走这条路线,你可能应该问一个单独的问题。