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、代碼
代碼先不上