数据库与对象存储S3如何保持一致性

背景介绍

工作上实现了一个需求:需要将文件上传到S3(对象存储),并在数据库保存文件上传访问地址及其他相关数据。功能看似比较简单,但是发现有一些问题值得考虑。

实现细节

文件上传有新增、更新、删除操作,需要与数据库保持一致。S3的文件操作是没有事务保证的,但是数据库有事务,这就会存在很多问题。
在这里插入图片描述

由于文件上传和数据库新增都在一个事务中,如果S3上传失败,那么整个事务都会回滚,因此不存在数据库的脏数据,但是可能存在上传完文件后可能服务器同时宕机了,也有可能上传多个文件,一个成功,一个失败,也有可能保存数据库失败了,因此,S3可能已经上传成功了,由于S3没有任何事务保证而数据库有事务保证,因此就在S3上形成了脏数据。

同理,先保存数据库,再上传文件到S3中也是一样的,也有可能存在S3上传完成之后服务器立马宕机的情况或以上类似其他情况,都可能导致S3上存在脏数据。

总结一句话:数据库可以通过事务保证没有脏数据库,但是S3存储无法保证。

如何解决S3的脏数据问题

首先,S3一定要预留足够的存储空间,防止由于脏数据导致无法正常上传文件,此外还要一个定时任务,定时对比数据库中的记录和S3的数据,如果S3中的记录在数据库中不存在,那么需要在S3中删除该文件,还需注意文件上传时间,防止因为刚上传的文件还没有来得及保存到数据库中导致被误删,所以一般不要删除当天上传的文件。根本原因是S3和数据库无法同事在一个事务中,因此无法保证强一致性,只能保证最终一致性。

总结:

  • 使用定时任务(对比数据库与S3中的记录)删除S3中的脏数据,避免删除当天上传到S3上的文件,防止误删。
  • S3预留足够空间
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shadon178

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值