【发布时间】:2021-03-24 13:31:39
【问题描述】:
我正在寻找一种模式,可以让我为我的用户改善 UX。我有一个在 CloudFront 后面运行的 REST 服务器,由前端的普通 React 应用程序使用。
我将简化我的例子来说明我的问题。
我有一个名为GET /posts/<id> 的端点。当浏览器请求它时,它带有一个max=age=180,这意味着它会被存储在浏览器的缓存中,并且任何后续对GET /posts/<id> 的调用都将在这 180 秒内从浏览器的缓存中提供服务,之后它将再次访问 CDN 以尝试获取新副本。
这对大多数用户来说都可以。我不介意任何帖子的更新在传播给所有用户之前延迟最多 3 分钟。但是有一个用户是这篇文章的作者。该用户可以使用PATCH /posts/<id> 更改此帖子。我们称该用户为编辑器。
这是我现在的一个场景:
- 编辑器加载帖子页面,然后调用
GET /posts/5 - CDN 将最新副本提供给前端。
- 然后编辑对帖子进行更改并通过
PATCH /posts/5将其提交到后端。 - 然后编辑器使用 Command-R(或 CTRL-R)刷新其浏览器选项卡。
- 因此,前端随后再次请求
GET /posts/5—— 但从 before 更改获取过时的副本,因为距离上一个GET和GET在PATCH之后发布
我想要的体验是:
- 编辑器加载帖子页面,然后调用
GET /posts/5 - CDN 将最新副本提供给前端。
- 然后编辑对帖子进行更改并通过
PATCH /posts/5将其提交到后端。 - 在 Command-R 浏览器选项卡刷新后,
GET /posts/5会立即返回带有编辑器对PATCH所做更改的数据副本,无论ttl需要 180 秒才能生成新副本获得。 - 对于其他用户,当
GET /posts/5
我正在使用 Axios,但我不认为 SWR 和 React-Query 支持突变。据我了解,这将允许编辑器在服务器上为他刚刚PATCH'ed 的对象声明一个突变,这样他对GET /posts/5 的任何后续调用都将从那里得到服务,直到可以从后端。
我的问题是:
- 具有“变异”的 SWR 能否通过
GET /posts/5透明地为变异对象提供服务? - 突变能否在浏览器选项卡硬刷新后继续存在?还是浏览器关闭、重新打开和随后的
/GET posts/5? - 是否有其他模式/最佳实践可以解决这个问题?
【问题讨论】:
-
@hackape 提出的解决方案是一种潜在的前进方式。但是,我们也可以在写入操作时突发 CloudFront 缓存。您可以尝试类似的方法-stackoverflow.com/questions/22021651/…
-
@MukulBansal 好信息!但我认为这只会破坏 CloudFront CDN 节点上的缓存,而不是浏览器中的缓存。
-
@MukulBansal 是正确的.. 如果浏览器从 CDN 获取一个 ttl 为 5 分钟的对象,它甚至不会在接下来的 5 分钟内与 CDN 对话。它只会为内存/磁盘中的对象提供服务——并且使 CDN 上的对象无效不会改变这一点。
-
@JasonGenX 好的。所以这里有 3 件事 - 1. 爆破 CDN 缓存 - 这可以按照上面讨论的方式完成。 2. 为帖子所有者爆裂浏览器缓存——这在你手中。一旦编辑修补了帖子,您可以在服务器成功响应后清除他的浏览器缓存。 3. 为非帖子所有者爆裂浏览器缓存 - 根据您的场景,如果不爆裂,您就可以了。不过,如果你想爆破它,你可以通过套接字。维护所有活跃用户的列表是一件繁重的事情。 Facebook 或 Bitbucket 就是这样做的。