【问题标题】:Retry after rehydrating token with polly使用 polly 重新水化令牌后重试
【发布时间】:2019-01-16 10:50:10
【问题描述】:

我们正在使用最新的 Polly 来处理与三个 API 交互的重试和断路器策略。

基本流程是: A) 从产品目录 (API) 读取数据 B) 获取唯一商户令牌 (API) C) 更新商家目录(使用新商品)(API)

由于 Merchant Catalog API(第三方,尚无法解决此问题!)的负载,我们有时会被退回。 Polly 配置为在失败时很好地重试此操作,并且断路器模式样式后退。

我们意识到它一直被触发是因为我们的商家令牌被标记为无效,即使服务器吐出了虚拟对象 - 第三方标记了一个即使在错误时使用的令牌。

阅读this article,这是我们最初基于我们的解决方案的基础,我们正在考虑使用上下文重新加载/刷新身份验证令牌。但是,当该逻辑不在连接(启动)中而是在运行该策略的处理程序中时,我如何拥有一个刷新该令牌的策略,我有点困惑。

var authMerchTokenPolicy = Policy<HttpResponseMessage>  
  .HandleResult(r => r.StatusCode == 500)
  .RetryAsync(1, onRetryAsync: async (ex, i, context) => await RefreshMerchantAuthorization(context["httpClient"]));

上面的例子是不是说明我在启动类中实现了RefreshMerchantAuthorization?

我还没有看到一个具体的例子,这是造成混乱的地方 - 最初的开发者已经离开了,他写了这个(讽刺的是,他的名字叫 Paulie!)

【问题讨论】:

    标签: c# .net-core polly


    【解决方案1】:

    上面的例子是不是说明我在启动类中实现了RefreshMerchantAuthorization?

    Polly 的Context 类允许您携带任何自定义数据,具有类似Dictionary&lt;string, object&gt; 的语义。因此,您还可以通过 Context 将处理程序类传递给策略。

    对于RefreshMerchantAuthorization(...)FooHandler的实例方法,那么可以在StartUp中配置策略:

    var authMerchTokenPolicy = Policy<HttpResponseMessage>  
        .HandleResult(r => r.StatusCode == 500)
        .RetryAsync(1, onRetryAsync: async (ex, i, context) => 
            await ((FooHandler)context["handler"]).RefreshMerchantAuthorization(context["httpClient"]));
    

    FooHandler内的政策使用网站:

    var httpResponseMessage =  
        await authMerchTokenPolicy.ExecuteAsync(context => context["httpClient"].GetAsync(uri), 
        contextData: new Dictionary<string, object> {
            {"httpClient", httpClient},
            {"handler", this} 
        });
    

    这一切都假设RefreshMerchantAuthorization(...) 不是/不能成为static(如果static 可以直接从StartUp 类作为静态方法引用)。

    【讨论】:

    • 聪明,我认为这样通过它不会太安全,但我喜欢它。不过,我不确定耦合到启动类是否是个好主意?
    • +1。不必在StartUp 中声明政策;这是一些 Polly 用户喜欢(使用PolicyRegistry)重用策略的选项。正如你所说,它确实导致了这里的耦合。 Polly 中其他设计选择的结果是:策略被设计为不可变的,因此有关策略的所有内容都是有意一次性声明的。 OTOH,DI 将策略定义与使用分开。 OTOH 再次,这个用例想要在稍后实例化的类上使用实例方法。也许 .RefreshMerchantAuthorization()static 在独立类上的耦合度可能会降低?
    猜你喜欢
    • 2020-01-06
    • 2022-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-16
    • 2019-11-08
    相关资源
    最近更新 更多