Disruptor高性能之道
Disruptor高性能之道—开篇&介绍
Disruptor高性能之道—False Sharing(伪共享)
Disruptor高性能之道—无锁实现(CAS)
Disruptor高性能之道—内存屏障(Volatile)
Disruptor高性能之道—AvailableBuffer的原理
目录
一、前言
自从接触到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的视频和图文资料哦)。