【niubi-job——一个分布式的任务调度框架】----niubi-job这下更牛逼了!
niubi-job迎来第一次重大优化
niubi-job是一款专门针对定时任务所设计的分布式任务调度框架,它可以进行动态发布任务,并且有超高的可用性保证。
有多少人半夜被叫起来查BUG,结果差到最后发现,是因为某个定时任务挂了导致出了问题?
有了niubi-job,你再也不用担心这个问题!
又有多少人因为要发布一个新的定时任务,为了不影响线上的运行,只能等到半夜再去发布应用?
有了niubi-job,你可以随时发布你的定时任务而且不会影响当前任务的运行!
是不是很兴奋呢?
还有更兴奋的呢,那就是niubi-job发布了全新的0.9.4.2版本,这可是niubi-job历史上一次重大版本的变更,前后共历时将近一个月才完成。虽然这中间由于本人换工作,拖延了一些时间,但niubi-job从零到有,整个第一个版本的开发才花了本人大约三个星期的时间,而本次变更就花费了一个月的时间,可见这一次变更有多么重大了吧。
接下来,咱们就看看这个版本都有哪些优化吧。
0.9.4.2最大的优化——性能优化
niubi-job发布任务的方式是在Web控制台上传jar包,在Web控制台上面操作任务的启动、暂停以及重启。
而之前niubi-job的设计有一个缺陷,那就是每一个jar包都会对应一个线程池(默认线程池的大小为10个线程)。一种可能的情况是,你先发布了task-1.0.jar,里面包含了1到10一共十个任务。后来你修改了1号任务,于是你上传了task-1.1.jar,这个时候,你的task-1.0.jar对应了一个线程池,里面跑了9个任务,而你的task-1.1.jar也对应了一个线程池,里面只跑了一个任务。
更可怕的是,你先后陆续把10个任务都发布了一遍,一直到task-1.10.jar。这个时候,将会被启动10个线程池(共计100个线程),但是每一个线程池只跑一个任务(有90个线程在空转),这是一种很大的资源浪费。
第一次niubi-job在发布时,为了尽快推出,并没有将不同jar包的线程池合并,因为在类加载的过程中会有一些复杂性。
如今好了,niubi-job已经正式将线程池合并,哪怕你有成千上万个jar包,一个任务集群节点都只会有一个线程池。也就是说,针对上面的情况,假设你将线程池的大小设定为20,那么将有10个任务在运行,另外10个线程等待新的任务加入。如此一来,很显然在极大程度上提升了niubi-job的负载能力。
是不是很酷呢?
0.9.4.2版全新console界面与教程
上面只是针对niubi-job性能上的优化,本次版本还针对console界面做了一些美化,接下来就一起欣赏一下吧。
使用默认的用户名admin和密码123456登录即可。
登录以后你可以看到下图,这是选择模式的界面。
niubi-job支持主从和主备模式,两种模式的操作界面是一模一样的,因此我们这里拿主从模式来做例子,选择“master-slave”模式进入下图。
本人给每个菜单都注明了它的作用,通常情况下,我们的操作顺序是这样的。
1、上传你的任务jar包。
2、点击“upload”上传成功后,你会进入如下界面。
3、这个时候,如果你想对任务进行操作,请点击“schedule”按钮,进入如下界面。
4、通常情况下,你只需要填写下cron表达式,选择一下jar包版本,点击“execute”按钮,即可启动一个任务。启动以后,你过几秒刷新一下就可以看到以下界面。(友情提醒:如果你的任务状态一直处于“executing”状态,你可以手动点击“synchronize”按钮来手动同步任务状态)
到此,其实你已经启动了一个任务,如果你想暂停任务,或者更改它的cron表达式并且重启任务,那么只需要继续点击“schedule”按钮进行操作即可。
console的一些其它功能
当你启动完任务后,你进入操作日志界面,可以看到如下操作日志。(友情提醒:本文只有一个start操作,其余两个操作是本人私底下操作产生的,不用惊讶哦)
另外,niubi-job支持多jar包版本,因此当你只上传一个jar包时,所有任务列表是这样的。
当你再次上传一个1.1版本的jar包时,所有任务的列表是这样的。
这两个jar包里的任务是一样的,都是Job1和Job2。但是一般情况下,1.1版本你可能对Job1或者Job2做了一些改动。这个时候,在所有任务列表会显示你所有的任务,以任务的唯一标识和jar包名称为联合主键。但是在可操作的任务列表里,会自动按照任务的唯一标识去重,也就是说,不管你上传多少个版本的Job1和Job2,在可操作的任务列表里,永远都只有一个Job1和Job2。
就像下图这样。
如果你给一个任务上传了多个版本的jar包,那么在你调度该任务时,你可以选择你的jar包版本。就像下图一样。
此外,你可以在集群节点列表看到你所有的集群节点,这些节点都是你用niubi-job-cluster包启动的用于执行任务的节点,如下图。
刚才我们启动了一个任务,因此你会看到集群节点中,有一个任务数已经变成了1,代表它现在运行了一个任务。
浅谈下niubi-job未来的规划
现在的niubi-job架构已经基本稳定了,接下来要做的是继续添加功能的支持,目前已经被添加到日程的功能如下。
1、支持启动任务时给任务方法传递参数。
2、支持单次运行任务。(现在用cron表达式其实也可以变相达到这一目的,但不够直观)
3、支持启动任务时指定某一个集群节点运行。
4、支持给集群节点分组,并且可以给任务添加到某个集群节点分组。(这样做的目的是,如果一个公司有两个或者更多项目组,那么可以给每个项目组分配几个集群节点作为一个分组,每个项目组的任务优先会在自己的集群节点上运行,不会影响其它的。只有当自己分组的集群节点挂完了,才会暂时借用其它分组的集群节点运行任务。当本分组的节点恢复时,再回到自己的集群节点分组上运行)
5、目前的负载均衡策略是简单的基于任务运行个数。也就是说假设有6个任务,3个节点,那么每个节点会运行2个任务。后期会给任务的每个指标加权,使得负载均衡更加智能化。比如有6个任务,但是可能其余五个任务都是几十秒就跑完了,但是有一个任务得跑10个小时才能跑完,这个时候只基于个数分配就有点不太合适了。我们将记录每个任务的运行时间,以及它占用的资源,来动态的进行负载均衡。
6、运维指标监控。这些指标包括集群节点和任务的指标。比如每个集群节点的CPU占用,内存占用等等。再比如每个任务每次的运行时间,是否成功等。
7、给控制台添加更加细粒度的权限控制,和4功能相似,也是为了不同项目组之间的隔离,自己项目组的人只能操作自己项目任务的启动、停止等操作。
8、其它用户提出的需求。
结语
niubi-job不同于本人的其它开源项目,这个项目将会被持续优化下去。因此如果大家遇到了定时任务不好处理的问题,可以尝试使用niubi-job哦。
最后,希望大家踊跃的提出ISSUE和PR,本人的github地址在博客栏左侧。此外,左侧还有本人的直播地址,在直播中,本人也会解答niubi-job的问题,大家也可以关注一下。
好了,本文就到此为止了,感谢大家看到最后。
鞠躬,-_-。
【niubi-job——一个分布式的任务调度框架】----niubi-job这下更牛逼了!的更多相关文章
- 【niubi-job——一个分布式的任务调度框架】----框架设计原理以及实现
引言 niubi-job的框架设计是非常简单实用的一套设计,去掉了很多其它调度框架中,锦上添花但并非必须的组件,例如MQ消息通讯组件(kafka等).它的框架设计核心思想是,让每一个jar包可以相对之 ...
- niubi-job:一个分布式的任务调度框架设计原理以及实现
niubi-job的框架设计是非常简单实用的一套设计,去掉了很多其它调度框架中,锦上添花但并非必须的组件,例如MQ消息通讯组件(kafka等).它的框架设计核心思想是,让每一个jar包可以相对之间独立 ...
- 【niubi-job——一个分布式的任务调度框架】----如何开发一个niubi-job的定时任务
引言 上篇文章LZ主要讲解了niubi-job如何安装,如果看过上一篇文章的话,大家应该知道,niubi-job执行的任务是需要用户自己上传jar包的. 那么问题来了,这个jar包如何产生?有没有要求 ...
- 【niubi-job——一个分布式的任务调度框架】----安装教程
niubi-job是什么 niubi-job是LZ耗时三个星期,费尽心血打造的一个具备高可靠性以及水平扩展能力的分布式任务调度框架,采用quartz作为底层的任务调度管理器,zookeeper做集群的 ...
- 【niubi-job——一个分布式的任务调度框架】----FAQ文档
引言 本文为niubi-job的FAQ文档,该文档会无限更新.如果您在这里没有找到您想要的答案,请把问题提交到这里. FAQ 1.为什么我的所有任务总是运行在同一个节点上,而没有平均分配到所有节点上? ...
- 动手实现一个简单的 rpc 框架到入门 grpc (下)
之前手动实现了一次简陋的 rpc 调用,为了简单使用了 json 编码信息,其实这是非常不可靠的,go 中 json 解析会有一些问题,比如整数会变成浮点数,而且 json 字符串比较占空间. gRP ...
- Cola:一个分布式爬虫框架 - 系统架构 - Python4cn(news, jobs)
Cola:一个分布式爬虫框架 - 系统架构 - Python4cn(news, jobs) Cola:一个分布式爬虫框架 发布时间:2013-06-17 14:58:27, 关注:+2034, 赞美: ...
- Java线程池管理及分布式Hadoop调度框架搭建
平时的开发中线程是个少不了的东西,比如tomcat里的servlet就是线程,没有线程我们如何提供多用户访问呢?不过很多刚开始接触线程的开发工程师却在这个上面吃了不少苦头. 怎么做一套简便的线程开发模 ...
- Quartz.Net任务调度框架
Quartz.Net是一个开源的任务调度框架,非常强大,能够通过简单的配置帮助我们定时具体的操作. 相对于我们用的线程里面while(true)然后sleep来执行某个操作,应该算的上是高端,大气,上 ...
随机推荐
- 不用synchronized块的话如何实现一个原子的i++?
上周被问到这个问题,没想出来,后来提示说concurrent包里的原子类.回来学习一下. 一.何谓Atomic? Atomic一词跟原子有点关系,后者曾被人认为是最小物质的单位.计算机中的Atomic ...
- emacs24下使用jedi对python编程进行补全
在开始前先装好pip和virtualenv(见pip的安装一文),另需安装好make 1.emacs下安装: epc deferred.el auto-complete 使用M-x package-i ...
- Spring自定义一个拦截器类SomeInterceptor,实现HandlerInterceptor接口及其方法的实例
利用Spring的拦截器可以在处理器Controller方法执行前和后增加逻辑代码,了解拦截器中preHandle.postHandle和afterCompletion方法执行时机. 自定义一个拦截器 ...
- Libfilth(一个滤波器C库)使用
Libfilth使用说明 winshton 2009年2月 (*本文大部分翻译自libfilth,还有一部分是个人使用实践 *时间水平均有限,翻译的不完整,尤其第二章可以忽略) 版本历史修改记录 版本 ...
- 初始化httpclient的几种方式
1.CloseableHttpClient httpclient = HttpClients.createDefault(); 2.DefaultHttpClient client = new Def ...
- selenium使用等待的几种方式
1.使用java的sleep try { Thread.sleep(3000); } catch (InterruptedException e) { // TODO Auto-generated c ...
- POJ 1061 青蛙的约会【扩展欧几里德】
设跳的次数为t 根据题意可得以下公式:(x+mt)%L=(y+nt)%L 变形得 (x+mt)-(y+nt)=kL (n-m)t+kL=x-y 令a=(n-m),b=L,c=x-y 得 at+bk=c ...
- Android 屏幕适配(一)百分比布局库(percent-support-lib) 解析与扩展
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/46695347: 本文出自:[张鸿洋的博客] 一.概述 周末游戏打得过猛,于是周 ...
- mysqli预处理和事务处理
1 应用环境 mysqli预处理功能(大量数据处理时使用) 2 步骤 a)mysqli连接数据库 $mysqli = new mysqli('localhost','root','root','chu ...
- Linux下CGroup使用说明梳理
CGroup 介绍CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制.记录.隔离进程组 (process groups) 所使用的物力资源 (如 cpu m ...