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的設計的目的是支持分佈式任務計算,能夠做爲一款任務執行引擎.支持一下特色:算法
支持任務的開始\暫停\刪除架構
採用多種調度算法,能夠指定任務在特定節點消費\在不一樣的Executor上執行併發
擴展性強,能夠對接各類mq服務\executor模塊\支持Spring的BeanFactory或者第三方DI容器框架
支持分佈式任務執行,整個調用過程可讓開發者無感知異步
攜帶監控系統,能夠隨時瞭解系統運行的狀態分佈式
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