将 Polly 库配置为仅在服务不可用时回退到缓存值
Configuring Polly library to fallback to cached values only if service is not available
我对 Polly 很陌生。我做了一些研究,但仍然找不到 if/how 只有在请求失败时才能以一种优雅的方式使用 Polly 来使用 chached 值。示例:
服务A想通过http从服务B获取数据。我总是想获取最新的数据(几分钟的缓存策略就可以了)。但是,如果服务 B 已关闭,只要服务不可用,我希望能够使用缓存的数据。
仅仅使用 Polly 缓存似乎并不能解决问题。但是当仅在回退情况下使用缓存时,它不会填充最新值,因为它在故障发生之前被绕过。你明白我的意思吗?谢谢
每当我们谈论弹性策略时,我们主要指的是弹性模式的组合。换句话说,为了解决您的问题,您需要链接一些 polly 策略(以正确的顺序)才能解决它。 (在 polly 命名法中,它被称为 wrapping)
首先让我们收集图案:
检测到服务已关闭
我建议使用 暂时不可用/无法访问 的措辞,因为这意味着您希望使用弹性策略来克服 暂时性故障.因此,为了检测服务不可用,您可以使用 Circuit Breaker。它以下列方式工作:
该组件充当代理并检查请求的结果(如果有)。在预定数量的 连续/后续失败 之后,它将在给定的时间段内阻止与下游系统的通信。当那个时间段过去时,它会让你试一试,看看新请求是成功还是失败。
这里值得一提的是,只要代理阻止传出请求,Polly 就会抛出 BrokenCircuitException
以满足 快速失败原则 。
缓存结果
每当您要缓存出站请求的结果时,您应该考虑以下问题:
- 该数据对时间敏感吗? (因此,使用陈旧数据不是一种选择)
- 如果它对时间敏感,那么是否有任何时间范围仍可将其视为有效响应?
- 该数据是特定于消费者的吗? (因此,在多个消费者之间使用相同的数据不是一种选择)
- 等等
通过查看这些问题,您可以决定是否使用缓存。
使用回退
这个简单的模式使您能够使用某些东西作为替代品。因此,在您的情况下,只要服务器不可用,就会回退到缓存。
现在让我们把它们放在一起。
这里的排序很重要,因为 Polly 使用 升级 来链接策略。当内部策略失败时,它将升级到外部策略。
在你的情况下,顺序是这样的(从外到内):
回退>>缓存>>断路器
当然,您甚至可以使用 Timeout and Retry 来增强它。在这种情况下,排序将如下所示:
回退>>缓存>>重试>>断路器>>超时
- 尝试在给定的时间范围内执行调用
- 仔细检查您的后续响应并防止在瞬态故障的情况下发生级联故障
- 重试调用 n 次并在重试之间等待
- 如果成功则缓存它
- 如果失败则使用之前缓存的值
有关 PolicyWrap 的更多详细信息,请阅读 their wiki page。
我对 Polly 很陌生。我做了一些研究,但仍然找不到 if/how 只有在请求失败时才能以一种优雅的方式使用 Polly 来使用 chached 值。示例:
服务A想通过http从服务B获取数据。我总是想获取最新的数据(几分钟的缓存策略就可以了)。但是,如果服务 B 已关闭,只要服务不可用,我希望能够使用缓存的数据。
仅仅使用 Polly 缓存似乎并不能解决问题。但是当仅在回退情况下使用缓存时,它不会填充最新值,因为它在故障发生之前被绕过。你明白我的意思吗?谢谢
每当我们谈论弹性策略时,我们主要指的是弹性模式的组合。换句话说,为了解决您的问题,您需要链接一些 polly 策略(以正确的顺序)才能解决它。 (在 polly 命名法中,它被称为 wrapping)
首先让我们收集图案:
检测到服务已关闭
我建议使用 暂时不可用/无法访问 的措辞,因为这意味着您希望使用弹性策略来克服 暂时性故障.因此,为了检测服务不可用,您可以使用 Circuit Breaker。它以下列方式工作:
该组件充当代理并检查请求的结果(如果有)。在预定数量的 连续/后续失败 之后,它将在给定的时间段内阻止与下游系统的通信。当那个时间段过去时,它会让你试一试,看看新请求是成功还是失败。
这里值得一提的是,只要代理阻止传出请求,Polly 就会抛出 BrokenCircuitException
以满足 快速失败原则 。
缓存结果
每当您要缓存出站请求的结果时,您应该考虑以下问题:
- 该数据对时间敏感吗? (因此,使用陈旧数据不是一种选择)
- 如果它对时间敏感,那么是否有任何时间范围仍可将其视为有效响应?
- 该数据是特定于消费者的吗? (因此,在多个消费者之间使用相同的数据不是一种选择)
- 等等
通过查看这些问题,您可以决定是否使用缓存。
使用回退
这个简单的模式使您能够使用某些东西作为替代品。因此,在您的情况下,只要服务器不可用,就会回退到缓存。
现在让我们把它们放在一起。
这里的排序很重要,因为 Polly 使用 升级 来链接策略。当内部策略失败时,它将升级到外部策略。
在你的情况下,顺序是这样的(从外到内): 回退>>缓存>>断路器
当然,您甚至可以使用 Timeout and Retry 来增强它。在这种情况下,排序将如下所示: 回退>>缓存>>重试>>断路器>>超时
- 尝试在给定的时间范围内执行调用
- 仔细检查您的后续响应并防止在瞬态故障的情况下发生级联故障
- 重试调用 n 次并在重试之间等待
- 如果成功则缓存它
- 如果失败则使用之前缓存的值
有关 PolicyWrap 的更多详细信息,请阅读 their wiki page。