数据订正带来的动态任务执行框架的想法
I. 背景
对于后端而言,数据订正可算是非常非常频繁且常见的事情了,常见的有DB、缓存、内存等数据源中的数据订正,对于非应用内存而言,其他有实体或者可以直接通过官方的提供的控制台连接进行修改的数据订正,相对比较简单,而对于应用内存,如果没有应用内通知并处理相关逻辑,多半就只能重启应用来实现刷新内存缓存了
当然我这里说的也不是内存数据更新,最近遇到的一个问题就是redis缓存中的数据有问题,需要订正,而并不是简单的把数据删了就行,需要根据某些数据,做一些计算,然后得出新的数据,并写回到缓存
这样看来好像也不太麻烦,如果没有第三方依赖,大不了写个python脚本或者php脚本,重新算一下,也没什么毛病
然而实际情况却并不是这样,问题有以下几点:
- 数据经过ProtoBuf进行编码存入redis,反序列化是个问题
- 数据计算有依赖外部服务,如只能通过rpc调用第三方接口,而rpc框架没有提供php或python的sdk
基于此,就想也米有办法,可以直接搞一个项目,可以执行Groovy脚本,在Groovy脚本中实现数据订正逻辑?需求如下
- 支持Groovy脚本的动态更新(支持动态新增,删除和修改脚本)
- Groovy脚本可友好的访问我们需要的外部资源
II. 设计
根据上面的想法,一个简单的设计思路就新鲜出炉了,我们的框架核心只需要支持两点即可:
- 实时加载脚本
- 运行脚本
当然为了扩展,以及提供更优雅的使用环境,则需要支持:
- 丰富的插件支持
- json序列化插件
- http插件
- rpc插件
- redis缓存插件
- 自定义各种插件
- 插件可动态加载就更棒了
- 避免蛋疼的jar包冲突
1. 项目结构
项目结构图大致如下
2. 流程说明
a. Task Watcher
主要用来监听所有的Task变动,包括新增,删除or修改脚本,然后将最新的脚本捞出来,扔给框架
b. execute
主体的执行逻辑,主要是解析task(即groovy脚本),并根据task的变更事件,来决定是新增,删除还是更新任务,然后从任务池中停掉旧的任务,执行新的任务
c. plugin
这里提供丰富的第三方插件,供task调用
2. 实现
借助这个想法,创建了一个开源的任务执行框架 QuickTask
下面从设计之初,详细介绍了这个项目的诞生过程及相关细节
- 2018/07/02 180702-QuickTask动态脚本支持框架整体介绍篇
- 2018/07/19 180719-Quick-Task 动态脚本支持框架之使用介绍篇
- 2018/07/23 180723-Quick-Task 动态脚本支持框架之结构设计篇
- 2018/07/29 180729-Quick-Task 动态脚本支持框架之任务动态加载
- 2018/08/07 180807-Quick-Task 动态脚本支持框架之Groovy脚本加载执行
II. 其他
1. 一灰灰Blog: https://liuyueyi.github.io/hexblog
一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛
2. 声明
尽信书则不如,已上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
- 微博地址: 小灰灰Blog
- QQ: 一灰灰/3302797840