开发者社区> 问答> 正文

严重问题:无法确保文件完整性

OSS文档的5.4.6的细节分析6中提及:

6) 如果设定了长度,但是没有发送消息 Body,或者发送的 body 大小小于给定
大小,服务器会一直等待,直到 time out,返回 400 Bad Request 消息。错
误码:RequestTimeout。此时 OSS 上的这个文件内容是用户已经上传完的数
据。


这样的设定非常糟糕。设想有两各客户端A和B,在A上传一个较大的文件到OSS的过程中,B去尝试下载该文件会成功,但实际上下载到的是不完整的文件。如果没有对文件校验就使用会带来不可预知的后果。即使校验出是不完整的文件,B的流量也已经浪费掉了。


上传文件显然应该是个事务性动作。我认为OSS不应该让不完整的文件被客户端下载到,以避免上述问题。或至少在put object的时候提供事务参数。

展开
收起
ap4249e0w 2012-11-07 20:12:40 10060 0
8 条回答
写回答
取消 提交回答
  • 路过~~
    2012-12-23 12:31:15
    赞同 展开评论 打赏
  • A客户端写入操作的过程中B客户端为什么会知道有这个文件呢?难道你的系统是不等A写入完毕就发布A上传的文件给B?
    2012-12-23 12:13:37
    赞同 展开评论 打赏
  • Re严重问题:无法确保文件完整性
    关注了
    2012-11-09 21:06:07
    赞同 展开评论 打赏
  • 楼主,对于传统文件系统,写文件写到一半异常退出,操作系统也会留一个不完整的文件在磁盘上。
    对于多个客户端同时写同一个Object的情况,最后的Object会写成什么样子是无法预知的。我们目前建议用户在自己的逻辑端避免这种并发写的问题(因为传统的文件系统也不支持对同一个文件的并发写)。

    目前我们推荐的标准解决方案是:
    1. 生成一个UUID作为Object的名称,然后客户端把数据写入这个Object;
    2. 在数据库里写一行数据,记录文件名和其对应的UUID。由于数据库是可以保证事务性,所以就避免的这个问题。
    3. 读取的时候要先查一下数据库,找到文件对应的UUID,然后用这个UUID再去OSS中下载数据。

    上面是一个标准的事务性操作,可以看出为了实现对同一个文件的并发写的事务性,做起来还是很难的。

    OSS争取明年公布并发写的一致性模型:让你的数据要么是A,要么是B,不会是AB的中间状态。
    2012-11-09 19:55:01
    赞同 展开评论 打赏
  • Re严重问题:无法确保文件完整性
    不懂。顶。。
    2012-11-08 19:58:25
    赞同 展开评论 打赏
  • 回1楼ap4249e0w的帖子
    OSS已经返回了400或者根本没有返回200,这个时候这个object是可能会不完整的。建议在上传的时候判断返回码是否为200,并在上传文件的时候自定义header例如x-oss-meta-md5, 用来下载的时候建议文件的完整性。
    2012-11-08 14:32:15
    赞同 展开评论 打赏
  • Re严重问题:无法确保文件完整性
    这个问题挺严重的。
    2012-11-07 22:36:15
    赞同 展开评论 打赏
  • Re严重问题:无法确保文件完整性
    事实上我们在一个繁忙的产品环境上就遇到了这个问题,给我们带来了不小的损失。

    -------------------------

    回3楼wood23的帖子
    引用第3楼wood23于2012-11-08 14:32发表的 回1楼ap4249e0w的帖子 :
    OSS已经返回了400或者根本没有返回200,这个时候这个object是可能会不完整的。建议在上传的时候判断返回码是否为200,并在上传文件的时候自定义header例如x-oss-meta-md5, 用来下载的时候建议文件的完整性。


    1. 我的上传和下载是异步进行的,并且在无法互相通讯的不同服务器上
    2. 上传的时候自定义的header必须等到下载方下载完成才能校验,无法实现在下载前确认完整性的需求
    3. 官方提供的PHP SDK中设置header的函数有bug

    -------------------------

    Re严重问题:无法确保文件完整性
    引用第6楼sanbo于2012-11-09 19:55发表的  :
    楼主,对于传统文件系统,写文件写到一半异常退出,操作系统也会留一个不完整的文件在磁盘上。
    对于多个客户端同时写同一个Object的情况,最后的Object会写成什么样子是无法预知的。我们目前建议用户在自己的逻辑端避免这种并发写的问题(因为传统的文件系统也不支持对同一个文件的并发写)。

    目前我们推荐的标准解决方案是:
    1. 生成一个UUID作为Object的名称,然后客户端把数据写入这个Object;
    .......

    1. 我抱怨的不是并发写,也不是写到一半异常退出,而是A客户端写入操作的过程中B客户端应该有办法知道这不是一个完整的文件而避免去读取它,或者让B无法读取到任何文件。请不要拿传统文件系统做比较,传统文件系统也提供了系统级别的文件句柄和共享锁。即使并发写,云存储也应当有合理的反馈信息(例如写锁定和锁定超时)。云存储中这种需求非常常见,阿里云存储需要的是改进而不是为错误辩解。
    2. 你推荐的所谓标准解决方案要求你们的客户做了额外的事情。或许能解决问题但是这是不负责任的。
    3. 期待你们下一版本的写一致模型。
    2012-11-07 20:14:06
    赞同 展开评论 打赏
滑动查看更多
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载