异步处理模块Gryphon

最近在写一个异步处理模块,叫Gryphon,可以直接通过配置spring bean的方式用于spring项目中,或者用于一般的java应用。写这个模块的主要原因是将之前代码一些需要异步处理的程序和流程分离开来。这里就简单讲讲整个设计过程吧。

1、为什么要写这个模块

很多应用程序,特别是web应用在处理用户请求时对相应时间的要求是极高的,所以我们会尽可能的将有效的运算结果返回给用户,而尽量避免一些和结果无关的运算(如果一次接口的响应要控制在5ms内,任何一次多余的运算都会致命的)。可是有时候这样的事情是避免不了的,比如用户登录之后,系统会查询一次用户的信息并返回给用户,同时会做一次数据的订正操作,或者是更新操作,那么这种更新操作就可以通过异步的模块去实现,而没必要在返回流程种去运算。

2、相似的设计思路在哪里有

举两个例子,第一个,我们经常会用消息系统去截耦异构系统,或者去处理一些非立即返回的任务。比如用户登录系统之后,后台会发送一个消息给用户行为分析的系统去分析用户的历史行为获得一些推荐数据,而当前系统则直接返回用户的相关信息。第二个,有一个叫asynchbase的客户端,他是hbase的java客户端,他和基本的hbase的客户端不同,asynchbase不会阻塞调用线程,做到了在连接层的完全异步。

3、每次启动一个线程不就解决问题了吗

我们有一个系统的代码中确实有人直接在每个需要异步处理的时候直接new出一个thread来解决问题,这种方式确实能解决问题,而且也很简单,但是是不是粗暴了点。当然,对于一般的小应用这样做一般是不会出太大问题的,但如果你的应用qps很高,并且每个异步任务的消耗都比较大,这样直接启一个线程就很容易导致内存溢出等问题。

4、线程池是不是就解决了问题

线程池能解决问题,但是只能解决一部分问题。很容易能想到用线程池来全局的解决上述的问题,而且java自带的线程池也提供了各种策略来保护程序的稳定性。但是我们还是要注意到一些问题。默认的如果线程池无法再接受任务的时候,他是无法把任务保存下来的,而Gryphon要做的很重要的一步就是将任务保存下来,等空闲时再执行。并且传统的线程池在写法上比较复杂,你当然不愿意见到程序里一大堆runnable或者callable。

5、Gryphon是什么

Gryphon算不上框架,只是一个异步处理任务的模块,一个对ThreadPoolExecutor进行了简单封装和扩展的模块。在0.1.x版本中,主要实现了如下功能:

  • 支持异步任务的执行
  • 支持同步任务的执行,支持回调(任务结束后产生结果,并执行回调)
  • 不同模式的线程池选择(后期将会支持无锁队列来提高性能)
  • 内存保护
  • 任务队列溢出解决方案(本地序列化、消息接口等)
  • 可视化任务监控
并且使用Gryphon时也十分简单,在spring项目中只需要配置相应的bean和相应的溢出策略即可,在程序中只需要如下执行:

cachedThreadPool.sumbitTask(new AsyncTask<String>(new Handler<String>() {
            @Override
            public void beforeHandle() {
                System.out.println("before....");
            }

            @Override
            public String handle() {
                System.out.println("handler...");
                try {
                    Thread.sleep(10000);
                } catch (InterruptedException e) {

                }
                return "handler after";
            }

            @Override
            public void afterHandle(String value) {
                System.out.println(value);
            }
        }));



当然模块还提供了handler的adapter接口,可以让程序实现的更简洁。

6、Gryphon将会是怎么样

我在0.1.x的版本中其实就引入了topic的概念,但是没有去具体实现,针对每个topic,在后期的实现中将会采取顺序和事务处理,确保同一topic中任务执行的顺序。另外,我更想做的是将将这个模块可以在集群中协同作用,可以横向扩展来无限扩展内存中任务队列的容量。

现在版本已经基本实现了异步任务处理队列的功能,等可视化任务监控的web页面实现完后就将代码放出来,任务处理程序的性能还没有测试,在放出代码同时会提供性能测试数据。



你可能感兴趣的:(线程池,异步,Gryphon)