Слишком раннее ограничение частоты опросов [дубликат] ⇐ C#
-
Anonymous
Слишком раннее ограничение частоты опросов [дубликат]
Я пытаюсь разобраться в политике ограничения скорости Polly.
публичный класс RateLimiter { частный только для чтения AsyncRateLimitPolicy _throttlingPolicy; частное действие только для чтения _rateLimitedAction; public RaceLimiter (int numberOfExecutions, TimeSpan perTimeSpan, ActionrateLimitedAction) { _throttlingPolicy = Policy.RateLimitAsync(numberOfExecutions, perTimeSpan); _rateLimitedAction = скоростьLimitedAction; } общедоступная асинхронная задача Task Throttle(Func func) { результат вар = ждут _throttlingPolicy.ExecuteAndCaptureAsync(func); if (result.Outcome == OutcomeType.Failure) { var retryAfter = (result.FinalException as RateLimitRejectedException)?.RetryAfter ?? TimeSpan.FromSeconds(1); _rateLimitedAction($"Скорость ограничена. Следует повторить попытку через {retryAfter}."); вернуть значение по умолчанию; } вернуть результат.Результат; } } В моем консольном приложении я создаю экземпляр RateLimiter с частотой до 5 вызовов в 10 секунд.
varrateLimiter = new RateLimiter(5, TimeSpan.FromSeconds(10), err => Console.WriteLine(err)); вар rdm = новый Random(); пока (правда) { var result = awaitrateLimiter.Throttle(() => Task.FromResult(rdm.Next(1, 10))); if (результат != по умолчанию) Console.WriteLine($"Result: {result}"); ждать Task.Delay(200); } Я ожидаю увидеть 5 результатов и буду ограничен по ставке на 6-м. Но вот что я получаю
Результат: 9 Ставка ограничена. Следует повторить попытку через 00:00:01.7744615. Ставка ограничена. Следует повторить попытку через 00:00:01.5119933. Ставка ограничена. Следует повторить попытку через 00:00:01.2313921. Ставка ограничена. Следует повторить попытку через 00:00:00.9797322. Ставка ограничена. Следует повторить попытку через 00:00:00.7309150. Ставка ограничена. Следует повторить попытку через 00:00:00.4812646. Ставка ограничена. Следует повторить попытку через 00:00:00.2313643. Результат: 7 Ставка ограничена. Следует повторить попытку через 00:00:01.7982864. Ставка ограничена. Следует повторить попытку через 00:00:01.5327321. Ставка ограничена. Следует повторить попытку через 00:00:01.2517093. Ставка ограничена. Следует повторить попытку через 00:00:00.9843077. Ставка ограничена. Следует повторить попытку через 00:00:00.7203371. Ставка ограничена. Следует повторить попытку через 00:00:00.4700262. Ставка ограничена. Следует повторить попытку через 00:00:00.2205184. Я также пытался использовать ExecuteAsync вместо ExecuteAndCaptureAsync, но результаты не изменились.
public async Task Throttle(Func func) { пытаться { результат вар = ждут _throttlingPolicy.ExecuteAsync(func); вернуть результат; } улов (RateLimitRejectedException ex) { _rateLimitedAction($"Скорость ограничена. Следует повторить попытку через {ex.RetryAfter}."); вернуть значение по умолчанию; } } Для меня это не имеет никакого смысла. Я что-то упускаю?
Я пытаюсь разобраться в политике ограничения скорости Polly.
публичный класс RateLimiter { частный только для чтения AsyncRateLimitPolicy _throttlingPolicy; частное действие только для чтения _rateLimitedAction; public RaceLimiter (int numberOfExecutions, TimeSpan perTimeSpan, ActionrateLimitedAction) { _throttlingPolicy = Policy.RateLimitAsync(numberOfExecutions, perTimeSpan); _rateLimitedAction = скоростьLimitedAction; } общедоступная асинхронная задача Task Throttle(Func func) { результат вар = ждут _throttlingPolicy.ExecuteAndCaptureAsync(func); if (result.Outcome == OutcomeType.Failure) { var retryAfter = (result.FinalException as RateLimitRejectedException)?.RetryAfter ?? TimeSpan.FromSeconds(1); _rateLimitedAction($"Скорость ограничена. Следует повторить попытку через {retryAfter}."); вернуть значение по умолчанию; } вернуть результат.Результат; } } В моем консольном приложении я создаю экземпляр RateLimiter с частотой до 5 вызовов в 10 секунд.
varrateLimiter = new RateLimiter(5, TimeSpan.FromSeconds(10), err => Console.WriteLine(err)); вар rdm = новый Random(); пока (правда) { var result = awaitrateLimiter.Throttle(() => Task.FromResult(rdm.Next(1, 10))); if (результат != по умолчанию) Console.WriteLine($"Result: {result}"); ждать Task.Delay(200); } Я ожидаю увидеть 5 результатов и буду ограничен по ставке на 6-м. Но вот что я получаю
Результат: 9 Ставка ограничена. Следует повторить попытку через 00:00:01.7744615. Ставка ограничена. Следует повторить попытку через 00:00:01.5119933. Ставка ограничена. Следует повторить попытку через 00:00:01.2313921. Ставка ограничена. Следует повторить попытку через 00:00:00.9797322. Ставка ограничена. Следует повторить попытку через 00:00:00.7309150. Ставка ограничена. Следует повторить попытку через 00:00:00.4812646. Ставка ограничена. Следует повторить попытку через 00:00:00.2313643. Результат: 7 Ставка ограничена. Следует повторить попытку через 00:00:01.7982864. Ставка ограничена. Следует повторить попытку через 00:00:01.5327321. Ставка ограничена. Следует повторить попытку через 00:00:01.2517093. Ставка ограничена. Следует повторить попытку через 00:00:00.9843077. Ставка ограничена. Следует повторить попытку через 00:00:00.7203371. Ставка ограничена. Следует повторить попытку через 00:00:00.4700262. Ставка ограничена. Следует повторить попытку через 00:00:00.2205184. Я также пытался использовать ExecuteAsync вместо ExecuteAndCaptureAsync, но результаты не изменились.
public async Task Throttle(Func func) { пытаться { результат вар = ждут _throttlingPolicy.ExecuteAsync(func); вернуть результат; } улов (RateLimitRejectedException ex) { _rateLimitedAction($"Скорость ограничена. Следует повторить попытку через {ex.RetryAfter}."); вернуть значение по умолчанию; } } Для меня это не имеет никакого смысла. Я что-то упускаю?
Мобильная версия