Start Debugging

polly

5 статей

Polly 8.8.1: circuit breaker больше не удерживает значения AsyncLocal первого вызывающего

Polly.Core 8.8.1 запускает фоновый цикл circuit breaker под ExecutionContext.SuppressFlow, поэтому долгоживущий пайплайн больше не удерживает значения AsyncLocal того, кто его построил. Воспроизведение в 15 строк показывает утечку в 8.8.0 и исправление в 8.8.1.

Исправление: собственный DelegatingHandler не запускается повторно при каждом retry с AddStandardResilienceHandler

DelegatingHandler, зарегистрированный до AddStandardResilienceHandler, выполняется один раз на логический запрос, а не на каждую повторную попытку. Перенесите его после обработчика устойчивости и сделайте идемпотентным, потому что retry повторно отправляет тот же HttpRequestMessage. Проверено на Microsoft.Extensions.Http.Resilience 10.10.0 и 8.10.0.

Polly 8.8 перезагружает resilience-конвейер из вашего собственного IOptionsMonitor

В Polly 8.8.0 появился EnableReloadsWithMonitor, и resilience-конвейер теперь может перезагружаться на лету из feature flag или монитора удалённой конфигурации, не зарегистрированного в DI. Тестовый прогон показывает пересборку, а заодно одну ловушку: context.GetOptions по-прежнему читает монитор из DI и возвращает значения по умолчанию.

Как переопределить обработчик отказоустойчивости, который регистрирует Aspire

AddServiceDefaults в Aspire применяет стандартный обработчик отказоустойчивости к каждому HttpClient. Повторный вызов AddStandardResilienceHandler не заменяет его, а добавляет второй обработчик поверх первого. Здесь разобраны три реальных способа переопределения, недокументированное имя настроек -standard и бесконечный тайм-аут, который вы получаете, если просто удалить обработчик.

Polly против resilience handlers в .NET 11: что выбрать?

Используйте resilience handler из Microsoft.Extensions.Http.Resilience для вызовов через HttpClient, потому что это Polly с понимающими HTTP значениями по умолчанию и телеметрией в одну строку. Обращайтесь к ResiliencePipeline из Polly напрямую только тогда, когда защищаете нечто, не являющееся HttpClient.