Disruptor核心原理

一、初看Disruptor,給人的印象就是RingBuffer是其核心,生產者向RingBuffer中寫入元素,消費者從RingBuffer中消費元素。java

二、RingBuffer究竟是什麼?數組

  • 他是一個環(首尾相接的環)
  • 他用做在不一樣上下文(線程)間傳遞數據的buffer
  • RingBuffer擁有一個序號,這個序號指向數組中下一個可用元素

  1. 先獲取下一個可用序號(4)
  2. 根據4獲取再賦值

三、講一個小故事:扔芝麻與撿芝麻的小故事線程

  • Disruptor說的是生產者和消費者的故事
  • 有一個數組:生產者往裏面扔芝麻,消費者從裏面撿芝麻
  • 可是扔芝麻和撿芝麻也須要考慮速度問題
  1. 消費者撿得速度比扔的快,那麼消費者要停下來,生產者扔了新的芝麻,而後消費者繼續
  2. 數組長度是有限的,生產者到末尾的時候會再從數組的開始位置繼續。這個時候可能追上消費者,消費者尚未從那個地方撿走芝麻,此時生產者須要等待消費者撿走芝麻,而後繼續。
  3. 隨着你不停補充buffer(可能會有相應讀取),這個序號會一直增加,知道繞過這個環

                                                     

如圖,當第13個,須要等待3被消費。十、十一、12替換了以前的0、一、2(被消費了)。3d

四、要找到數組中當前序號指向的元素,能夠經過mod操做。blog

sequence mod array length = array index(取模操做)語法

以上面的RingBuffer爲例(java的mod語法):12%10=2 即第二個位置。二進制

五、事實上,上圖中的RingBuffer只有10個槽徹底是個意外。若是槽的個數是2的N次方,更有利於給予二進制的計算機進行計算。im

相關文章
相關標籤/搜索