Может ли поведение моей политики измениться в зависимости от данных в процессе выполнения?

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

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

Я совершенно уверен, что это работает, но мне интересно, слишком ли это запутано. Возможно, Полли уже как способ сделать это. Есть ли способ связать поведение политики со значением данных для арендатора?

Любой совет?


person Don Chambers    schedule 01.03.2019    source источник


Ответы (1)


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

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

Polly предлагает PolicyRegistry; по сути, это словарь ключевой политики, аналогичный описанному в вопросе.


Если политика прерывателя цепи требуется для использования в середине политики, и это единственная вещь в политике, которая должна варьироваться для каждого арендатора, вы можете использовать 'селектор политик' внутри PolicyWrap для выбора или создания подходящей политики во время выполнения.

Пример кода по ссылке выше:

public class AsyncPolicySelector<TResult> : AsyncPolicy<TResult>
{
    private readonly Func<Context, IAsyncPolicy<TResult>> policySelector;

    public static AsyncPolicySelector<TResult> Create(Func<Context, IAsyncPolicy<TResult>> policySelector)
    {
        return new AsyncPolicySelector<TResult>(policySelector);
    }

    private AsyncPolicySelector(Func<Context, IAsyncPolicy<TResult>> policySelector)
    {
        this.policySelector = policySelector;
    }

    protected override Task<TResult> ImplementationAsync(Func<Context, CancellationToken, Task<TResult>> action, Context context, CancellationToken cancellationToken, bool continueOnCapturedContext)
    {
        return policySelector(context).ExecuteAsync(action, context, cancellationToken, continueOnCapturedContext);
    }
}

создает пользовательскую AsyncPolicySelector<TResult> политику, используя Func<Context, IAsyncPolicy<TResult>> policySelector, которая может выбрать предыдущую или создать новую (при необходимости) политику.

Polly Context имеет словарную семантику чтобы вы могли установить идентификатор арендатора на Context перед выполнением.

Context context = new Context();
context["TenantId"] = /* tenant id from somewhere */

// (you must execute through the PolicyWrap then with an overload passing in this context)

И используйте Func<Context, IAsyncPolicy<TResult>> policySelector, чтобы получить автоматический выключатель с помощью context["TenantId"] из вашего словаря или PolicyRegistry; или изготовьте новый автоматический выключатель для этого арендатора, если его еще не было.

person mountain traveller    schedule 01.03.2019