Task一个轻量级的分布式任务计算系统

Task系统设计与使用

Task是一个轻量级的分布式任务计算系统,他能够帮助你快速编写一个能够在集群环境下运行的分布式方法,而这只须要你使用一行代码就能够在你原有的方法上作到.git

一个简单例子:github

public class Hello {

    public void say(String msg) throws InterruptedException {
        Thread.sleep(1000);
        System.out.println(msg);
    }
}


public class SetUp {

    public static void main(String[] args) throws InterruptedException {
        // 获取Hello对象的代理实例
        Hello hello = Task.registerASyncClass(Hello.class);
        // 此时say方法会被当即返回且是被集群中的某个节点给调用了
        hello.say("hello world");
    }
}

Task支持业务场景

Task的设计的目的是支持分布式任务计算,能够做为一款任务执行引擎.支持一下特色:算法

  1. 支持任务的开始\暂停\删除架构

  2. 采用多种调度算法,能够指定任务在特定节点消费\在不一样的Executor上执行并发

  3. 扩展性强,能够对接各类mq服务\executor模块\支持Spring的BeanFactory或者第三方DI容器框架

  4. 支持分布式任务执行,整个调用过程可让开发者无感知异步

  5. 携带监控系统,能够随时了解系统运行的状态分布式

Task系统架构

Task主要分为如下几个模块:工具

图片描述

ClientProxy: 用于获取任务提交的代理对象,如上Task.registerASyncClass(Hello.class)能够获取Hello对象的代理实例,用于提交任务到mq服务。ui

Coding: 能够对方法的调用动做进行描述和重放方法的执行,并能够对描述信息进行序列化存取到mq服务和反序列化成一个Runnable对象

MQ: 用于存放方法调用信息描述的地方,默认支持Redis的List结构队列,并预留扩展用于对接各个MQ组件

Controller: 任务调度的控制中心,负责任务调度路由,任务的开始、暂停等动做

Diapatch: Task采用的是拉取的方式进行任务调用。Dispatch模块设计的目的主要是合适的时间去从MQ中拉取任务并监管任务的执行状况,异常处理

BeanFactory: 任务所属对象的Bean管理,默认采用google的guice管理,已预留扩展,能够方便支持其它DI容器,能够方便扩展Spring的BeanFactory

Executor: 任务真正执行的地方,Dispatch模块会把拉取到任务经过Coding转成Runnable对象,并交给Executor模块,Executor模块相似于本地的ExecutorService框架,用于本地的并发模型。已预留扩展,能够实现本身的Executor模块

你想好了吗

你是否真的须要这样的一个工具,究竟是异步仍是同步,什么样的才能够称的上任务。在使用前,但愿你也能够考虑清楚这些问题。这里我须要声明的是,
能同步的最好不要异步。异步分布执行虽然能够提升系统吞吐量,但它是在高于必定得计算量请求量的状况下才能够显现出来这一特色。当你决定须要它时,
你就要决定放弃及时响应的特性,虽然它能够达到近实时的计算(在无压力下,一个任务默承认能会出现延迟1s执行,这个时间能够设置)。另外,你是否须要的是一个分布式的异步并行框架,
仍是JDK自带的单机并发框架,若是executorservice就能够知足了,那你也没必要使用它了,虽然我我的以为这个在使用时会更方便,但我并不想让你那么作,能知足需求就好
方案永远不止一个,用你最熟悉的吧。

项目地址:https://github.com/WangJunTYTL/task

相关文章
相关标签/搜索