我一直在思考在RESTful环境中如何进行批量读写操作,并且我认为我已经意识到我对HTTP缓存有更广泛的问题。(下面我使用逗号(“,”)来分隔多个记录ID,但该细节并不特定于本讨论。)
我从这个问题开始:
1. 批量更新使单个GET
无效
GET /farms/123 # get info about Old MacDonald's Farm
PUT /farms/123,234,345 # update info on Old MacDonald's Farm and some others
GET /farms/123
当一个缓存服务器位于客户端和Farms服务器之间时,它如何知道在看到PUT
请求时使其缓存无效的/farms/123
?
然后我意识到这也是一个问题:
2. 单个(或批量)更新会使批量GET
无效
GET /farms/123,234,345 # get info about a few farms
PUT /farms/123 # update Old MacDonald's Farm
GET /farms/123,234,345
当缓存看到 PUT
时,它如何知道要使多个农场的 GET
无效?
所以我认为问题实际上只出现在批量操作中。然后我意识到任何关系都可能导致类似的问题。假设一个农场有零或一个所有者,而所有者可以拥有零或一个农场。
3. 由相关记录更新导致单个GET
无效
GET /farms/123 # get info about Old MacDonald's Farm
PUT /farmers/987 # Old MacDonald sells his farm and buys another one
GET /farms/123
当缓存看到PUT方法被触发时,它如何知道要使之前的单个GET方法无效?
即使您更改模型以更符合RESTful标准,使用关联模型,您仍然会面临同样的问题:
GET /farms/123 # get info about Old MacDonald's Farm
DELETE /farm_ownerships/456 # Old MacDonald sells his farm...
POST /farm_ownerships # and buys another one
GET /farms/123
#3的两个版本中,第一个GET应该返回类似以下JSON的内容:
farm: {
id: 123,
name: "Shady Acres",
size: "60 acres",
farmer_id: 987
}
第二个GET请求应返回类似以下内容:
farm: {
id: 123,
name: "Shady Acres",
size: "60 acres",
farmer_id: null
}
即使你妥善使用ETag
, 缓存服务器也不能缓存! 你不能期望缓存服务器检查内容的ETag
--内容可能被加密。而且你不能期望服务器通知缓存记录应该被作废--缓存不会向服务器注册。
那么是否有我遗漏的头信息? 是否有一些指示缓存对某些资源进行任何GET
之前应该做HEAD
的东西? 如果我能告诉缓存哪些资源可能经常更新,我可以接受每个资源的双重请求。
那么关于一个缓存接收到PUT
并知道作废其缓存,而另一个没有看到它的问题呢?
pathInfo
,因此问题不存在。 +++ 在找到你出色的问题之前,Invalidates-Other
正是我努力构思问题的内容。 - maaartinus