關於對java異步編程的思考。


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM