Disruptor

一 .什麼是 Disruptor 算法

從功能上來看,Disruptor 是實現了「隊列」的功能,並且是一個有界隊列。那麼它的應用場景天然就是「生產者-消費者」模型的應用場合了。緩存

能夠拿 JDK 的 BlockingQueue 作一個簡單對比,以便更好地認識 Disruptor 是什麼。架構

咱們知道 BlockingQueue 是一個 FIFO 隊列,生產者(Producer)往隊列裏發佈(publish)一項事件(或稱之爲「消息」也能夠)時,消費者(Consumer)能得到通知;若是沒有事件時,消費者被堵塞,直到生產者發佈了新的事件。併發

這些都是 Disruptor 能作到的,與之不一樣的是,Disruptor 能作更多:oop

  • 同一個「事件」能夠有多個消費者,消費者之間既能夠並行處理,也能夠相互依賴造成處理的前後次序(造成一個依賴圖);
  • 預分配用於存儲事件內容的內存空間;
  • 針對極高的性能目標而實現的極度優化和無鎖的設計;

以上的描述雖然簡單地指出了 Disruptor 是什麼,但對於它「能作什麼」還不是那麼直截了當。通常性地來講,當你須要在兩個獨立的處理過程(兩個線程)之間交換數據時,就能夠使用 Disruptor 。固然使用隊列(如上面提到的 BlockingQueue)也能夠,只不過 Disruptor 作得更好。性能

拿隊列來做比較的作法弱化了對 Disruptor 有多強大的認識,若是想要對此有更多的瞭解,能夠仔細看看 Disruptor 在其東家 LMAX 交易平臺(也是實現者) 是如何做爲核心架構來使用的,這方面就不作詳述了,問度娘或谷哥都能找到。優化

 

2、Disruptor 的核心概念線程

先從瞭解 Disruptor 的核心概念開始,來了解它是如何運做的。下面介紹的概念模型,既是領域對象,也是映射到代碼實現上的核心對象。設計

  • Ring Buffer
    如其名,環形的緩衝區。曾經 RingBuffer 是 Disruptor 中的最主要的對象,但從3.0版本開始,其職責被簡化爲僅僅負責對經過 Disruptor 進行交換的數據(事件)進行存儲和更新。在一些更高級的應用場景中,Ring Buffer 能夠由用戶的自定義實現來徹底替代。
  • Sequence  Disruptor
    經過順序遞增的序號來編號管理經過其進行交換的數據(事件),對數據(事件)的處理過程老是沿着序號逐個遞增處理。一個 Sequence 用於跟蹤標識某個特定的事件處理者( RingBuffer/Consumer )的處理進度。雖然一個 AtomicLong 也能夠用於標識進度,但定義 Sequence 來負責該問題還有另外一個目的,那就是防止不一樣的 Sequence 之間的CPU緩存僞共享(Flase Sharing)問題。
    (注:這是 Disruptor 實現高性能的關鍵點之一,網上關於僞共享問題的介紹已經汗牛充棟,在此再也不贅述)。
  • Sequencer 
    Sequencer 是 Disruptor 的真正核心。此接口有兩個實現類 SingleProducerSequencer、MultiProducerSequencer ,它們定義在生產者和消費者之間快速、正確地傳遞數據的併發算法。
  • Sequence Barrier
    用於保持對RingBuffer的 main published Sequence 和Consumer依賴的其它Consumer的 Sequence 的引用。 Sequence Barrier 還定義了決定 Consumer 是否還有可處理的事件的邏輯。
  • Wait Strategy
    定義 Consumer 如何進行等待下一個事件的策略。 (注:Disruptor 定義了多種不一樣的策略,針對不一樣的場景,提供了不同的性能表現)
  • Event
    在 Disruptor 的語義中,生產者和消費者之間進行交換的數據被稱爲事件(Event)。它不是一個被 Disruptor 定義的特定類型,而是由 Disruptor 的使用者定義並指定。
  • EventProcessor
    EventProcessor 持有特定消費者(Consumer)的 Sequence,並提供用於調用事件處理實現的事件循環(Event Loop)。
  • EventHandler
    Disruptor 定義的事件處理接口,由用戶實現,用於處理事件,是 Consumer 的真正實現。
  • Producer
    即生產者,只是泛指調用 Disruptor 發佈事件的用戶代碼,Disruptor 沒有定義特定接口或類型。

相關文章
相關標籤/搜索