本文是介绍 Shiny 的应用之一,哔哩哔哩云投稿。
Shiny 的相关设计和应用,以后也会陆续更新。
云投稿的大致流程如图。但是可能还需要文字说明一下。
首先,运行在各个服务器的爬虫利用YouTube Data API监视特定频道,当检测到新的投稿时,构造时间发送给Shiny API。Shiny中控服务器收到事件之后,将会把该事件分发给Shiny Websocket服务器,后者负责广播给订阅者。
订阅者收到推送的同时,Shiny也开始将这一事件推送给Shiny Node,设计上,将会挑选较为空闲的服务器,Shiny Node将会开始拉取该视频的文件,并把进度实时汇报给中控服务器。
用户看到推送之后如果希望投稿这一视频,就可以开始填写信息,提交之后,客户端从中控服务器拉取信息,得知下载任务的进度——
- 服务器已经完成下载则由中控发送指令,节点服务器开始上传。
- 服务器未完成下载则将上传任务加入队列等待执行。
上传时同时向中控服务器返回上传进度。
以上流程中主要存在的问题有
中控服务器与节点服务器的通讯
由于节点服务器和中控服务器可能相隔甚远,且并没有即时性的要求,所以选择了 HTTP 作为通讯手段。同时上传和下载的进度也选择了HTTP API写入中控数据库。由于不能保证用户到节点服务器的连通性,而且为了数据集中存储,所有任务数据都保存在了中控服务器。节点服务器今后将不再需要部署数据库。
海外服务器上传速度
一是手动采用了七牛的海外节点,今后也可能尝试多线程上传等方案。目前来看七牛北美单线程上传似乎确实不咋样。
哔哩哔哩登录的问题
目前来看破解登录验证码的难度略高,故还是选择了使用chrome extension直接读取用户cookie来保持登录和拿到CSRF Token。