Storj用例场景与流程分析

2018-12-28  本文已影响0人  tristan_lee

三种节点的用例

storj_usecase

典型用例场景的流程

用户端上传文件的流程

以下只列举节点间的grpc交互流程(忽略其它流程细节,详细消息结构请查阅相关proto文件):

storj_upload_sequential
  1. 客户端uplink首先根据指定的冗余策略(Redundancy Scheme)计算出所需的存储空间(rs_size),然后向satellite节点的overlay服务(grpc服务)请求所需存储空间
  2. satellite节点返回提供具体存储空间的节点信息(node数组)
  3. 客户端uplink向satellite节点的pointerdb服务(grpc服务)请求存储带宽分配的计费信息PayerBandwidthAllocation结构(简称pba)用于计费
  4. satellite节点返回pba结构
  5. 客户端uplink向所有分配的storage节点的piecestore服务(grpc服务)上传具体数据分片
  6. storage节点向satellite节点提交存储带宽分配agreement信息
  7. 客户端uplink生成上传数据文件的元数据信息(pointer结构)
  8. 客户端uplink将生成的元数据信息(pointer结构)上传给satellite节点的pointerdb服务(grpc服务),satellite节点存储文件的元数据信息以便进行文件数据索引

用户端上传文件流程与相关类图的关系

简单类图:

storj_upload_class_simple

代码流程摘要:

    metainfo, streams, err := cfg.Metainfo(ctx)
    if err != nil {
       return err
    }

    createInfo := storj.CreateObject{
       RedundancyScheme: cfg.GetRedundancyScheme(),
       EncryptionScheme: cfg.GetEncryptionScheme(),
    }
    obj, err := metainfo.CreateObject(ctx, dst.Bucket(), dst.Path(), &createInfo)
    if err != nil {
       return convertError(err, dst)
    }

//......

    mutableStream, err := obj.CreateStream(ctx)
    if err != nil {
        return err
    }

//......

    upload := stream.NewUpload(ctx, mutableStream, streams)
    _, err = io.Copy(upload, reader)

  1. 客户端uplink根据本地配置信息生成一个storj.Metainfo对象metainfo和一个streams.Store对象streams
  2. 由metainfo.CreateObject()根据传入的路径信息创建一个storj.MutableObject对象obj
  3. 由obj.CreateStream()创建一个storj.MutableStream对象mutableStream
  4. 最终由控制类stream.Upload操作对象streams与对象obj完成相关文件数据上传操作

详细扩充类图:

storj_upload_class

用户端下载文件的流程

以下只列举节点间的grpc交互流程(忽略其它流程细节,详细消息结构请查阅相关proto文件)

storj_down_sequential
  1. 客户端uplink首先向satellite节点的overlay服务(grpc服务)请求指定路径的文件的元数据(pointer)
  2. satellite节点返回指定路径的文件的元数据(pointer),具体存储节点信息(node数组),以及pba结构
  3. 客户端uplink将返回的元数据(pointer)组装成storj.Object结构
  4. 客户端uplink根据storj.Object结构的信息向具体storage节点的piecestore服务(grpc服务)请求下载文件数据分片

用户端下载文件流程与相关类图的关系

简单类图:

storj_down_class_simple

代码流程摘要:

metainfo, streams, err := cfg.Metainfo(ctx)
if err != nil {
   return err
}

readOnlyStream, err := metainfo.GetObjectStream(ctx, src.Bucket(), src.Path())
if err != nil {
   return convertError(err, src)
}

download := stream.NewDownload(ctx, readOnlyStream, streams)
  1. 客户端uplink根据本地配置信息生成一个storj.Metainfo对象metainfo和一个streams.Store对象streams
  2. 由metainfo.GetObjectStream()根据传入的路径信息创建一个storj.ReadOnlyStream对象`readOnlyStream``
  3. 最终由控制类stream.Download操作对象streams与对象readOnlyStream完成相关文件数据下载操作

详细扩充类图:

storj_down_class

全文完

上一篇 下一篇

猜你喜欢

热点阅读