缓存问题:CDN后面的React+REST服务器
我正在寻找一种模式,可以让我为我的用户改善 UX。我有一个在 CloudFront 后面运行的 REST 服务器,它被前端的普通 React 应用程序使用。
我将简化我的例子来说明我的问题。
我有一个名为GET /posts/<id>. 当浏览器请求它时,它带有一个max=age=180,这意味着它将被存储在浏览器的缓存中,并且GET /posts/<id>在这 180 秒的持续时间内,任何后续调用都将从浏览器的缓存中提供,之后它将再次访问 CDN 以尝试获取新副本。
这对大多数用户来说没问题。我不介意任何帖子的更新在传播给所有用户之前最多延迟 3 分钟。但是有一个用户是这篇文章的作者。该用户可以使用 更改此帖子PATCH /posts/<id>。我们称该用户为The Editor。
这是我现在遇到的一个场景:
- 编辑器加载帖子页面,然后调用
GET /posts/5 - CDN 将最新的副本提供给前端。
- 然后,编辑器对帖子进行更改并通过 将其提交到后端
PATCH /posts/5。 - 然后编辑器使用 Command-R(或 CTRL-R)刷新浏览器选项卡。
- 其结果是,前端则请求
GET /posts/5再次-但得到的过时副本之前的变化,因为180秒没有自上次尚未通过GET与GET后发行PATCH
我想要的体验是:
- 编辑器加载帖子页面,然后调用
GET /posts/5 - CDN 将最新的副本提供给前端。
- 然后,编辑器对帖子进行更改并通过 将其提交到后端
PATCH /posts/5。 - 在 Command-R 浏览器选项卡刷新后,
GET /posts/5会立即带回包含编辑器所做更改的数据副本PATCH,无论ttl在获得新副本之前180 秒如何。 - 至于其他用户,他们完全可以等待 180 秒,然后在帖子中的更改传播给他们时,
GET /posts/5
我正在使用 Axios,但我不认为 SWR 和 React-Query 支持突变。据我所知,这将允许编辑器为他刚刚PATCH'ed在服务器上的对象声明一个突变,以便他所做的任何后续调用GET /posts/5都将从那里提供服务,直到可以从后端获得更新的版本。
我的问题是:
- 带有“突变”的 SWR 可以通过
GET /posts/5透明的方式为突变的对象提供服务吗? - 突变会在浏览器选项卡硬刷新后幸存下来吗?或浏览器关闭,重新打开和后续
/GET posts/5? - 是否有另一种模式/最佳实践来解决这个问题?