amazon-web-services - 将文件与事务一起保存在数据库中的正确云等效项是什么?
问题描述
关于 AWS S3 存储的问题,但我相信这也适用于 Azure 存储或任何其他类型的数据存储。
您如何处理云中的存储“事务”?
如果您将文件保存在数据库中,事情就变得非常简单:
- 用户进行 API 调用,并在其中提供了他的姓名和照片
- 您创建一个数据库事务
- 在 User 表中创建一个新用户
- 将照片上传到文档表
- 其他事件触发,但其中之一出错。
- 事务回滚,向用户显示错误,完成!没有文件上传
删除也是如此:
- 用户想要删除照片
- 从数据库中删除照片
- 发生了其他事件,其中一个出错了
- 回滚,照片没有发生任何事情,显示错误。
现在,在云中这样做似乎是不可能的?我相信 S3 不支持事务(我相信也不支持 Azure blob 存储),那么如果你想删除文档怎么办?在我们说“开始!”之前,交易不会被“保存”在 s3 存储中。你现在不能轻易删除它,错误发生在应用程序的其他地方
删除失败也是如此。如果您从 AWS 中删除它,但另一个事件失败了,所以您想回滚怎么办?在这种情况下,我想您可以通过软删除来取消删除它,但是如何?在哪里??
工程师想出的东西都是复杂的或“慢”的:
- 创建一个 DocumentLog 表(id、文档数据、文件名、generated_guid_for_cloud_id、DesiredState (ADD/DELETE)、succeded (TRUE/FALSE))并将文档保存在其中。将其插入其中并在请求后开始工作。
- 该作业检查 DocumentLogtable 并根据所需状态上传或删除文档。
- 之后你仍然想更新表中的那一行,因为它现在成功了。或者,也许您想完全删除您的行。
- 但是如果数据库中的更新失败怎么办?
- 在某处的队列中发送“UploadDocumentCommand”并在请求成功后上传。但这是一个网络应用程序,如果上传到 aws 的速度很慢/中断,那么向用户显示占位符图像会很奇怪,因为根据用户的请求刚刚成功。
- 忘记这个问题。每 X 次运行一次清理作业,并在存储系统中查找不再在数据库中引用的文件并将其删除。
- 如果你有很多文件怎么办?这会变得非常昂贵和缓慢,非常快!如果您决定只检索最后 X 次价值的文件以节省时间和金钱,如果您的清理工作停止了一段时间并且现在有一个文件漏掉了怎么办?这永远不会被抓住..
我很想听听你的想法!
这些非常复杂,需要大量代码。做这些事情的最佳方法是什么?
解决方案
推荐阅读
- java - 如何在春季禁用默认 GET 请求,因为它会公开所有数据?
- c# - 修改实例化对象的 transform.position 会产生不需要的值
- time-complexity - 奇怪循环的时间复杂度
- python - 在 Panda/Geopanda 中合并两个数据集时出现问题
- python - cv2.CascadeClassifier.detectMultiScale 错误
- datatables - 我们如何过滤数据表中的人员选择器字段?
- ios - 创建许多 CAShapeLayer 并在其中创建 unqiue 触摸事件
- containers - aws ecs 中的容器通信
- laravel - Laravel 7 - 将多个文件附加到 Mailables
- node.js - 对象或嵌套文档上的 mongoose $regex