同步佇列,顧名思義就是當佇列中的元素滿了的時候去做事情。
例如:乙個公司組織旅遊,只有當報名了的員工全部到齊後司機才能出發。
我們把需求拆分開:
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可以提供通用的分布式鎖服務,用以協調分布式應用,...