将Polly库配置为仅在服务不可用时回退到缓存的值

问题描述 投票:0回答:1

我对波莉很陌生。我做了一些研究,但仍然无法确定是否/如何以一种优雅的方式使用Polly仅在请求失败时才使用chached值。示例:

服务A希望通过http从服务B获取数据。我一直想获取最新数据(几分钟的缓存策略就可以了)。但是,如果服务B关闭,只要该服务不可用,我希望能够使用缓存的数据。

仅使用Polly缓存似乎无法解决问题。但是,当仅在回退情况下使用高速缓存时,它不会被最新值填充,因为在发生故障之前会绕过最新值。你明白我的意思吗? THX

.net http caching fallback polly
1个回答
0
投票

[每当我们谈论弹性策略时,我们主要是指弹性模式的组合。换句话说,为了解决您的问题,您需要(以正确的顺序)束缚一些民警,以便能够解决它。 (在polly命名法中,它称为wrapping


首先让我们收集模式:

确定服务已关闭

我建议使用措词暂时不可用/无法到达,因为这意味着您要使用弹性策略来克服瞬态故障。因此,为了检测服务不可用,您可以使用Circuit Breaker。它的工作方式如下:该组件充当代理并检查请求的结果(如果有)。在预定数量的[[成功/后续失败之后,它将在给定时间段内阻止与下游系统的通信。该时间段过后,您可以尝试一下,看看新请求是成功还是失败。

在这里值得一提的是,只要代理阻止传出请求以满足

快速失败原理],Polly都会抛出BrokenCircuitException

缓存结果

[每当您要缓存出站请求的结果时,都应考虑以下事项:

    数据是否对时间敏感? (因此,不可以使用陈旧数据)
  • 如果它对时间敏感,那么是否有任何时间范围仍可以视为有效响应?
  • 数据是特定于消费者的吗? (因此,不能跨多个使用者使用相同的数据)
  • 通过查看这些问题,您可以决定是否使用缓存。

使用后备

这种简单的模式使您能够使用某些东西作为替代。因此,在您的情况下,只要服务器不可用,就回退到缓存。


现在让我们放在一起。

这里的顺序很重要,因为Polly使用

升级

来链接策略。当内部策略失败时,它将升级为外部策略。根据您的情况,顺序将是这样的(从外到内):

Fallback >>缓存>>断路器

当然,您甚至可以通过使用TimeoutRetry来增强它。在这种情况下,排序如下所示:

回退>>缓存>>重试>>断路器>>超时

    尝试在给定的时间范围内执行呼叫
  1. 仔细检查您的后续响应,并在出现瞬态故障时防止级联故障
  2. 重试通话n次,然后重试两次
  3. 如果成功,则将其缓存
  4. 如果失败,则使用先前缓存的值
  5. 有关PolicyWrap的更多详细信息,请阅读their wiki page
© www.soinside.com 2019 - 2024. All rights reserved.