这段时间的工作,使我意识到异步编程是工作中不可少的技能。异步编程分为两种:JVM内部的异步编程和JVM之间的异步编程。本文主要思考JVM内部的异步(简称为异步任务)。JVM之间的异步可以通过MQ等方式实现。

  1、异步任务是什么?

  异步任务是由一系列的事件处理器(EventHandler)和Event(事件)组成,EventHandlers之间的通讯通过Event来实现。每一个EventHandler占用一个线程(Thread)。

  2、异步任务需要提供哪些功能

  A、任务恢复机制:在任务被异常中断的情况下,可以恢复任务。

  B、日志追踪机制:通过日志信息,来判断任务的执行情况,并对失败的任务进行定位。

  C、元素锁定机制:异步任务所涉及到的各种元素,有的需要锁定,防止意外的操作,影响任务得进行。

  3、异步任务的粒度?

  粒度一:Event对应EventHandler。EventHandler响应传过来的Event,单不改变Event的状态

  粒度二:Event对应异步任务。Event在异步任务内部进行传递,内部的EventHandler可以更变Event的状态,并传递到下一个节点。

  4、异步任务如何切分?

  异步任务有多个EventHandler组成,设计一个EventHandler的关键要素是快、全、少。快的含义是减少IO操作,争取所有操作都在内存中完成。IO操作越多,处理时间越长,EventHandler越不稳定,任务完成得越慢。全的含义是每一个handler所处理的事情都是完整有意义的,不可分割的。用数据库的话来说就是一个完整的事务。少的含义是一次完成一件事情。

  5、异步任务可以解决那些问题?

  异步任务可以解决【轮询线程】的问题。过于复杂的轮询线程是脆弱的,因为有太多不可靠因素会导致线程死亡,就算线程的最外层加上try...catch,也仅仅是指标不治本。解决这个问题方式就是把轮询线程分拆成N个相互独立的异步任务,一个任务可以触发新的任务。比如针对【订单下单30分钟后没有进行支付,需要取消订单】的这一需求。可以分解为2个任务:1、每5分钟查询订单是否已经支付的异步任务A;2、取消订单的任务B。

  异步任务可以降低模块之间的耦合。由于Handler之间是通过Event来触发的,耦合程度降至为【数据耦合】。

  6、异步任务需要依赖什么?

  异步任务核心之一是事件派发器,派发器本质上是一个生产者消费者队列,生产者负责发布事件,消费者负责派发事件到处理器中。选择的高性能队列是核心任务,JDK自带的Queue并不能满足要求,可以选择Disruptor框架。

Disruptor是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式实现,或者事件-监听模式的实现,直接称disruptor模式。disruptor最大特点是高性能,其LMAX架构可以获得每秒6百万订单,用1微秒的延迟获得吞吐量为100K+。