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

fef*_*ffe 5 .net fallback caching http polly

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

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

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

Pet*_*ala 2

每当我们谈论弹性策略时,我们主要指的是弹性模式的组合。换句话说,为了解决您的问题,您需要链接一些 Polly 策略(以正确的顺序)才能解决它。(在 Polly 术语中,它被称为“包裹”)


首先让我们收集模式:

检测到服务已关闭

我建议使用“暂时不可用/无法访问”这一措辞,因为这意味着您希望使用弹性策略来克服暂时性故障。因此,为了检测服务不可用,您可以使用断路器。它的工作方式如下:
该组件充当代理并检查请求的结果(如果有)。在发生预定次数的连续/后续故障后,它将在给定时间段内阻止与下游系统的通信。当该时间段过去后,您将可以尝试一下,看看新请求是否成功或失败。

这里值得一提的是,BrokenCircuitException每当代理阻止传出请求时,Polly 就会抛出 a ,以满足快速失败原则

缓存结果

每当您要缓存出站请求的结果时,您应该考虑以下问题:

  • 该数据对时间敏感吗?(因此,使用过时的数据不是一个选择)
  • 如果它对时间敏感,那么是否有任何时间范围仍然可以被视为有效响应?
  • 该数据是特定于消费者的吗?(因此,在多个消费者之间使用相同的数据不是一种选择)
  • ETC。

通过查看这些问题,您可以决定是否使用缓存。

使用回退

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


现在让我们把它们放在一起。

这里的顺序很重要,因为 Polly 使用升级来链接策略。当内部策略失败时,它会将其升级为外部策略。

在您的情况下,顺序如下(从外到内): 后备>>缓存>>断路器

当然,您甚至可以通过使用超时重试来增强这一点。在这种情况下,顺序将如下所示: 回退>>缓存>>重试>>断路器>>超时

  1. 尝试在给定的时间范围内执行调用
  2. 仔细检查您的后续响应并防止发生瞬态故障时发生级联故障
  3. 重试调用 n 次并在重试之间等待
  4. 如果成功则缓存
  5. 如果失败则使用之前缓存的值

有关 PolicyWrap 的更多详细信息,请阅读他们的 wiki 页面