gpt4 book ai didi

c# - 回绕速率限制 API 调用

转载 作者:太空狗 更新时间:2023-10-30 00:38:46 25 4
gpt4 key购买 nike

我可以访问 每秒接受最大调用速率 的 API 调用。如果超过速率,则会引发异常

我想将此调用包装到一个抽象中,该抽象执行必要的操作以将调用率保持在限制范围内。它就像一个网络路由器:处理多个调用并将结果返回给关心调用率的正确调用者。目标是使调用代码尽可能不知道该限制。否则,代码中具有此调用的每个部分都必须包装到 try-catch 中!

例如:想象一下,您可以从可以添加 2 个数字的外部 API 调用一个方法。此 API 可以每秒调用 5 次。任何高于此值的值都会导致异常。

为了说明问题,限制调用率的外部服务就像这个问题的答案中的那个

How to build a rate-limiting API with Observables?

附加信息:

由于您不希望每次从代码的任何部分调用此方法时都担心该限制,因此您考虑设计一个包装器方法,您可以在调用时不必担心速率限制。在内部,您关心限制,但在外部,您公开了一个简单的异步方法。

它类似于网络服务器。它如何将正确的结果包返回给正确的客户?

多个调用者将调用此方法,并且他们将得到结果。这种抽象应该像代理一样。

我该怎么做?

我确定包装方法的公司应该是这样的

public async Task<Results> MyMethod()

在方法内部,它将执行逻辑,可能使用 Reactive Extensions (Buffer)。我不知道。

但是怎么办?我的意思是,多次调用此方法应该将结果返回给正确的调用者。这可能吗?

非常感谢!

最佳答案

有可用的速率限制库(请参阅 Esendex 的 TokenBucket GithubNuget)。

用法很简单,这个例子将轮询限制为每秒 1 次

// Create a token bucket with a capacity of 1 token that refills at a fixed interval of 1 token/sec.
ITokenBucket bucket = TokenBuckets.Construct()
.WithCapacity(1)
.WithFixedIntervalRefillStrategy(1, TimeSpan.FromSeconds(1))
.Build();

// ...

while (true)
{
// Consume a token from the token bucket. If a token is not available this method will block until
// the refill strategy adds one to the bucket.
bucket.Consume(1);

Poll();
}

我还需要为我的项目使其异步,我只是做了一个扩展方法:

public static class TokenBucketExtensions
{
public static Task ConsumeAsync(this ITokenBucket tokenBucket)
{
return Task.Factory.StartNew(tokenBucket.Consume);
}
}

使用它你不需要抛出/捕获异常并且编写一个包装器变得相当简单

关于c# - 回绕速率限制 API 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38675713/

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