Я взаимодействую со сторонним API, который возвращает порог лимита вызовов и сколько вызовов порога я использовал до сих пор. Я считаю, что каждую минуту это 60 звонков. Через 1 минуту он сбрасывается.
Я хотел бы отложить вызовы API по мере того, как я все больше и больше достигаю этого предела, что-то вроде экспоненциальной кривой, где кривая удваивает максимальный порог при максимальном пороге.
Таким образом, при 0 это 0 задержка. На 60 это будет 120-секундная задержка.
И если они изменят лимит звонков, я хочу иметь возможность ответить и снова настроить мой максимальный лимит до 2 * нового лимита с кривой экспоненциальной сортировки.
Какой алгоритм я могу использовать для этого? (Предпочтительно VB.NET, иначе C#)
Почему не Delay(timeRemaining/callsRemaining)
(в соответствующих единицах), чтобы оставшиеся вызовы распределялись равномерно?
@JohnWu, потому что большую часть времени я, скорее всего, не буду приближаться к порогу, и я не хочу без надобности дросселировать. Но в загруженные дни я все чаще обращаюсь к API, как и другие наши приложения, которые все вызывают один и тот же API. Мы также ведем переговоры с поставщиком о превышении нашего лимита.
В чем смысл? Разве вы не искусственно реализуете то, что дросселирование API делает?
Вы потенциально могли бы сделать что-то в этом роде, мы сделали это, чтобы не бомбардировать наш почтовый сервер, когда камера отключилась или произошла ошибка.
public static class Delay
{
public static double ByInterval(int maximum, int interval) => Math.Round((maximum / (Math.Pow(2, interval) - 1)), 0);
}
Так, например, если максимальная задержка должна быть сто двадцать, а нам нужен интервал в три, на выходе будет пятнадцать. Я тоже округляю до целого числа. Не уверен, что это то, что вы ищете, но мы связали это с приложением, поэтому мы храним электронные письма до тех пор, пока не будет достигнут наш порог. Мы использовали наши значения, чтобы, например, приравнять секунды к (10000000 * Delay.By(120, 3))
. Поскольку мы храним в первую очередь в виде клещей.
Это выглядит хорошо и, вероятно, сработает. Но я просто сэкономил на этом и вместо этого закодировал несколько множителей для нескольких конкретных диапазонов. Однако, спасибо!
@John Да, не виню тебя. Шансы столкнуться с этим невелики, так зачем переоптимизировать.
Sleeping for Math.Pow (x, y) -z даст вам экспоненциальную задержку, которая вам нужна, но мне нужно будет решить, какие значения вам нужны, чтобы соответствовать кривой, которую вы ищете ...