我认为这在一定程度上取决于减少带宽的资源、数据和请求的数量。但一个解决方案可能是在子请求中分离资源。
假设GET /images?car=mustang&viewangle=front的群呼返回5张图片。现在您可以将所有图像包含为二进制数据,并且 GET 请求本身具有唯一的 ETag:
GET /images?car=mustang&viewangle=front
...
HTTP 1.1 200 OK
ETag "aaaaaa"
data:image/png;base64,a123456....
data:image/png;base64,b123456....
data:image/png;base64,c123456....
data:image/png;base64,d123456....
data:image/png;base64,e123456....
现在的问题是,添加的一张图片改变了群呼的 ETag,您需要再次传输完整的集合,尽管只有一张图片发生了变化:
GET /images?car=mustang&viewangle=front
If-None-Match "aaaaaa"
...
HTTP 1.1 200 OK
ETag "bbbbbb"
data:image/png;base64,a123456....
data:image/png;base64,b123456....
data:image/png;base64,c123456....
data:image/png;base64,d123456....
data:image/png;base64,e123456....
data:image/png;base64,f123456....
在这种情况下,最好的解决方案是将资源数据与群组通话分开。所以响应只包含子请求的信息:
GET /images?car=mustang&viewangle=front
...
HTTP 1.1 200 OK
ETag "aaaaaa"
a.jpg
b.jpg
c.jpg
d.jpg
e.jpg
这样每个子请求都可以单独缓存:
GET /image/?src=a.jpg
If-None-Match "Akj5odjr"
...
HTTP 1.1 304 Not Modified
统计数据
- 第一个请求 = 6x 200 OK
- 如果组未更改,则未来的请求 = 1x 304 Not Modified
- 如果添加了一个新资源,则未来的请求 = 2x 200 OK, 5x 304 Not Modified
现在我将调整 API 文档。这意味着请求者必须在调用之前检查子请求的缓存是否可用。这可以通过在组请求中提供 ETag(或其他哈希)来完成:
GET /images?car=mustang&viewangle=front
...
HTTP 1.1 200 OK
...
ETag "aaaaaa"
a.jpg;AfewrKJD
b.jpg;Bgnweidk
c.jpg;Ckirewof
d.jpg;Dt34gsd0
e.jpg;Egk29dds
f.jpg;F498wdn4
现在请求者检查缓存并发现a.jpg 有一个名为Akj5odjr 的新ETag,f.jpg;F498wdn4 是一个新条目。这样可以减少未来的请求:
统计数据
- 第一个请求 = 6x 200 OK
- 如果组未更改,则未来的请求 = 1x 304 Not Modified
- 如果添加了一个新资源,则未来的请求 = 2x 200 OK
结论
最后,您需要考虑您的资源是否足够大以将它们放入子请求中,以及一个请求者重复 bis 组请求的频率(因此使用缓存)。如果没有,您应该将它们包含在群呼中,并且您没有优化的空间。
附:您需要监控所有请求者以确保他们都使用缓存。一种可能的解决方案是禁止请求者在不发送 ETag 的情况下调用 API URL 两次或更多次。