对象业务的截断接口

依据AWS S3,没有定义截断对象的操作。

本文有如下假定:

  • 对象存储服务基于文件语义实现。

接口定义

依据前述,业界主流对象存储服务比如AWS S3并未定义截断对象的操作,而国内的各家公有云对象存储服务,提供了对象的截断操作。

国内的公有云对象存储服务,相关操作的文档的链接(排名不分先后),如下:

  • 华为云OBS

华为云OBS的截断对象为例,接口定义如下:

PUT /ObjectName?truncate&length=Length HTTP/1.1
Host: bucketname.obs.region.myhuaweicloud.com
Authorization: authorization
Content-Length: length
Date: date

本接口的关键参数,如下:

  • 对象名,指定对象名。
  • 操作名,参数名为truncate,不需要指定参数值。
  • 截断位置,参数名为length,依据实际情况指定,表示截断后的对象的大小。

实现思路

请求参数的范围

对于普通对象,即使用PUT或者复制方式上传的对象,对象大小的范围为[1, 5GiB],因此

  • 假如length的位置小于1或者大于对象当前的大小,则校验失败。

对于使用多段方式上传的对象,涉及的API,如下:

  • CreateMultipartUpload
  • UploadPart
  • UploadPartCopy
  • CompleteMultipartUpload

段的数量上限为10000,每个段大小的范围为[1, 5GiB],因此对象整体的范围可到达到[1, 48.8TiB],因此

  • 假如length的位置小于1或者大于对象当前的大小,则校验失败。

对象大小的规格,参见AWS S3文档。

ETag

参考AWS S3数据一致性,ETag基于对象的数据,使用MD5算法计算得到。

由于变更了部分数据,因此对象的ETag值和数据已不一致,需要设计补救方案。

对于普通对象,即使用PUT或者复制方式上传的对象,考虑在后台任务中读取全量数据,计算对象数据的MD5值,保存至ETag字段的值保存下来。

对于使用多段方式上传的对象,涉及的API,如下:

  • CreateMultipartUpload
  • UploadPart
  • UploadPartCopy
  • CompleteMultipartUpload

依据Checking object integrity的介绍,该类对象的ETag值样例为C9A5A6878D97B48CC965C1E41859F034-14,由所有的段的MD5值计算得到,因此修复操作相对复杂一些。

  • 依据length计算涉及变化的段的清单。
  • 依据最新的数据,计算涉及变化的段的MD5值。
  • 使用所有的段的MD5值,按照多段对象的ETag值的生成规则,重新计算,得到最终的结果。

对象存储服务在实现时,有如下需求:

  • 多段对象的系统元数据中保留所有的段的清单。
  • 段的元数据中记录自身的MD5值,数据的起始位置、段的长度。

多版本

按照AWS S3多版本中的说明,多版本特性的开关作用在桶级,包含如下状态:

Buckets can be in one of three states:

  • Unversioned (the default)
  • Versioning-enabled
  • Versioning-suspended

接口定义中未提供versionId,因此只支持修改当前版本,不支持修改历史版本。

分级

参考AWS S3 归档和AWS S3 分级中的说明,处于归档状态的对象,需要先取回才能访问。
显而易见,此处为了维护对象语义,照顾对象存储服务的实现,当对象处于归档状态时,不允许更新对象的数据。

WORM

参考AWS S3 Object Lock中的说明,开启WORM后:

  • 在保护期内的对象,不允许修改,不允许删除。
  • 在保护期外的对象,不允许修改,允许删除。

因此从维护对象语义的角度讲,在保护期内的对象、保护期外的对象,均不允许修改对象的数据。

生命周期

参考AWS S3 Lifecycle,修改元数据操作的对象可能符合生命周期规则,从而被恰好正在运行的后台任务删除掉。
此时有如下选择:

  • 生命周期的后台任务具备更高的优先级,提前中断操作,正常删除掉对象,对象存储服务对客户应用返回操作失败。
  • 生命周期的后台任务优先级相对较低,跳过当前对象,待下次运行时再决策是否删除。

数据加密

依据SSE-C的说明,客户应用在执行PUT/GET/Head/Copy操作时,均需要提供加密数据的密钥。

即在发起请求时,提供如下头部:

  • x-amz-copy-source​-server-side​-encryption​-customer-algorithm
  • x-amz-copy-source​-server-side​-encryption​-customer-key
  • x-amz-copy-source-​server-side​-encryption​-customer-key-MD5

由于需要先解密数据、修改数据、再加密数据,本特性在实现时,成本要高不少。
为降低修改数据的范围,对象存储内部实现时,可以将数据切割成固定大小的块,这样可以有如下好处:

  • 修改数据时,仅处理受影响的块。
  • 涉及修改的块,读取、解密、修改、加密、保存等操作,可以并发执行,改善体验。
  • 不涉及修改的块,不需要执行解密操作,节约算力和时间。

事件通知

依据AWS S3 事件通知中的说明,对象存储服务可以提供事件通知,目前支持的事件类型见文档,显然不包括截断操作,可以扩展事件名,比如s3:ObjectDataUpdated:Put

并发一致性

依据AWS S3 data consistency model的说明,对象存储服务提供read-after-write的模型。

当多客户端对相同对象并发的发起截断操作时,参照文件语义,提供最终一致性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/25811.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【SecureCRT常用指令】

SecureCRT常用指令 一、ls 只列出文件名 (相当于dir,dir也可以使用) -A:列出所有文件,包含隐藏文件。 -l:列表形式,包含文件的绝大部分属性。 -R:递归显示。 --help:此命令的帮助。…

安卓逆向经典案例——XX牛

安卓逆向经典案例——XX牛 按钮绑定方式 1.抓包 2.查看界面元素,找到控件id 通过抓包,发现点击登录后,才会出现Encrpt加密信息,所以我们通过控件找到对应id:btn_login 按钮绑定方法——第四种 public class LoginA…

c++【基础】求花坛的面积

限制 时间限制 : 1 秒 内存限制 : 128 MB 题目 A校区有一个圆形花坛,量得花坛周围的篱笆长是x米,请问该花坛的面积是多少平方米?(假设π3.14) 输入 一个小数x 输出 花坛的面积(结果保留2位小数&…

开机自启动脚本配置

#!/bin/bash# 定义要检查的IP地址 IP_ADDRESSES("127.0.0.1")# 检查是否存在任意一个IP地址 check_ips() {HOST_IPS$(hostname -I)for IP in "${IP_ADDRESSES[]}"; doif [[ $HOST_IPS ~ $IP ]]; thenreturn 0fidonereturn 1 }# 检查IP地址并在必要时重新启…

python tushare股票量化数据处理:学习中

1、安装python和tushare及相关库 matplotlib pyplot pandas pandas_datareader >>> import matplotlib.pyplot as plt >>> import pandas as pd >>> import datetime as dt >>> import pandas_datareader.data as web 失败的尝试yf…

什么是Socket?

什么是Socket? Socket(套接字)是网络通信的基本单位,它允许在不同计算机之间进行数据交换。Socket在网络编程中起着至关重要的作用,它为应用程序提供了一个机制,通过网络发送和接收数据。简单地说&#xf…

使用NetAssist网络调试助手在单台计算机上配置TCP服务器和客户端

要使用NetAssist网络调试助手在同一台计算机上配置一个实例作为服务器(server)和另一个实例作为客户端(client),可以按照以下步骤进行操作: 前提条件 确保已经安装NetAssist网络调试助手,并了…

mysql 小例子

mysql 小例子 show databases ; create database company; use company;DROP TABLE IF EXISTS employee;create table employee ( id INT AUTO_INCREMENT, name VARCHAR(50) NOT NULL, PRIMARY KEY(id)) ENGINEInnoDB; DESCRIBE employee ;111 CREATE TABLE example (id INT …

如何制定工程战略

本文介绍了领导者如何有效制定工程战略,包括理解战略核心、如何收集信息并制定可行的策略,以及如何利用行业最佳实践和技术债务管理来提升团队效能和产品质量。原文: How to Build Engineering Strategy 如果你了解过目标框架(如 OKR&#xf…

数仓建模中的一些问题

​​​在数仓建设的过程中,由于未能完全按照规范操作, 从而导致数据仓库建设比较混乱,常见有以下问题: 数仓常见问题 ● 数仓分层不清晰:数仓的分层没有明确的逻辑,难以管理和维护。 ● 数据域划分不明确…

yield 和 生成器(generator)

Python3 迭代器 https://www.runoob.com/python3/python3-iterator-generator.html #!coding:utf8#author:yqq #date:2020/1/14 0014 15:21 #description:class MyNumber:def __init__(self, init_number 1 , bound_number 99999):self.n init_numberself.bound bound_nu…

Duck Bro的第512天创作纪念日

Tips:发布的文章将会展示至 里程碑专区 ,也可以在 专区 内查看其他创作者的纪念日文章 我的创作纪念日第512天 文章目录 我的创作纪念日第512天一、与CSDN平台的相遇1. 为什么在CSDN这个平台进行创作?2. 创作这些文章是为了赚钱吗&#xff1f…

详细说说机器学习在安防领域的应用

机器学习在安防领域的应用日益广泛,其强大的数据分析和模式识别能力为安全监控、预警和防范带来了革命性的变化。以下是机器学习在安防领域的几个主要应用: 异常检测: 通过学习监控画面中的正常运行状态,智能安防系统可以在遇到异…

算法金 | AI 基石,无处不在的朴素贝叶斯算法

大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」 历史上,许多杰出人才在他们有生之年默默无闻, 却在逝世后被人们广泛追忆和崇拜。 18世纪的数学家托马斯贝叶斯…

用函数指针求a和b中的大者

指针变量也可以指向一个函数。一个函数在编译时被分配给一个入口地址。这个函数入口地址就称为函数的指针。可以用一个指针变量指向函数,然后通过该指针变量调用此函数。 先按一般方法编写程序: 可以用一个指针变量指向max函数,然后通过该指…

【python/pytorch】已解决ModuleNotFoundError: No module named ‘torch‘

【PyTorch】成功解决ModuleNotFoundError: No module named torch 一、引言 在深度学习领域,PyTorch作为一款强大的开源机器学习库,受到了众多研究者和开发者的青睐。然而,在安装和使用PyTorch的过程中,有时会遇到一些问题和挑战…

NLP--词袋模型

词袋模型如同所有单词打散放到一个袋子中,因此这种模型无法估计语义和语序问题,每个单词都是独立的。 1.文本分词:调用jieba库,使用精确模式对每个句子进行分词,并存入列表。 2.去除停用词:遍历停用词文件…

地图元素。

常见的地图元素: 道路(Road): 主要道路(如高速公路、主干道)次要道路(如街道、小巷)辅助道路(如人行道、自行车道)车道(Lane)&#x…

爬山算法介绍(极简)

一、引言 爬山算法,作为一种启发式搜索算法,是人工智能和运筹学领域中的经典算法之一。它通过模拟人类爬山的直观过程,逐步向评价函数值更优的方向“攀爬”,以期找到局部最优解。尽管这种算法有其局限性,特别是容易陷入…

排序-快排算法对数组进行排序

目录 一、问题描述 二、解题思路 1.初始化 2.将右侧小于基准元素移到左边 3.将左侧大于基准元素移到右边 4.重复执行上面的操作 5.对分好的左、右分区再次执行分区操作 6.最终排序结果 三、代码实现 四、刷题链接 一、问题描述 二、解题思路 快排算法实现数组排序&am…