开发需求
今天处于项目需要,需要开发一个Docker镜像推送同步的模块.
具体的需求如下:
服务器端维护需要推送的Docker镜像,并且可以对其进行任意修改.
当镜像版本趋于稳定的时候,服务器端可以通知各个客户端来拉取新版本的镜像.
客户端可以选择更新镜像或者不更新,不更新的话,部分新版镜像下使用的功能无法使用
客户端在下载镜像的时候需要可以断点续传,并且下载完Image后,自动上传到客户端之后定的Docker容器中,并进行版本更迭
业务流程梳理
服务器端和客户端心跳
客户端Docker环境更新
开发任务分解
- 现有平台基础上,记录Docker环境版本信息并维护
- 从服务器端获取镜像文件并放到服务器端的文件服务器
- 服务器端和客户端心跳交互,并自动记录全部可用服务器
- 客户端上线,向服务器端发送自己的信息,之后每隔一段时间发送心跳
- 服务器端记录每个新上线的客户端,定期监测心跳,并将无用的下线
- 客户端断点续传下载新版镜像文件
- 客户端下载完成后,自动上传到容器,并更新现有的环境(现有环境中可能存在正在运行的任务要注意)
可以看到除去心跳部分,实际上大部分的工作其实都是客户端的
开发记录
任务基本上就是这些,还没开始具体设计过程中可能会用到的数据结构什么的.就先从不涉及到数据库,但又能快速实现的东西上来说吧.
断点续传
实现断点续传,有比较关键的三点
1.操作文件的时候使用 RandomAccessFile
,该对象提供的方法可以让我们自由定位当前的游标位置
2.请求文件的时候需要定义好请求的数据区间
3.需要临时文件随时记录当前已经写好的数据下标
另外还有就是尽可能不要在下载的时候使用多线程,可以这么做,但是对于游标的处理会更加复杂,不及建议一开始就这么处理,先处理好单线程下载,在考虑多线程的情况
2021-04-08 补充 其实多线程没什么必要,代码不设定传输速度限制的情况下,一般都会跑到最大网速,多线程反而不会提高速度.嗯,如果是多源下载另说,但是就模块需求来说,目前只存在单源下载的情况
具体实现放明天了