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

标签 .net http caching fallback polly

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

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

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

最佳答案

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

首先让我们收集模式:

检测服务关闭

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

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

缓存结果

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

  • 这些数据是时间敏感的吗? (因此,不能使用陈旧数据)
  • 如果它对时间敏感,那么是否有任何时间框架仍然可以将其视为有效响应?
  • 该数据是特定于消费者的吗? (因此,不能在多个消费者之间使用相同的数据)

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

    使用回退

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

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

    排序在这里很重要,因为 Polly 使用 上报链式政策。当内部策略失败时,它会将其升级到外部策略。

    在您的情况下,订单将是这样的(从外到内):
    回退 >> 缓存 >> 断路器

    当然,您甚至可以通过使用 Timeout 来增强它。和 Retry以及。在这种情况下,排序将如下所示:
    回退 >> 缓存 >> 重试 >> 断路器 >> 超时
  • 尝试在给定的时间范围内执行调用
  • 仔细检查您的后续响应并防止发生 transient 故障时的级联故障
  • 重试调用 n 次并在重试之间等待
  • 如果成功则缓存它
  • 如果失败,则使用之前缓存的值

  • 有关 PolicyWrap 的更多详细信息,请阅读 their wiki page .

    关于.net - 配置 Polly 库以仅在服务不可用时回退到缓存值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60815903/

    相关文章:

    c# - C# Webclient.OpenRead 何时实际下载数据?

    c# - 获取依赖程序集?

    http - set-cookie header 未在 Edge 中设置 cookie

    ios - NSFilemanager 上传新文件,但 UIWebView 显示缓存版本

    c# - 在 C# 中完成方法指南和最佳实践

    c# - 客户端应用更新

    c# - 是否可以通过http将数据从客户端传输到服务器?

    python - Python 中的基本浏览器。从用户那里获取 URL

    asp.net-mvc - 如何将客户类对象数据存储到 Redis 缓存中?

    php - debug == 0 时如何手动刷新模型缓存?