【问题标题】:Can my policy behavior change based on data in the execute?我的策略行为可以根据执行中的数据而改变吗?
【发布时间】:2019-03-01 17:01:41
【问题描述】:

我正在使用断路器策略进行数据库访问。我有一个多租户结构,其中包含为不同客户端存储数据的相同数据库。我的应用程序可能会影响任何租户。如果一个数据库已关闭,则其他数据库可能不会。如果我打开断路器,我只想为那个租户打开它。

我为每个租户创建了相同的策略,并将它们存储在以租户名称作为键的字典中。在进行数据库调用时,我从字典中检索匹配策略并执行它。

我相当确定这可行,但我想知道它是否过于复杂。也许波莉已经作为一种方式来做到这一点。有没有办法将策略行为绑定到租户的数据值?

有什么建议吗?

【问题讨论】:

    标签: circuit-breaker polly


    【解决方案1】:

    问题中所述的设计符合要求:为每个要视为具有不同健康状态的下游系统维护一个单独的断路器策略实例

    Polly 不提供一个断路器,它为每个键维护一个庞大的内部健康状态字典。

    Polly 确实提供了PolicyRegistry;这基本上是一个类似于问题中描述的关键策略字典。


    如果需要在PolicyWrap 中使用断路器策略,并且是PolicyWrap 中唯一需要针对每个租户进行更改的内容,您可以使用'policy selector' within the 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);
        }
    }
    

    使用Func&lt;Context, IAsyncPolicy&lt;TResult&gt;&gt; policySelector 为您创建自定义AsyncPolicySelector&lt;TResult&gt; 策略,该策略可以选择以前的策略或重新(在需要时)制造策略。

    Polly Context has dictionary semantics 这样您就可以在执行之前在 Context 上设置租户 ID。

    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&lt;Context, IAsyncPolicy&lt;TResult&gt;&gt; policySelector 从您的字典中通过context["TenantId"]PolicyRegistry 检索断路器;或为该租户制造一个新的断路器(如果还没有的话)。

    【讨论】:

      猜你喜欢
      • 2019-08-19
      • 2020-02-04
      • 2014-11-10
      • 2022-11-23
      • 2012-05-06
      • 1970-01-01
      • 1970-01-01
      • 2020-03-12
      • 1970-01-01
      相关资源
      最近更新 更多