REST:什么是好的超媒体和资源缓存策略



如果我有一个rest式服务,该服务通过端点具有可发现的资源,例如:

请求:

GET http://acme.org/someInfo

反应:

HTTP/1.1 200 OK
Content-Length: ...
Content-Type: application/vnd.acme+xml
Date: Fri, 16 Dec 2012 12:40:00 GMT
Last-Modified: Tue, 1 Mar 2012 11:45:00 GMT
<someInfo xmlns="http://schemas.acme.org/someInfo" xmlns:dap="http://schemas.acme.org/dap">
    <dap:link rel="http://relations.acme.org/someInfo" uri="htp://acme.org/someInfo/foo" />
    <dap:link rel="http://relations.acme.org/someInfo" uri="htp://acme.org/someInfo/bar" />
    <dap:link rel="http://relations.acme.org/someInfo" uri="htp://acme.org/someInfo/baz" />
</someInfo>

然后有了这个响应,客户端可以遵循其中一个超媒体链接:

请求:

GET http://acme.org/someInfo/foo

反应:

HTTP/1.1 200 OK
Content-Length: ...
Content-Type: application/vnd.acme+xml
Date: Fri, 16 Dec 2012 12:45:00 GMT
Last-Modified: Wed, 28 Sep 2012 11:45:00 GMT
<fooInfo xmlns="http://schemas.acme.org/fooInfo">
...
</fooInfo>

第一个反应可能变化不频繁(例如:许多个月),第二个反应可能变化更频繁(例如:每个月左右)。对于这种场景,好的HTTP缓存策略是什么?按日期,客户端ETag比较,还有什么?

EDIT:如果数据在一天左右的时间内是陈旧的,那没关系。

这是一个性能与一致性的问题,实际上只能由业务来解决。

对于每个资源,你需要问两个问题:

  1. 如果资源发生变化,用户没有看到X的变化小时,业务影响是什么?如果用户看不到温度的变化,反应堆会爆炸吗?
  2. 看一看要花多少钱该资源的新版本?你使用的是1Gbps的本地网络吗?或者在西伯利亚用手机访问它?
一旦你知道了数据的价值和获取这些数据的成本,你就可以决定最好的缓存策略。

最新更新