最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

zookeeper watch機(jī)制的理解

 更新時(shí)間:2017年09月21日 16:55:33   作者:kobejayandy  
這篇文章主要介紹了zookeeper watch機(jī)制的相關(guān)內(nèi)容,內(nèi)容比較詳細(xì),需要的朋友可以參考下。

首先我們看看為什么添加Watch。

ZooKeeper是用來(lái)協(xié)調(diào)(同步)分布式進(jìn)程的服務(wù),提供了一個(gè)簡(jiǎn)單高性能的協(xié)調(diào)內(nèi)核,用戶(hù)可以在此之上構(gòu)建更多復(fù)雜的分布式協(xié)調(diào)功能。

多個(gè)分布式進(jìn)程通過(guò)ZooKeeper提供的 API 來(lái)操作共享的ZooKeeper內(nèi)存數(shù)據(jù)對(duì)象ZNode來(lái)達(dá)成某種一致的行為或結(jié)果,這種模式本質(zhì)上是基于狀態(tài)共享的并發(fā)模型,與Java的多線(xiàn)程并發(fā)模型一致,他們的線(xiàn)程或進(jìn)程都是“共享式內(nèi)存通信”。Java沒(méi)有直接提供某種響應(yīng)式通知接口來(lái)監(jiān)控某個(gè)對(duì)象狀態(tài)的變化,只能要么浪費(fèi)CPU時(shí)間毫無(wú)響應(yīng)式的輪詢(xún)重試,或基于Java提供的某種主動(dòng)通知(Notif)機(jī)制(內(nèi)置隊(duì)列)來(lái)響應(yīng)狀態(tài)變化,但這種機(jī)制是需要循環(huán)阻塞調(diào)用。而ZooKeeper實(shí)現(xiàn)這些分布式進(jìn)程的狀態(tài)(ZNode的Data、Children)共享時(shí),基于性能的考慮采用了類(lèi)似的異步非阻塞的主動(dòng)通知模式即Watch機(jī)制,使得分布式進(jìn)程之間的“共享狀態(tài)通信”更加實(shí)時(shí)高效,其實(shí)這也是ZooKeeper的主要任務(wù)決定的—協(xié)調(diào)。

所有的Zookeeper讀操作,包括getData()、getChildren()和exists(),都有一個(gè)開(kāi)關(guān),可以在操作的同時(shí)再設(shè)置一個(gè)watch。在ZooKeeper中,Watch是一個(gè)一次性觸發(fā)器,會(huì)在被設(shè)置watch的數(shù)據(jù)發(fā)生變化的時(shí)候,發(fā)送給設(shè)置watch的客戶(hù)端。watch的定義中有三個(gè)關(guān)鍵點(diǎn):

一次性觸發(fā)器

一個(gè)watch事件將會(huì)在數(shù)據(jù)發(fā)生變更時(shí)發(fā)送給客戶(hù)端。例如,如果客戶(hù)端執(zhí)行操作getData(“/znode1″, true),而后/znode1 發(fā)生變更或是刪除了,客戶(hù)端都會(huì)得到一個(gè)/znode1 的watch事件。如果/znode1 再次發(fā)生變更,則在客戶(hù)端沒(méi)有設(shè)置新的watch的情況下,是不會(huì)再給這個(gè)客戶(hù)端發(fā)送watch事件的。

發(fā)送給客戶(hù)端

這就是說(shuō),一個(gè)事件會(huì)發(fā)送給客戶(hù)端,但可能在操作成功的返回值到達(dá)發(fā)起變動(dòng)的客戶(hù)端之前,這個(gè)事件還沒(méi)有送達(dá)watch的客戶(hù)端。Watch是異步發(fā)送的。但ZooKeeper保證了一個(gè)順序:一個(gè)客戶(hù)端在收到watch事件之前,一定不會(huì)看到它設(shè)置過(guò)watch的值的變動(dòng)。網(wǎng)絡(luò)時(shí)延和其他因素可能會(huì)導(dǎo)致不同的客戶(hù)端看到watch和更新返回值的時(shí)間不同。但關(guān)鍵點(diǎn)是,每個(gè)客戶(hù)端所看到的每件事都是有順序的。

被設(shè)置了watch的數(shù)據(jù)

這是指節(jié)點(diǎn)發(fā)生變動(dòng)的不同方式。你可以認(rèn)為ZooKeeper維護(hù)了兩個(gè)watch列表:data watch和child watch。getData()和exists()設(shè)置data watch,而getChildren()設(shè)置child watch。或者,可以認(rèn)為watch是根據(jù)返回值設(shè)置的。getData()和exists()返回節(jié)點(diǎn)本身的信息,而getChildren()返回子節(jié)點(diǎn)的列表。因此,setData()會(huì)觸發(fā)znode上設(shè)置的data watch(如果set成功的話(huà))。一個(gè)成功的?create() 操作會(huì)觸發(fā)被創(chuàng)建的znode上的數(shù)據(jù)watch,以及其父節(jié)點(diǎn)上的child watch。而一個(gè)成功的?delete()操作將會(huì)同時(shí)觸發(fā)一個(gè)znode的data watch和child watch(因?yàn)檫@樣就沒(méi)有子節(jié)點(diǎn)了),同時(shí)也會(huì)觸發(fā)其父節(jié)點(diǎn)的child watch。

Watch由client連接上的ZooKeeper服務(wù)器在本地維護(hù)。這樣可以減小設(shè)置、維護(hù)和分發(fā)watch的開(kāi)銷(xiāo)。當(dāng)一個(gè)客戶(hù)端連接到一個(gè)新的服務(wù)器上時(shí),watch將會(huì)被以任意會(huì)話(huà)事件觸發(fā)。當(dāng)與一個(gè)服務(wù)器失去連接的時(shí)候,是無(wú)法接收到watch的。而當(dāng)client重新連接時(shí),如果需要的話(huà),所有先前注冊(cè)過(guò)的watch,都會(huì)被重新注冊(cè)。通常這是完全透明的。只有在一個(gè)特殊情況下,watch可能會(huì)丟失:對(duì)于一個(gè)未創(chuàng)建的znode的exist watch,如果在客戶(hù)端斷開(kāi)連接期間被創(chuàng)建了,并且隨后在客戶(hù)端連接上之前又刪除了,這種情況下,這個(gè)watch事件可能會(huì)被丟失。?

ZooKeeper對(duì)Watch提供了什么保障

對(duì)于watch,ZooKeeper提供了這些保障:

Watch與其他事件、其他watch以及異步回復(fù)都是有序的。ZooKeeper客戶(hù)端庫(kù)保證所有事件都會(huì)按順序分發(fā);客戶(hù)端會(huì)保障它在看到相應(yīng)的znode的新數(shù)據(jù)之前接收到watch事件;從ZooKeeper接收到的watch事件順序一定和ZooKeeper服務(wù)所看到的事件順序是一致的。

關(guān)于Watch的一些值得注意的事情

Watch是一次性觸發(fā)器,如果你得到了一個(gè)watch事件,而你希望在以后發(fā)生變更時(shí)繼續(xù)得到通知,你應(yīng)該再設(shè)置一個(gè)watch。
因?yàn)閣atch是一次性觸發(fā)器,而獲得事件再發(fā)送一個(gè)新的設(shè)置watch的請(qǐng)求這一過(guò)程會(huì)有延時(shí),所以你無(wú)法確保你看到了所有發(fā)生在ZooKeeper上的一個(gè)節(jié)點(diǎn)上的事件。所以請(qǐng)?zhí)幚砗迷谶@個(gè)時(shí)間窗口中可能會(huì)發(fā)生多次znode變更的這種情況。(你可以不處理,但至少請(qǐng)認(rèn)識(shí)到這一點(diǎn))。

一個(gè)watch對(duì)象或一個(gè)函數(shù)/上下文對(duì),為一個(gè)事件只會(huì)被通知一次。比如,如果同一個(gè)watch對(duì)象在同一個(gè)文件上分別通過(guò)exists和getData注冊(cè)了兩次,而這個(gè)文件之后被刪除了,這時(shí)這個(gè)watch對(duì)象將只會(huì)收到一次該文件的deletion通知。

當(dāng)你從一個(gè)服務(wù)器上斷開(kāi)時(shí)(比如服務(wù)器出故障了),在再次連接上之前,你將無(wú)法獲得任何watch。請(qǐng)使用這些會(huì)話(huà)事件來(lái)進(jìn)入安全模式:在disconnected狀態(tài)下你將不會(huì)收到事件,所以你的程序在此期間應(yīng)該謹(jǐn)慎行事。

總結(jié)

以上就是本文關(guān)于zookeeper watch機(jī)制的全部介紹,有興趣的朋友可以參閱:為zookeeper配置相應(yīng)的acl權(quán)限、apache zookeeper使用方法實(shí)例詳解等,希望對(duì)大家有所幫助。

相關(guān)文章

  • 深入學(xué)習(xí) Java 中的 Lambda

    深入學(xué)習(xí) Java 中的 Lambda

    Lambda表達(dá)式是Java SE 8中一個(gè)重要的新特性。lambda表達(dá)式允許你通過(guò)表達(dá)式來(lái)代替功能接口。 lambda表達(dá)式就和方法一樣,它提供了一個(gè)正常的參數(shù)列表和一個(gè)使用這些參數(shù)的主體(body,可以是一個(gè)表達(dá)式或一個(gè)代碼塊)。,需要的朋友可以參考下
    2019-06-06
  • springcloud 熔斷器Hystrix的具體使用

    springcloud 熔斷器Hystrix的具體使用

    本篇文章主要介紹了springcloud 熔斷器Hystrix的具體使用,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-02-02
  • 淺談Java獲得多線(xiàn)程的返回結(jié)果方式(3種)

    淺談Java獲得多線(xiàn)程的返回結(jié)果方式(3種)

    這篇文章主要介紹了淺談Java獲得多線(xiàn)程的返回結(jié)果方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • java.lang.annotation包詳細(xì)介紹

    java.lang.annotation包詳細(xì)介紹

    java.lang.annotation?包是 Java 標(biāo)準(zhǔn)庫(kù)中的一個(gè)核心包,專(zhuān)門(mén)用于定義和支持 Java 注解(Annotation),這篇文章主要介紹了java.lang.annotation包介紹,需要的朋友可以參考下
    2024-07-07
  • SpringBoot Starter機(jī)制及整合tomcat的實(shí)現(xiàn)詳解

    SpringBoot Starter機(jī)制及整合tomcat的實(shí)現(xiàn)詳解

    這篇文章主要介紹了SpringBoot Starter機(jī)制及整合tomcat的實(shí)現(xiàn),我們知道SpringBoot自己在“后臺(tái)”幫我們配置了很多原本需要我們手動(dòng)去的東西,至于這個(gè)“后臺(tái)”是啥,就是Starter機(jī)制
    2022-09-09
  • 在SpringBoot中該如何配置攔截器

    在SpringBoot中該如何配置攔截器

    今天給大家?guī)?lái)的是關(guān)于SpringBoot的相關(guān)知識(shí),文章圍繞在SpringBoot中該如何配置攔截器展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 使用SpringEvent解決WebUploader大文件上傳解耦問(wèn)題

    使用SpringEvent解決WebUploader大文件上傳解耦問(wèn)題

    Spring Event是Spring框架內(nèi)建的一種發(fā)布/訂閱模式的實(shí)現(xiàn),它允許應(yīng)用內(nèi)部不同組件之間通過(guò)事件進(jìn)行通信,本文以WebUploader大文件上傳組件為例,在大文件處理的場(chǎng)景中使用SpringEvent的事件發(fā)布機(jī)制,靈活的擴(kuò)展對(duì)文件的處理需求,需要的朋友可以參考下
    2024-07-07
  • springboot項(xiàng)目中全局設(shè)置用UTC+8

    springboot項(xiàng)目中全局設(shè)置用UTC+8

    本文主要介紹了springboot項(xiàng)目中全局設(shè)置用UTC+8,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • SpringBoot自定義配置項(xiàng)過(guò)程

    SpringBoot自定義配置項(xiàng)過(guò)程

    在SpringBoot項(xiàng)目中,通過(guò)在application.properties文件中添加配置項(xiàng),然后使用@ConfigurationProperties注解將這些配置項(xiàng)與實(shí)體Bean進(jìn)行綁定,可以實(shí)現(xiàn)配置項(xiàng)與實(shí)體類(lèi)字段的自動(dòng)關(guān)聯(lián),進(jìn)而方便地讀取配置文件中的數(shù)據(jù),這種方法不僅簡(jiǎn)化了配置管理
    2024-11-11
  • Java對(duì)象創(chuàng)建的幾種方式總結(jié)

    Java對(duì)象創(chuàng)建的幾種方式總結(jié)

    本文詳細(xì)介紹了Java中創(chuàng)建對(duì)象的五種方法,包括使用new關(guān)鍵字、Class的newInstance()方法、Constructor的newInstance()方法、克隆以及反序列化,同時(shí)討論了這些方式是否調(diào)用了構(gòu)造器以及創(chuàng)建對(duì)象的條件,文章還提供了示例代碼進(jìn)行演示,需要的朋友可以參考下
    2025-02-02

最新評(píng)論

海林市| 新晃| 永川市| 灵寿县| 汉川市| 天长市| 商洛市| 横峰县| 闸北区| 河西区| 四子王旗| 上饶市| 大埔县| 万盛区| 深水埗区| 呼伦贝尔市| 新泰市| 钦州市| 宜昌市| 荥经县| 平潭县| 孝义市| 澄江县| 青州市| 赫章县| 蚌埠市| 板桥市| 邹平县| 台中县| 明溪县| 贡山| 百色市| 寿宁县| 安溪县| 茶陵县| 甘泉县| 胶州市| 崇信县| 武清区| 夏河县| 定襄县|