我正在编写一个在线文本编辑器。我想允许用户在文档中添加内嵌图像和视频。我正在努力以可靠的方式实现这一点。
目前的基础设施:
- 文档数据库(postgres)(文本、标题、作者、引用的媒体对象列表
S3
) - 存储图像/视频/文件的对象存储 (S3)
当前流量:
- 用户创建一个新文档
- 用户进行更改,但不保存。这些更改存储在其中,
localStorage
因此它们不会在刷新时丢失。 - 用户附上一张图片
- 图像在上传到
S3
(或等效)时显示加载指示符 - 用户保存文档,数据保存到数据库中。不保存对象,只保存
S3
它们的 URL。
问题
- 如果用户在保存之前删除了文档,或者如果保存失败,则其中将存在
S3
未被任何文档引用的孤立文件。 - “删除文档”操作现在必须从 Postgres和
S3
. 由于您无法跨两个完全不同的服务进行事务,因此可以想象 postgres 删除成功但S3
删除失败的情况,从而创建更多孤立对象。
解决方案的尝试
- 我尝试存储媒体
localStorage
并在保存文档时将它们全部提交。这将解决问题,但localStorage
仅限于 5-10mb,这太小了。 - 一个 reaper 守护进程,它查询
S3
数据库中的引用并将其与存储的对象交叉引用S3
以查找孤儿对象,它会自动删除这些孤儿对象。
收割者守护进程可以工作,但感觉就像一个黑客。我真的不想仅仅为了存储一些文件而管理一个全新的服务。有一个更好的方法吗?行业标准是什么?
如果重要的话,我使用的是 React+Typescript,文本编辑器是基于 DraftJS 构建的。