REST应用程序,事务,缓存丢弃

时间:2010-05-14 06:39:10

标签: architecture rest caching transactions

我在php中构建REST API,其中包含用于缓存所有资源的memcache层。经过一些阅读/经验证明,当文档尽可能简单时最好...主要是因为删除了缓存序列。

因此,如果'room'文件中有'building','room'实体,我只会放置'building'的id而不是它的整个数据。然后在api客户端,我会根据需要合并数据。

当我需要更新/插入(大多数情况下有多个表)时会出现问题。我更新了一个资源,但在第二个更新系统上失败或者其他任何因素都会导致数据库不一致。

我看到了几个解决方案:

  1. 实施我认为错误和复杂的休息交易,因为想法是无国籍且容易的。

  2. 在更新/插入操作上,我传递了更复杂的数据(而非单个实体),因此我可以在API级别强制执行事务。但是这会让你的GET文档结构与PUT文档结构相同,这很奇怪。并且再次以某种方式使得丢弃序列变得复杂。

  3. 任何指针都非常受欢迎。 欢呼声,

1 个答案:

答案 0 :(得分:1)

你想要做的是:

客户< - >代理缓存(如Squid)< - > REST接口< - > memcached< - >域模型

如果您充分利用HTTP缓存,则可能根本不需要memcached层。缓存失效是一个令人讨厌的问题,而且HTTP已经有很多规则和机制可以让你保持理智。我对memcached不是很熟悉,但关于这个主题的快速谷歌似乎表明你需要推出自己的缓存失效策略。 HTTP还具有能够在客户端缓存内容的额外好处。

如果您有客户端需要一次更新多个域对象的场景,则需要在REST界面中创建表示虚拟“复合”对象的资源。客户端应该只感知他们正在更新单个资源。在后台,您可以根据需要更新数据库事务中的多个资源。

如果将资源映射到PresentationModels,则可以更轻松地创建REST系统。大多数人犯的错误是尝试将REST资源严格映射到域对象。可能存在密切关联,但除非你有一个非常无聊的应用程序,否则它不会是直接映射!