我对波利很陌生。我做了一些研究,但仍然无法确定是否/如何仅在请求失败时以优雅的方式使用 Polly 来使用 chached 值。例子:
服务 A 想通过 http 从服务 B 获取数据。我总是想获取最新的数据(几分钟的缓存策略就可以了)。但是,如果服务 B 关闭,只要服务不可用,我就希望能够使用缓存的数据。
仅使用 Polly 缓存似乎并不能解决问题。但是当仅在回退情况下使用缓存时,它不会填充最新的值,因为它在失败发生之前被绕过。你明白我的意思吗?谢谢
最佳答案
每当我们谈论弹性策略时,我们主要指的是弹性模式的组合。换句话说,为了解决您的问题,您需要链接一些polly 策略(以正确的顺序)才能解决它。 (在波利命名法中,它被称为包装)
首先让我们收集模式:
检测服务关闭
我建议使用临时不可用/无法访问的措辞,因为这意味着您想使用弹性策略来克服 瞬时故障 .因此,为了检测服务不可用,您可以使用 Circuit Breaker .它的工作方式如下:
该组件充当代理并检查请求的结果(如果有)。在预定数量的连续/后续故障后,它将在给定的时间段内阻止与下游系统的通信。当该时间段过去后,它将允许您尝试一下,看看新请求是成功还是失败。
这里值得一提的是,Polly 会抛出一个 BrokenCircuitException
每当代理阻止传出请求以满足快速失败原则时。
缓存结果
每当您要缓存出站请求的结果时,您都应该考虑以下问题:
通过查看这些问题,您可以决定是否使用缓存。
使用回退
这个简单的模式使您能够使用某些东西作为替代品。因此,在您的情况下,只要服务器不可用,就回退到缓存。
现在让我们把它们放在一起。
排序在这里很重要,因为 Polly 使用 上报链式政策。当内部策略失败时,它会将其升级到外部策略。
在您的情况下,订单将是这样的(从外到内):
回退 >> 缓存 >> 断路器
当然,您甚至可以通过使用 Timeout 来增强它。和 Retry以及。在这种情况下,排序将如下所示:
回退 >> 缓存 >> 重试 >> 断路器 >> 超时
有关 PolicyWrap 的更多详细信息,请阅读 their wiki page .
关于.net - 配置 Polly 库以仅在服务不可用时回退到缓存值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60815903/