這段時間的工作,使我意識到異步編程是工作中不可少的技能。異步編程分為兩種: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框架。