Day25 Lab 2 - Object storage 下载续传

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给塞满,容易造成网路下载异常,明天讲上传的部分


<<:  虹语岚访仲夏夜-11(专业的小四篇)

>>:  Day25 黑白照片上色

[Day25]程序菜鸟自学C++资料结构演算法 – 快速排序法(Quick Sort)

前言:讲解完了基础的排序法後,接着要来讲解比较高等的排序法,今天和明天要介绍的都是始於分割资料的排序...

盘点清查与检测扫描 - 安全性检测之弱点扫描

完成铁人赛後一下子就放松下来,该完成的还是继续完成,FIGHT 适用人员: 技术人员。 适用法规: ...

Day_18 NetData

NetData是一个开源的监测系统资源的套件。有非常酷的介面展示目前系统运行的状态(包含cpu/ra...

JavaScript ⑅ES6:展开运算子 & 其余运算子

展开运算子及 其余运算子( 又称 其余参数 ) 他们有共通特点,那就是「 都跟阵列有关 」   写法...

30天打造品牌特色电商网站 Day.24 电商必用的各类提示

相信大家使用网站时,一定会遇到大大小小固有或弹出的提示框,这次的主题就是他! 提示框在用户经验上会以...