iT邦幫忙

2021 iThome 鐵人賽

DAY 28
0
自我挑戰組

淺入淺出分散式儲存系列 第 28

Day28 Lab 2 - Object storage前端實作

我們的前端並不是一個精美的UI,在本次Lab中實做了前端有兩個目的

  1. 方便測試
  2. 好的前端能減經後端的負擔,例如上傳前對資料進行壓縮

那麼接下來讓我們看看我們前端有什麼功能

  • Upload Object
python frontend.py --type uo --name obj01 --version 1.7.3 --file /home/distributed\_obj\_storage\_system/distributed\_obj\_system/test

首先,在執行frontend.py,我們必須傳遞一個type parameter,指定要做什麼request,type的mapping如下所示

funcMap = {
      'uo': uploadObject,
      'vl': getVersionList,
      'do': downloadObject,
      'ol': getObjLocation,
}

https://github.com/kaichiachen/python-simple-object-storage/blob/master/distributed_obj_system/frontend.py#L114

uo mapping到uploadObject,uploadObject的程式碼如下圖所示

def uploadObject(args):
   content = args.content
   name = args.name
   file = args.file

   if not name:
      print('--name is required')
   if not content and not file:
      print('--name or --file is required')

   if file:
      content = open(file, 'r').read()
   content = compress(content.encode()) # content type will be byte after compress
   hash = sha256(content)
   size = len(content)
   chunk = 10
   for i in range(0, size, chunk):
      res = requests.post(f"{server_url}/objects/{name}", files={
                                                            'obj': content[i:i+chunk],
                                                            'hash':hash,
                                                            'version': args.version,
                                                            'start': i,
                                                            'length': chunk,
                                                            'size': size})
      print(i, chunk, size, res.status_code)

我們傳遞Object的content,可以藉由—content指定內容,或是—file指定檔案位置

  • Download Object
python frontend.py --type do --name obj01 --version 1.7.3

介紹完type的意思後,就直接上Download Object的程式碼了

def downloadObject(args):
   name = args.name
   version = args.version
   if not name:
      print('--name is required')
      return
   if not version:
      print('--version is required')
      return
   # 1. get object size
   size = requests.get(f"{server_url}/objects/size/{name}?version={version}").json()['size']
   print(f'Size of Object: {size} bytes')
   content = b''
   start = 0
   # download object until length of content fits size
   while len(content)<size:
      try:
         content += requests.get(f"{server_url}/objects/{name}?version={version}&start={start}").content
      except KeyboardInterrupt:
         sys.exit()
      except Exception as e:
         start = len(content)
         print('Something wrong, downloading again...', e)
   try:
      print(f'Get content: {decompress(content).decode()}')
   except Exception as e:
      print(f'Something wrong: {e}')

由於前端需要知道我要download的這個object何時要結束,所以需要先request object size,再根據size大小判斷何時結束

  • Version List of an Object
python frontend.py --type vl --name obj01

這部分比較簡單,就是一個簡單的GET request取的metadata的資料,讀者可以自行理解

  • Location where Object store
python frontend.py --type ol --name obj01 --version 1.7.3

這部分比較簡單,就是一個簡單的GET request取的metadata的資料,讀者可以自行理解


上一篇
Day27 數據的壓縮
下一篇
Day29 Lab 2 - Object storage數據壓縮
系列文
淺入淺出分散式儲存30

尚未有邦友留言

立即登入留言