【问题标题】:How to work with Cache-Control using WebRequest and WebResponse?如何使用 WebRequest 和 WebResponse 处理 Cache-Control?
【发布时间】:2017-06-09 22:13:58
【问题描述】:

想象一下微服务架构中的许多服务。服务 A 向服务 B 请求响应,服务 B 将 Cache-Control 标头设置为 public, max-age=78261

没有.NET 方式来处理请求的对象和某种“缓存”对象吗?

有人可能认为WebResponseHttpWebResponse 类中应该/应该有一个Cache 属性,与Cache-Control 标头接口。

真的需要解析Cache-Control字符串,找到值并手动实现对header的支持吗?

【问题讨论】:

    标签: c# .net asp.net-web-api microservices


    【解决方案1】:

    服务 B 表明它的数据可以缓存在任何地方,例如,如果您通过 CDN(边缘缓存)处理请求,则可以缓存在任何下游代理服务器上。然后,对服务 B 的后续请求将由边缘缓存完成,并且不会在源处执行代码来检索下一个请求的数据。

    这应该与服务 A 的关注点分开考虑,服务 A 可能希望在向服务 B 发出另一个请求之前将响应数据缓存一段时间。

    您想要最小化的是进程间通信(HTTP 调用,服务 A -> 服务 B)的成本以及所需的序列化/反序列化工作。

    这里的一个常见模式是通读缓存,其中服务 A 将在决定回调服务 B 之前检查来自操作的缓存响应(可能仍以边缘响应-缓存数据)

    服务 A 应该决定它的缓存策略,它将在基于实例的 MemoryCache 或共享缓存(例如 Redis)中缓存响应多长时间。服务 B 可能正在返回有关某些有用对象的数据,因为它是内容,以某种形式序列化 - 'A' 应该解散并缓存此响应。

    我会将这些服务的缓存要求分开,不要使用 max-age 值来决定在服务 A 中缓存响应的时间。这将引入服务之间的耦合 - 如果服务的设计者B 更改了 max-age 值,这将影响服务 A 的行为方式。

    相反,为服务 A 设置一个配置值,该值定义可以缓存来自服务 B 的响应的时间,使用它来设计您的读取缓存实现。在这段时间内将来自服务 B 的反序列化响应存储在缓存中

    注意 - 我引用了来自 http://jakeydocs.readthedocs.io/en/latest/performance/caching/response.htmlhttp://blog.ragozin.info/2011/10/grid-pattern-proactive-caching.html 的图像。

    【讨论】:

    • +1 以获得详细的答案,但我不确定它是否解决了这个问题。在您的回答中,您假设“客户端”将使用 foo 并且 Service A 是代理。然而,事实并非如此。 Service A 需要消耗Servie B 中的资源,而不会干扰或与任何客户端交互。客户端将消耗Service A 中的资源,但不知道Foo,而是使用与Foo 相关但类型不同的Bar。不受客户干扰的交流。我在问Service A 将如何与从Service B 检索到的对象一起使用 Cache-Control。
    • 我假设 Service-A 和 Service-B 之间直接进行 HTTP 通信,但强调 Web 代理将遵循您设置的 Cache 标头的方式。我还试图证明它们应该被视为独立的东西 - 来自服务 B 的 Cache-Control 标头仅应用于 HTTP 缓存的预期目的,而服务 A 不应使用该值,否则您将引入服务之间的耦合。我的建议是不要将 Cache-Control 标头用于 Service-A 中的缓存逻辑,让 Service-A 维护一个指示这一点的配置值 - 而不是 ServiceB
    • 好的,所以基本上你关于如何在服务到服务架构中使用缓存控制的答案是:不要! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 2012-06-17
    • 2022-11-17
    相关资源
    最近更新 更多