我可以访问一个API调用,接受每秒最大调用速率。如果超过速率,则会抛出异常。环绕速率限制API调用
我想把这个调用包装成一个抽象,这个抽象把通话费率保持在限制之下。它将像网络路由器一样工作:处理多个呼叫并将结果返回给关注呼叫率的正确呼叫者。目标是使呼叫代码尽可能不知道该限制。否则,具有此调用的代码中的每个部分都必须包装到try-catch中!
例如:想象一下,您可以从可以添加2个数字的extern API调用方法。这个API可以称为每秒5次。任何高于此的值都会导致异常。
为了说明问题,限制呼叫速率的外部服务就像是一个在回答这个问题
How to build a rate-limiting API with Observables?
附加信息:
既然你不每次从代码的任何部分调用此方法时都不需要担心该限制,因此您考虑设计一种可以调用的包装器方法,而不必担心速率限制。在内部你关心的限制,但在外面你公开一个简单的异步方法。
它类似于网络服务器。它如何将正确的结果包返回给正确的客户?
多个来电者会调用这个方法,他们会在他们来的时候得到结果。这种抽象应该像一个代理。
我该怎么办?
我敢肯定,包装方法的公司应该像
public async Task<Results> MyMethod()
而且里面的方法也将执行逻辑,也许使用无扩展(缓冲)。我不知道。
但是如何?我的意思是,对这个方法的多次调用应该将结果返回给正确的调用者。这甚至有可能吗?
非常感谢!
想到最简单的方法是使用FiFo('Queue')和某种异步我们实施处理呼叫。 – lokusking
当你有更多的来电比可以处理的时候,你有没有策略?即如果您在两天内获得1000次通话/分钟,您是否应该放弃一些消息?如果你只是填充一个无界缓冲区(可能会抛出OOM)?或者有一个固定大小的缓冲区,当它满的时候,会阻止对API的进一步调用? –
我认为在我的情况下,要长时间保持高通话率才能生成OOM是相当困难的,所以目前我会采取第一种策略。 – SuperJMN