@rmw/srv

0.0.3 • Public • Published

@rmw/srv

安装

yarn add @rmw/srv

或者

npm install @rmw/srv

使用

#!/usr/bin/env coffee

import BASE64 from 'urlsafe-base64'
import srv from '@rmw/srv'
import redis from '@rmw/srv/redis'
import rxdb from './rxdb'

do =>
  db = await rxdb()
  down = await srv(db)
  addr = "p4bHzAquvx_5h_tK5j-WpQokOhv7JteHbPfADIIP2bQ"
  key = BASE64.decode(addr)
  addrbin = Buffer.from(key)
  if await redis.incrby("task.id",0)
    return
  for url in "test xaa test.txt 1.mp4".split(' ')
    console.log "get url", url
    await down.get(
      key.toString 'binary'
      url
      [
        addrbin.toString 'binary'
      ]
    )

  #process.exit()

给本地http用的接口 api上传文件 api上传文件夹

给nkn网络用的接口

下载文件

请求 文件路径 偏离[没有设置默认为0] 响应 文件路径 偏离 [文件大小(偏移为0的时候)] 文件内容[最多1MB]

订阅告知 请求一下 /.rmw/follow 更新告知 请求一下 /.rmw/update 频道hash

接受文件的流程

  1. offset 为 0 并且 END,写入文件
  2. offset 为 0 不是 END,生成请求任务队列,创建稀疏文件
  3. offset 不为 0 ,写入文件,检查任务队列,看看是否完结
  • [url,offset] 下次请求时间
  • url 地址 list // 结尾插入4字节的数字,遇到暂停

数据库规划

任务id 任务地址 任务url

表1 redis 任务 有待下载的offset list

表2 sqlite 任务id 服务器地址 offset 超时时间 重试次数 每次失败后,选择另外一个offset,如果连续失败3次,换下一个源

表3 任务id 未使用的源 0 已经使用的源

新建任务

随机选一个地址发一个请求

请求响应

如果是结束,结束

如果不是结束,按MB切分offset,用hset和zipint记录offset # https://github.com/rmw-lib/zipint#readme 

统计请求发送频率可以得知速度(会记住历史的请求速度用来启动)

如果任务队列中有任务,从任务队列中取任务,否则从任务池中取任务

任务队列

每分钟发出的请求数 = 上一分钟响应的请求数+16

给每个地址分配一个任务队列,如果响应了,就从自己队列中取,如果没有了,就窃取新队列的切片 每个队列每3秒发n=1个新请求(调整n可以限速),每当一个请求响应了,追加一个请求,如果连续60秒没有响应,那么

关于

本项目隶属于人民网络(rmw.link) 代码计划。

人民网络

Readme

Keywords

none

Package Sidebar

Install

npm i @rmw/srv

Weekly Downloads

0

Version

0.0.3

License

MulanPSL-2.0

Unpacked Size

35.7 kB

Total Files

25

Last publish

Collaborators

  • gcxfd