2012-11-08 41 views
8

我有一个应用程序需要来自Service2的数据,它将永远返回给定请求的相同答案,除非其后备数据库已更新。数据库很少更新,我们每年说两次。如何正确设计一个restful API来使缓存失效?

我想设计一个解决方案,以便应用程序缓存Service2的答案,但要从外部提供一个功能,以使应用程序的缓存失效。我想从应用程序中暴露一个RESTful Web服务,但是我对如何正确设计它感到困惑。

/application/cache/invalidate是一个非REST式网址 - 我在考虑用HTTP POST调用/application/cache/。但是,在我看来,对于适当的RESTful设计,当POST用于更新资源时,要更新的内容应包含在请求的主体中。

什么是正确的方式来设计一个“InvalidateCache”宁静的web服务?

回答

6

考虑使用POST和网址DELETE代替:

/application/cache/ 

在REST,两者PUTDELETE被认为是indempotent行动。也就是说,它们可以用相同的最终资源状态重复多次。在这种情况下,您的缓存是资源,并且多个DELETE将导致相同的状态,一个清除的缓存。

您可以考虑在您的url中添加一个描述符,以阐明您正在清除缓存的内容,而不是删除缓存对象本身。像

/application/cache/contents 

也许,但这取决于你。如果有必要,去那条路线也可能让你有选择地从缓存中删除。

+0

优秀!在DELETE发布后,缓存是否自动重新生成,是否符合REST? – Edmondo1984

+0

是的,没有什么可以阻止另一位演员修改缓存。从另一个角度来看,比如说你在缓存中暴露了一堆PUT值,并且在DELETE之后立即发生了PUT。在该序列之后,缓存不会为空,但每个REST操作的结果都是有效的。 –

+0

我一直想知道的是如何正确支持需要实时数据的管理员门户,同时还支持面向客户的应该获取缓存数据的网站。 –

1

这可能不会直接回答你的问题,但你可能也想看看HTTP ETags,这很适合在RESTful设计中缓存。

这个想法是,应用程序将从Service2获取资源,该资源将与ETag头一起返回资源(可能是最后修改的时间戳或散列)。然后,应用程序将随同ETag一起缓存该资源。

当应用程序需要再次使用该资源时,它可以使用它在缓存中具有的ETag标头发送HTTP GET到Service2。

  • 如果服务2发现资源没有被改变,因为它是第一次返回到应用程序,则它返回具有指示的应用可以在高速缓存中使用该数据的HTTP状态304(未改性)的空响应。
  • 如果数据已更新,则Service2使用新的ETag标头(和HTTP状态200)返回新资源。

这种方法效果很好,如果你不介意的HTTP GET,看是否改变了资源,如果它很容易客服2可以确定资源是否发生了变化(而无需加载它)。

其优点是Service2不必使其客户端(应用程序)的缓存无效,这可能不是一个很好的做法(如果有很多客户端可能很难做到)。