百度网盘同步服务.
https://pan.baidu.com/rest/2.0/xpan/nas?method=uinfo&access_token=
POST /pcs/task/create
{
"taskId": 123,
"accessToken": "121.46244fe164854ecb78c5b3a78122fd59.YDlAzR4bfkEABd0xiIdEzUH5tnK09kZYk_VBUe8.CsdO9g",
"createTime": 1626774286,
"uploadDir": "hello",
"isOverwrite": true,
"callbackUrl": "http://media.suconghou.cn/upload.php"
}
文件上传后会分批回调此接口
回调数据
{
"taskId": 123,
"errorMsg": "",
"status": 1,
"photos": [
1233,
1234
]
}
status
0 正常 1 任务完成 2 任务异常终止
photos
数组始终表示的是成功的数据
失败的数据将在errorMsg中体现,每行一个
回调地址必须响应http状态码200,body字符串 ok
表示处理成功(无换行符)
否则, 系统将立即发起重试,最多重试3次,若仍失败,则回调任务积压,本批回调任务会和后续下一批一同发送
最多积压6小时,超时作废.
特例: 当本身就是最后一批任务的回调时,如果重试3次仍失败,则作废 (因为这个没有后续的一批了)
POST /pcs/task/push
{
"taskId": 123,
"uploadDir": "home",
"no": 1,
"isEnd": true,
"photos": [
{
"photoId": 1233,
"photoName": "1.jpg",
"photoUrl": "https://s.tupianzhibo.cn/image/jpeg/20210708/152935/FvwVLQYJcMDGgiEiTs8kmBpMMtjk5444.jpg!p1600"
},
{
"photoId": 1234,
"photoName": "2.jpg",
"photoUrl": "https://s.tupianzhibo.cn/image/jpeg/20210708/152745/Fi--0gRDVdTmwKQLqjxzntqm7f06686.jpg!p1600"
}
]
}
taskId
必须在之前调用[创建任务]创建过
每次创建的任务6小时内有效,所以此分批任务也必须6小时内发送完毕.
header token 鉴权
回调时,也同样回传此token,业务系统需校验此回调token
创建任务时指定回调地址
回调以POST
application/json
回调创建任务时配置的地址.
任务ID -> 任务配置
系统根据配置的TASK_INDEX_KEY
作为一个持久键,用作任务发现.
所有创建的任务均存储在此键下.
依据此键(例如键为taskdev
)
派生出队列2个(例如taskId为123)
主队列 taskdev::list::123
备份队列 taskdev::list::123.bak
回调任务的hash一个 taskdev:callback:123
分批任务均存储在主队列,系统消费时,使用RPopLPush
原子操作
取出主队列最右侧一个,加入备份队列左侧,并返回这个数据.
系统执行这个上传任务,执行完毕后,注册一个回调任务.然后清空备份队列.
待执行到一定阶段时,统一触发回调任务,然后回调成功后,清空这个hash.
若在执行中途崩溃,可能会出现 备份队列 存在数据,则下次启动时,检查备份队列,重新加入主队列右侧.然后清空备份队列.
因主队列最后一个是结束标记,所以此处填充主队列是右填充.
重启时,系统也会检查是否有未执行成功的回调任务,如果有,也会再次执行. (避免重启后没有任务了,而无法触发积压到一定阶段回调)
redis服务器地址和密码
REDIS_SERVER
REDIS_PASSWORD
TOKEN 接口鉴权token
TASK_INDEX_KEY 任务中心key,此键的Hash,存储所有任务索引,用作任务发现
INTERNAL 内网解析地址,用于七牛内网下载
APP_DIR 应用的文件夹名称,没有/. 例如 映目云摄影
华北HTTP内网下载IP地址 free-qvm-hbzz-gate-io.qiniu.com
使用的redis db 为 1
本次测试,可以直接 make dev
编译docker镜像并推送 make docker
正式环境部署在七牛114服务器.
docker run -d -m 600m \
--name pcsuploader_dev \
--log-opt max-size=5m \
--restart always \
-e REDIS_SERVER="127.0.0.1:6379" \
-e REDIS_PASSWORD="will2020" \
-e TOKEN="1234" \
-e APP_DIR="映目云摄影" \
-e INTERNAL="free-qvm-hbzz-gate-io.qiniu.com" \
-e TASK_INDEX_KEY="taskdev" \
--network host \
registry.cn-beijing.aliyuncs.com/willdocker/pcsuploader:latest pcsuploader -p 1717
其中TASK_INDEX_KEY
区分正式和beta,dev
可以配置成 taskv1
taskbeta
taskdev
等 , 端口号分别使用 1719 1718 1717
照片限制最大20MB
因上传需计算每个分片的md5,所以文件全部载入内存,不适合大文件上传.