[开源]基于Disruptor的本地异步任务执行框架原理与基本使用

Disruptor高性能之道

Disruptor高性能之道—开篇&介绍

Disruptor高性能之道—False Sharing(伪共享)

Disruptor高性能之道—无锁实现(CAS)

Disruptor高性能之道—内存屏障(Volatile)

Disruptor高性能之道—AvailableBuffer的原理

 

目录

一、前言

二、为什么要写该框架

三、具体实现

1、框架概述与特点​

2、具体实现细节

A、任务引擎实现ExecutorService

B、任务处理器执行与注册

C、任务入参(元数据)与提交

D、失败后任务存储

E、失败后的告警

3、如何使用

四、开源信息

五、惯例


 

一、前言

自从接触到Disruptor之后,就对其框架比较感兴趣,于是对其进行了深入学习。并续推出了”Disruptor高性能之道“系列文章。

在深入学习之后,终于下定决心基于该高性能框架做一个属于自己的框架,这就是本期的开源本地异步任务框架。

二、为什么要写该框架

因为在平时实现本地生产者和消费者模型业务时,我们总是需要自己去实现生产者和消费者线程,同时使用BlockingQueue来实现数据存储。这也是大家比较常用的实现,但是却存在如下问题:

1、每次都自己去写消费线程和线程池,读写BlockingQueue,实现比较繁琐。

2、BlockingQueue写入会加锁,导致性能会有一定的影响。

3、需要处理消费线程的各类异常

因此,为了简化我们平时的开发工作量,提高线程消费性能,我便编写了这套”本地异步任务执行框架“——async-task。该项目已开源,具体开源信息,请查看后续章节。

三、具体实现

1、框架概述与特点

整体架构图如上图。具体流程如下:

A、生产者生成消息,并封装成异步任务,提交到”异步任务系统“.

B、被添加到Disruptor中执行,如果执行失败则重试指定次数

C、如果重试仍然失败,则将任务存储到TaskStorer(可执行实现)元数据存储器中。比如MySQLTaskStorer等

D、存储完元数据之后通过Alarmer(可执行实现)进行告警通知。比ShortMessageAlarmer等。

任务出错之后的恢复:通过上面流程我们已知任务重试失败之后,我们会将数据存储到TaskStorer中,同时通过Alarmer告警通知。此时我们需要先排查任务出错原因,解决直接在利用已知参数重新触发补偿该任务即可。

2、具体实现细节

A、任务引擎实现ExecutorService

核心实现就是就是AsyncTaskEngine类,该类实现了接口ExecutorService,因此我们可以处理所有java原有线程池的任务。

B、任务处理器执行与注册

所有的任务都有一个类型,每个类型对应一个处理器(任务处理器需要业务自己定义)。因此我们处理器都被注册到TaskExecutorRegister中。当我们有新任务进来时,任务引擎就会从注册其中找到对应的执行器,对任务进行执行。

C、任务入参(元数据)与提交

每一个任务都有一个任务入参,入参都会被封装成TaskInfo对象。然后提交到Disruptor中,最后被消费线程处理,并提交给对应的TaskExecutor执行。

D、失败后任务存储

任务失败之后任务都会存到业务自定义的TaskStorer中。以便后期定位问题与恢复补偿任务。默认的TaskStorer实现只是打印了一下任务元数据,其他不做任何处理,所以需要业务自己根据业务场景定义TaskStorer。比如将任务元数据存储到MySQL、MongoDB等数据库中。

E、失败后的告警

任务失败后我们首先存储到TaskStorer中,然后就会调用Alarmer进行告警通知。Alarmer也行要业务自己实现。默认的Alarmer只打印告警内容,并不会执行任何其他告警操作。业务自己可以实现基于短信、邮件等系统的告警通知。

3、如何使用

由于框架扩展性比较强,因此使用方式比较多。这里只介绍点基本的使用,更多详细列子请参考源码test包中的例子。

四、开源信息

开源地址:https://github.com/lifeofcoder/async-task

 

五、惯例

如果你对本文有任何疑问或者高见,欢迎添加公众号共同交流探讨(添加公众号可以获得”Java高级架构“上10G的视频和图文资料哦)。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值