Object的下载需要涉及从多个data server拿到component并组合再一起,流程如下图所示
由於我们有metadata,所以能直接知道Object的components存放在哪个data server,如getObj所示
def getObj(name, version):
metadata = DB.getMetadata(name, version)
hash = metadata['hash']
dataSize = metadata['size']
locate = metadata['locate']
locate.sort(key=lambda x: x[1]) # x[1] is idx
data = b''
for server, idx, size in locate:
try:
res = requests.get(f"http://{server}:{PORT}/partition/{hash}-{idx}", timeout=1)
if res.status_code == 201:
return -1
else:
data += res.content
except Exception as e:
print('request error: %s' % e, flush=True)
data += b'x'*size
return combineData(data)
https://github.com/kaichiachen/python-simple-object-storage/blob/master/distributed_obj_system/backend/api/obj.py#L61
如果遇到一个data server有问题,就填充x,我们支持最多两个server出问题,最後再combineData,把奇偶校验值decode我们原来的资料
理解完在Download前是怎麽把Components合成一个Object之後,我们来看怎麽下载续传
start = request.args.get('start')
data = getObj(obj_name, version)
data = data[start:]
def gen():
chunk = 10
for i in range(0,len(data),chunk):
yield bytes(data[i:i+chunk])
return Response(gen(), mimetype='text/xml')
https://github.com/kaichiachen/python-simple-object-storage/blob/master/distributed_obj_system/backend/api/run.py#L50
我们可以看到我们还需要传递一个参数 - start,指定从哪里开始下载,然後为了维持下载的连续性,我们把object分成块状,一次只传递10个bytes,如果不这麽做的话,有10GB的Data,会把Buffer给塞满,容易造成网路下载异常,明天讲上传的部分
前言:讲解完了基础的排序法後,接着要来讲解比较高等的排序法,今天和明天要介绍的都是始於分割资料的排序...
完成铁人赛後一下子就放松下来,该完成的还是继续完成,FIGHT 适用人员: 技术人员。 适用法规: ...
NetData是一个开源的监测系统资源的套件。有非常酷的介面展示目前系统运行的状态(包含cpu/ra...
展开运算子及 其余运算子( 又称 其余参数 ) 他们有共通特点,那就是「 都跟阵列有关 」 写法...
相信大家使用网站时,一定会遇到大大小小固有或弹出的提示框,这次的主题就是他! 提示框在用户经验上会以...