快速搭建一个简单的非实时性的任务发布系统

简介

出于某些业务上的原因,每隔半年就要从我们的相当多数量的MySQL服务器上导出数据。虽然有salt等批量工具,但是每次导出都比较烦,写脚本、发送到各个机器、执行导出、检查导出结果、查漏补缺等等。因此写了个通用的导出脚本,将需要导出的表名和需要导出的时间段分离出来,作为参数传入。然后用beego搭建了一个简单的任务发布系统。

流程

由于我们执行的任务实时性要求不高,因此客户端直接设置定时任务每隔10分钟执行即可。逻辑也非常简单:

发布任务时:

  1. 使用者在页面上操作提交;
  2. 服务端获取相关参数;
  3. 服务端存入redis。

执行任务时:

  1. 客户端请求获取任务,服务端从redis中读取并返回任务信息;
  2. 客户端判断任务是否过期,或者是否正在执行任务;
  3. 符合条件的才执行任务;
  4. 推送执行结果给服务端;
  5. 服务端将结果保存在redis,以便之后查询。

UI界面

作为一个业余的菜鸟前端,简单地使用bootstrap写了两个页面,利用到的jquery组件包括bootstrap-datetimepicker和bootstrap-select,dataTables等。

发布任务界面

左边为一堆checkbox,用于选择要导出的表名,右边的textarea输入数据库名,上面的datetimepicker和select分别是选择时间段和任务完成后的RTX弹窗接受者。

任务结果查询页面

就是使用了可以排序的dataTables来展示页面,稍微美化了下状态,如果未完成的任务用个红色的label来显示状态,这样可以容易地发现没有完成或者执行失败的任务。

客户端脚本

用了python,没什么好说的,获取信息,按照之前说的逻辑执行,导出脚本(shell)是用了at命令放后台执行,执行结果是在导出脚本里面提交给服务端的。然而偷懒用了requests,之后才发现好多机器都没有装这个模块,早知用urllib2了。

一些备注

  • 使用了redigo来写redis相关操作;
  • 接口只使用了简单的token验证,时间戳+salt,然后暴露的uri使用了超长的随机名;
  • 偷懒,没有写登录认证等功能,而是使用了beego的ctx.Request.RemoteAddr获取客户端ip,不是某个ip就直接重定向到404页面。

一些废话

  • 这个小项目只用了4小时,从服务端、Web页面到客户端的两个小脚本,也算是敏捷开发了,呵呵;
  • 然而起码50%花在了调Web页面上,囧,果然全栈工程师不是这么好当的;
  • 过年期间打算分享下如何用beego+echars搭建基于bosun的dashboard;
  • 大爱beego了,谢大在微博上说16年年底希望star过万,可惜没有实现,大家可以贡献下star。