0

我正在编写一个在线文本编辑器。我想允许用户在文档中添加内嵌图像和视频。我正在努力以可靠的方式实现这一点。

目前的基础设施:

  • 文档数据库(postgres)(文本、标题、作者、引用的媒体对象列表S3
  • 存储图像/视频/文件的对象存储 (S3)

当前流量:

  1. 用户创建一个新文档
  2. 用户进行更改,但不保存。这些更改存储在其中,localStorage因此它们不会在刷新时丢失。
  3. 用户附上一张图片
  4. 图像在上传到S3(或等效)时显示加载指示符
  5. 用户保存文档,数据保存到数据库中。不保存对象,只保存S3它们的 URL。

问题

  • 如果用户在保存之前删除了文档,或者如果保存失败,则其中将存在S3未被任何文档引用的孤立文件。
  • “删除文档”操作现在必须从 Postgres S3. 由于您无法跨两个完全不同的服务进行事务,因此可以想象 postgres 删除成功但S3删除失败的情况,从而创建更多孤立对象。

解决方案的尝试

  • 我尝试存储媒体localStorage并在保存文档时将它们全部提交。这将解决问题,但localStorage仅限于 5-10mb,这太小了。
  • 一个 reaper 守护进程,它查询S3数据库中的引用并将其与存储的对象交叉引用S3以查找孤儿对象,它会自动删除这些孤儿对象。

收割者守护进程可以工作,但感觉就像一个黑客。我真的不想仅仅为了存储一些文件而管理一个全新的服务。有一个更好的方法吗?行业标准是什么?

如果重要的话,我使用的是 React+Typescript,文本编辑器是基于 DraftJS 构建的。

4

0 回答 0