Полли: Переборка Полиси в сочетании с RetryPolicy - PullRequest
1 голос
/ 16 мая 2019

У меня есть C # API, который связывается с веб-сервисом, который выдает исключения, если он слишком занят.Я хочу ограничить количество параллельных вызовов для этой службы WCF.

Поскольку веб-служба быстро выдает исключения, когда она слишком занята, я хочу использовать Bulkhead в сочетании с повторной попыткой, и я явно хочу, чтобы Bulkhead применялся первым, чтобы ограничить число вызовов, ожидающих вПовторите политику.Документация PolicyWrap гласит, что обычно все должно быть наоборот, но в моем случае мне нужно вот так.

Однако это не работает.Я провожу тест производительности с 40 одновременными вызовами, и он продолжает повторять все 40 вызовов параллельно.

Это определение политики:

var retryPolicy = Policy.HandleResult<wcfResponse>(r => !r.IsSuccessStatus())
  .Or<TimeoutException>()
  .Or<CommunicationException>()
  .WaitAndRetryAsync(60, i => TimeSpan.FromSeconds(1),

// setting maxParallel to 1 and a large queue, 
// so I only expect one call to be retrying at the same time. 
// However, it is doing all 40 calls in parallel, 
// the bulkhead seems to be ignored and the retry policy 
// kicks in for all requests in parallel.

var bulkHeadPolicy = Policy.BulkheadAsync(1, 100);
return bulkHeadPolicy.WrapAsync(retryPolicy);

Что мне здесь не хватает?

1 Ответ

1 голос
/ 17 мая 2019

Я выяснил, в чем проблема.Я создал новую политику перегородки для каждого запроса, что неправильно.Я изменил его, чтобы создать его только один раз, и это работает.

Обнаружил после прочтения документацию еще раз, а именно:

Скопирование экземпляров переборок

Экземпляр BulkheadPolicy поддерживает внутреннее состояниечисло операций, выполняемых через переборку: вы должны повторно использовать один и тот же экземпляр BulkheadPolicy для каждого выполнения через сайт вызова, а не создавать новый экземпляр при каждом обходе кода.

...