Zookeeper 實現(xiàn)分布式隊列

1、概念

zookeeper 的分布式隊列分為 FIFO(先進先出) 跟 Barrier(柵欄)。

2、FIFO

zookeeper 的分布式隊列跟共享鎖很相近,所有機器都會在 /queue_fifo 目錄下創(chuàng)建一個節(jié)點,例如 /queue_info/127.0.0.1 - 0000001。創(chuàng)建完節(jié)點之后(都是先創(chuàng)建了節(jié)點再說),基本上也算是按照共享鎖的規(guī)則來。

  • 1?? 先獲取 /queue_fifo 下所有子結(jié)點,相當(dāng)于獲取隊列中所有的元素。
  • 2?? 確定自己在序列中的順序
  • 3?? 如果自己是序號最小的子結(jié)點,那么可以出隊列;如果不是序號最小的子結(jié)點,那么向比他小的最后一個結(jié)點注冊 watcher 通知。
  • 4?? 接收到 watcher 通知后,重復(fù) 1?? 流程。

3、Barrier

所謂的 barrier 就是等隊列中所有的元素都聚集完畢了,再開始執(zhí)行,否則就繼續(xù)等待。通常在一下場景使用到:在一個分布式并行計算的場景中,一個大的計算分割成各個小的計算在不同機器上執(zhí)行;執(zhí)行完畢后從小的機器匯總,只有所有的機器的計算匯總完畢后才能執(zhí)行最后的合并,得到最終結(jié)果。

設(shè)計思想如下:開始時,/queue_barrier 是一個已經(jīng)存在的結(jié)點,并且可以設(shè)置一個值 n 表示需要等待多少個元素匯總完畢才能執(zhí)行。然后所有的機器可以在其中創(chuàng)建子結(jié)點,如 /queue_barrier/127.0.0.1_001。創(chuàng)建完畢之后,那么按照一下的規(guī)則執(zhí)行:

  • 1?? 首先獲取 /queue_barrier 的數(shù)據(jù)內(nèi)容 n
  • 2?? 獲取 /queue_barrier 下所有的子結(jié)點,即獲取隊列中的所有的元素,同時對 /queue_barrier 注冊子結(jié)點變更的 watcher 通知。
  • 3?? 統(tǒng)計結(jié)點的個數(shù),達到 n 則執(zhí)行,不足 n 則等待。
  • 4?? 接受 watcher 通知,重復(fù) 1??

4、代碼

代碼先不上

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容