基於zookeeper的分布式佇列之同步佇列

2021-08-30 10:56:58 字數 1563 閱讀 3941

同步佇列,顧名思義就是當佇列中的元素滿了的時候去做事情。

例如:乙個公司組織旅遊,只有當報名了的員工全部到齊後司機才能出發。

我們把需求拆分開:

1、員工簽到,我們可以用zookeeper的znode節點來模擬,在/queue路徑下建立子節點,簽到乙個建立乙個znode節點

2、員工到齊,只有當/queue節點下的子節點滿了以後,才會通知司機發車,比如公司有100個人,那麼就是/queue節點下有100個節點是,才會通知司機出發

3、通知司機,如何通知司機呢?我們可以用zookeeper的事件通知機制,司機客戶端去監控某個節點,比如/start節點,當/queue佇列滿了的時候去建立乙個/start節點,如此,監控了/start節點的客戶端(這裡就是司機客戶端)就會收到事件觸發。

同步佇列如圖:

ok~~~~~講了這麼多,直接上**吧!!

這個是同步佇列的核心**:

public class zkqueue 

private void init()

} catch (keeperexception e) catch (interruptedexception e)

}public void push(string data)

}} catch (keeperexception e) catch (interruptedexception e)

}//獲取到path節點下面的子節點個數

private int size() catch (keeperexception e) catch (interruptedexception e)

return 0;}}

zookeeperutil工具類**:

public class zookeeperutil  else if (event.eventtype.nodecreated == watchedevent

.gettype()) else if (event.eventtype.nodedatachanged ==

watchedevent.gettype()) else if (event.eventtype.nodedeleted == watchedevent

.gettype()) }}

});cdl.await();

client.exists("/start",true);

return client;

} catch (ioexception e) catch (interruptedexception e) catch (keeperexception e)

return null;}}

測試類**:

public class mytest 

}).start();}}

}

ok,大功告成,這個就是同步佇列基於zookeeper的實現~~

基於ZooKeeper實現分布式鎖

zookeeper 保證了資料的強一致性,zk集群中任意節點 乙個zkserver 上的相同znode下的資料一定是相同的。使用zookeeper可以非常簡單的實現分布式鎖,其基本邏輯如下 客戶端呼叫create 方法建立名為 locknode lock 的節點,需要注意的是,這裡節點的建立型別需要...

基於zookeeper實現分布式鎖

zk有兩種資料節點,一種時持久節點 另一種時瞬時節點,有序,瞬時節點不可再有子節點,會話結束後瞬時節點自動消失 zookeeper的觀察器 可以設定觀察器的三個方法 getdata getchildren exist 資料節點發生變化,傳送給客戶端 觀察器只能監控一次,再監控需要重新設定 zk分布式...

分布式5 zookeeper分布式

一 為什麼需要zookeeper 大部分分布式應用需要乙個主控 協調器或控制器來管理物理分布的子程序 如資源 任務分配等 大部分應用需要開發私有的協調程式,缺乏乙個通用的機制 協調程式的反覆編寫浪費,且難以形成通用 伸縮性好的協調器 zookeeper可以提供通用的分布式鎖服務,用以協調分布式應用,...