Может ли поведение моей политики измениться в зависимости от данных при выполнении? - PullRequest
0 голосов
/ 01 марта 2019

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

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

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

Любой совет?

1 Ответ

0 голосов
/ 01 марта 2019

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

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

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


Если требуется использование политики автоматического выключателя в середине PolicyWrap, и это единственная вещь в PolicyWrap, которая должнав зависимости от арендатора, вы можете использовать «селектор политики» в 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;или изготовить новый автоматический выключатель для этого арендатора, если его еще не было.

...