本文标题中提到的文件语义,指的是POSIX规范。

S3指的是AWS提供的对象存储服务以及相关接口。为方便描述,下文中以对象语义替代S3接口语义。

文件语义和对象语义存在比较多的差异。

对象语义不支持文件语义的部分特性,比如:

  • 目录的操作,创建、删除、修改名称。
  • 文件的部分操作,追加写、随机写、修改名称等。
  • 文件的元数据,比如:
    • 时间字段,即crtime/ctime/mtime/atime。
    • 用户和组,即uid/gid。
    • 权限,即UGO和ACL。
    • 文件的扩展属性。
    • 硬链接。
    • 软链接。
    • 锁。

文件语义不支持对象语义的部分特性,比如:

  • Etag,文件语义中没有定义相关信息。
  • 生命周期管理。
  • 桶策略。
  • 多版本。
  • 对象的元数据,即:
    • 系统元数据,即标准HTTP头部。
    • 用户自定义元数据,即命名为x-amz-meta-*的HTTP头部。
    • 对象tagging,即命名为x-amz-tagging的HTTP头部。

部分存在差异的语义,比如:

  • WORM,文件语义和对象语义的实现,由于前述差异,具体实现和保护范围可能存在一定的差异。
  • 文件的创建。依据对象语义,保存对象的操作是一个原子行为,包含数据、元数据一并写入,要么成功、要么失败,只要上传对象的接口返回了成功,即表示对象创建成功。而依据文件语义,保存文件的操作,涉及打开、写入数据、写入元数据、关闭文件等操作,并不是原子行为,写入数据的过程中可能会被中断,但由于文件打开成功,因此会出现数据不一致的现象。
  • 目录,对象语义对目录的支持非常有限,而文件语义则提供了丰富的API。

对象语义中,使用对象来表示客户的数据,在存储和管理对象时,放弃了目录的概念,所有的对象均以展平的形式存储,在使用文件语义实现对象语义时,需要对目录做特殊的处理。

在文件语义中,/有特殊含义,表示目录的分隔符,因此一般不允许在目录名或者文件名中使用。

AWS S3定义的规范中,/是普通字符,允许在对象名中使用。

做个实验,登录Linux环境的控制台,执行如下命令,输出如下:

$ ll a.py
-rw-r--r-- 1 jackie docker 138 3月 29 21:47 a.py
$ mkdir a.py
mkdir: cannot create directory ‘a.py’: File exists
$ mkdir a.py/
mkdir: cannot create directory ‘a.py/’: File exists

依据对象语义,a.pya.py/是不同的对象,但在文件语义下,a.py存在,则阻塞目录a.py的创建操作。

依据文件语义,删除目录即类似rm -rf /path/to/delete时,目录和目录下的所有的文件、目录均会被删除。

考虑到本操作并不是一个原子操作,因此使用文件语义实现对象语义的删除操作时,会有比较多的注意事项。

思考点

  • 删除目录时,目录下的对象,需要一并删除。假如对象数量比较多时,则删除操作将比较耗时。
  • 目录下假如存在未合并的多段对象,是否一并删除。
  • 目录下假如仅有一个对象,使用对象语义的删除接口,将该对象删除时,目录是否需要被删除。
  • 先上传目录,上传一个对象至该目录下,使用对象语义的删除接口,将该对象删除时,目录是否需要被删除。
  • 手工上传的目录,在列举对象时,是否作为一个对象在列举结果中出现。
  • 如前所述,文件主义并不支持对象主义的Etag,因此在实现上传对象的操作时,需要计算并保留Etag值。
    • 保存对象的数据的操作,计算MD5值的操作,二者需要保持进度一致,避免MD5值计算结果不正确,或者耗时过久,影响上传操作的性能。
    • Etag保存的位置。
  • 对象元数据的保存位置,依据语义,需要和数据一起保存。
    • 元数据保存的位置。
    • 操作的原子性。
  • 对象语义写入对象时,文件的元数据,应当如何填值。如前述,不支持的元数据,如下:
    • 时间字段,即crtime/ctime/mtime/atime。
    • 用户和组,即uid/gid。
    • 权限,即UGO和ACL。

基于文件语义实现S3接口语义的注意事项的更多相关文章

  1. 基于MIndSpore框架的道路场景语义分割方法研究

    基于MIndSpore框架的道路场景语义分割方法研究 概述 本文以华为最新国产深度学习框架Mindspore为基础,将城市道路下的实况图片解析作为任务背景,以复杂城市道路进行高精度的语义分割为任务目标 ...

  2. 使用COSBench工具对ceph s3接口进行压力测试

    一.COSBench安装 COSBench是Intel团队基于java开发,对云存储的测试工具,全称是Cloud object Storage Bench 吐槽下,貌似这套工具是intel上海团队开发 ...

  3. JMeter基于http请求的web接口性能测试总结

    [本文出自天外归云的博客园] 基于http请求的web接口性能测试总结 压测的目的:对于Web接口压测的目的最终是要在对数据库造成压力的情况下观察压测服务器的cpu是否达到预警值.memory是否发生 ...

  4. 实现基于文件存储的Session类

    自主实现Session功能的类,基于文件方式存储Session数据,测试基本通过,还比较好玩,实际应用没有意义,只不过是学习Session是如何实现的. 一般基于文件存储Session数据效率不是很高 ...

  5. 【科研论文】基于文件解析的飞行器模拟系统软件设计(应用W5300)

    摘要: 飞行器模拟系统是复杂飞行器研制和使用过程中的重要设备,它可以用来模拟真实飞行器的输入输出接口,产生与真实系统一致的模拟数据,从而有效避免因使用真实飞行器带来的高风险,极大提高地面测发控系统的研 ...

  6. Hadoop基于文件的数据结构及实例

    基于文件的数据结构 两种文件格式: 1.SequenceFile 2.MapFile SequenceFile 1.SequenceFile文件是Hadoop用来存储二进制形式的<key,val ...

  7. 【ALB学习笔记】基于事件触发方式的串行通信接口数据接收案例

    基于事件触发方式的串行通信接口数据接收案例 广东职业技术学院  欧浩源 一.案例背景 之前写过一篇<基于多线程方式的串行通信接口数据接收案例>的博文,讨论了采用轮询方式接收串口数据的情况. ...

  8. 【安富莱专题教程第1期】基于STM32的硬件RGB888接口实现emWin的快速刷新方案,32位色或24

    说明:1. 首先感谢ST终于推出了ARGB格式的emWin库,可谓千呼万唤始出来,使用STM32的硬件RGB888接口刷新图片慢的问题终于得到解决.2. 这个问题由来已久,是之前为我们的STM32-V ...

  9. Asp.Net Core基于JWT认证的数据接口网关Demo

    近日,应一位朋友的邀请写了个Asp.Net Core基于JWT认证的数据接口网关Demo.朋友自己开了个公司,接到的一个升级项目,客户要求用Aps.Net Core做数据网关服务且基于JWT认证实现对 ...

  10. ceph储存的S3接口实现(支持断点续传)

    最近公司准备接ceph储存,研究了一番,准备用亚马逊的s3接口实现,实现类如下: /** * Title: S3Manager * Description: Ceph储存的s3接口实现,参考文档: * ...

随机推荐

  1. Taro兼容h5的一些小问题

    背景:先做了小程序,现在需要兼容h5 问题一:Image组件mode属性设置为aspectFill在h5上没效果 解决方法:给img加样式 object-fit: cover (例子如下) // js ...

  2. WSL2镜像文件压缩

    WSL2的镜像文件(*.vhdx)支持自动扩容,但是一般不会自动缩容.一旦某次存放过大文件以后,即使后续删除,镜像文件体积仍然不会缩小,导致大量磁盘空间浪费.因此,可以定期对镜像文件进行手动压缩. 镜 ...

  3. django中的一些装饰器用法

    1.require_http_methods() 1.要求视图只接受特定的请求方法 2.该装饰器允许传递多个请求方法参数,以列表的形式,请求方法名要大写 from django.views.decor ...

  4. 记一次酣畅淋漓的 K8s Ingress 排错过程(302,404,503,...)

    故事开始 第 1 关:[流量重定向到 /] 第 2 关:[应用返回 302,重定向到 /,引入 503 错误] 第 3 关:[静态资源访问遇到 503 问题] 第 4 关:[静态资源访问遇到 403 ...

  5. WPF 应用迁移到 Electron 框架过程记录

    前一段时间我用 WPF 开发了一个查看 emoji 表情的小工具 https://github.com/he55/EmojiViewer ,由于最近我使用 macOS 系统比较多,我想能在 macOS ...

  6. C++ //类模板对象做函数参数 //三种方式 //1.指定传入的类型 --直接显示对象的数据类型 //2.参数模板化 --将对象中的参数变为模板进行传递 //3.整个类模板化 --将这个对象类型 模板化进行传递

    1 //类模板对象做函数参数 2 //三种方式 3 //1.指定传入的类型 --直接显示对象的数据类型 4 //2.参数模板化 --将对象中的参数变为模板进行传递 5 //3.整个类模板化 --将这个 ...

  7. WebView无法加载页面报错 net:ERR_CLEARTEXT_NOT_PERMITTED 还有webView加载网页后出现ERR_UNKNOWN_URL_SCHEME

    根据网络安全配置- 从Android 9(API级别28)开始,默认情况下禁用明文支持.因此http的url均无法在webview中加载 还可以看看-https: //koz.io/android-m ...

  8. 基于python源码的啸叫抑制算法解析

    一 原理解析 从下图一中可以看出,该算法的原理也是先检测出来啸叫,然后通过陷波器来进行啸叫抑制的,和笔者以前分析的所用方法基本耦合. ​   二 源码分析   函数PAPR:计算峰值功率和平均功率的比 ...

  9. Web Audio API 第1章 基础篇

    Web Audio API 第1章 基础篇 我查了一下 Web Audio API 蝙蝠书居然在 2013 年就出版了 我又看了一下我的"豆瓣读书"频道内,这本书加入到" ...

  10. netty Recycler对象池

    前言 池化思想在实际开发中有很多应用,指的是针对一些创建成本高,创建频繁的对象,用完不弃,将其缓存在对象池子里,下次使用时优先从池子里获取,如果获取到则可以直接使用,以此降低创建对象的开销. 我们最熟 ...