JavaRush /Java блогы /Random-KK /Хайуанаттар бағы немесе зообақшының өмірі қандай
Viacheslav
Деңгей

Хайуанаттар бағы немесе зообақшының өмірі қандай

Топта жарияланған
Хайуанаттар бағы немесе зообақ қызметкері қалай өмір сүреді - 1

Кіріспе

Java қолданбаларында жиі әртүрлі конфигурациялар болады. Мысалы, мекенжай және қосылым порты. Мысалы, егер біз Properties сыныбын пайдалансақ, ол келесідей болуы мүмкін :
public static void main(String []args) {
	Properties props = new Properties();
	props.setProperty("host", "www.tutorialspoint.com");
	System.out.println("Hello, " + props.getProperty("host"));
}
Бұл жеткілікті сияқты, өйткені... файлдан қасиеттерді ала аламыз. Ал бізбен бір станокта бәрі жақсы араласатын сияқты. Бірақ біздің жүйеміз бір-бірінен бөлінген әртүрлі жүйелерден тұра бастағанын елестетіп көріңізші? Мұндай жүйені үлестірілген жүйелер деп те атайды. Википедияда келесі анықтаманы табуға болады: Бөлінген жүйелер – құрамдас бөліктері бір-бірімен байланысатын және бір-бірімен хабарлама алмасу арқылы өз әрекеттерін үйлестіретін әртүрлі желілік компьютерлерде орналасқан жүйелер. Сіз келесі диаграмманы көре аласыз:
Хайуанаттар бағы немесе зообақ қызметкері қалай өмір сүреді - 2
Бұл тәсілмен бір жүйе құрамдас бөліктерге бөлінеді. Конфигурация жеке жалпы құрамдас болып табылады. Басқа құрамдастардың әрқайсысы конфигурация құрамдас бөлігі үшін клиент ретінде әрекет етеді. Бұл жағдай « Таратылған конфигурация » деп аталады . Бөлінген конфигурацияның көптеген әртүрлі іске асырулары бар. Бүгінгі шолуда мен олардың бірімен танысуды ұсынамын, ол Zookeeper деп аталады.
Хайуанаттар бағының қызметкері немесе зообақ қызметкері қалай өмір сүреді - 3

Хайуанаттар бағы

Zookeeper-мен танысу жолы олардың ресми сайтынан басталады: zookeeper.apache.org Ресми веб-сайтта « Жүктеу » бөліміне өту керек . Бұл бөлімде мұрағатты .tar.gz пішімінде жүктеп алыңыз, мысалы, «zookeeper-3.4.13.tar.gz». tar - Unit жүйелеріне арналған дәстүрлі мұрағат пішімі. gz - мұрағатты қысу үшін gzip қолданылатынын білдіреді. Егер біз Windows құрылғысында жұмыс істейтін болсақ, бұл бізді алаңдатпауы керек. Қазіргі заманғы мұрағатшылардың көпшілігі (мысалы, 7-zip ) олармен Windows жүйесінде тамаша жұмыс істей алады. Мазмұнды кейбір каталогқа шығарып көрейік. Сонымен қатар, біз айырмашылықты көреміз - дискіде шығарылған күйде ол шамамен 60 мегаbyteты алады және біз шамамен 35 мегаbyte көлеміндегі мұрағатты жүктеп алдық. Көріп отырғаныңыздай, қысу шынымен жұмыс істейді. Енді Zookeeper бағдарламасын іске қосу керек. Жалпы, Zookeeper serverдің бір түрі. Zookeeper екі режимнің бірінде іске қосылуы мүмкін: автономды немесе қайталанатын . Ең қарапайым опцияны қарастырайық, ол бірінші опция ретінде де белгілі - Дербес режим. Zookeper іске қосылуы үшін оған конфигурация файлы қажет. Сондықтан оны осында жасайық: [КаталогРаспаковкиZookeeper]/conf/zoo.cfg. Windows жүйесінде біз Medium ұсынған ұсынысты қолданамыз: “ Windows жүйесінде Apache ZooKeeper орнату ”. Конфигурация файлының мазмұны келесідей болады:
tickTime=2000
dataDir=C:/zookeeper-3.4.13/data
clientPort=2181
Zookeper түбірлік каталогына жолды қамтитын ZOOKEEPER_HOME ортасының айнымалы мәнін (тасымалдағыштағы нұсқаулардағыдай) қосамыз, сонымен қатар PATH ортасының айнымалы мәніне келесі фрагментті қосамыз: ;%ZOOKEEPER_HOME%\bin; Сондай-ақ, dataDir ішінде көрсетілген каталог болуы керек, әйтпесе Zookeeper болмайды. serverді іске қосуға болады. Енді біз serverді zkServer пәрмені арқылы қауіпсіз іске қоса аламыз. Zookeeper каталогы жол ортасының айнымалы мәніне қосылғанының арқасында біз Zookeper пәрмендерін бин каталогынан емес, кез келген жерден шақыра аламыз.
Хайуанаттар бағының қызметкері немесе зообақ қызметкері қалай өмір сүреді - 4

ZNode

Zookeper шолуында айтылғандай , Zookeper деректері ағаш құрылымында ұйымдастырылған ZNode (түйіндер) түрінде ұсынылған . Яғни, әрбір ZNode деректерден тұруы және еншілес ZNodes болуы мүмкін. ZNode ұйымы туралы қосымша ақпаратты Zookeeper құжаттамасынан табуға болады: " Деректер үлгісі және иерархиялық аттар кеңістігі ". Zookeeper және ZNode бағдарламаларымен жұмыс істеу үшін Zookeeper CLI (Command Line интерфейсі) қолданамыз . Бұрын біз serverді zkServer командасы арқылы іске қостық. Енді қосылу үшін орындаймыз. zkCli.cmd -server 127.0.0.1:2181 Егер сәтті болса, Zookeeper-ге қосылу сеансы жасалады және біз шамамен келесі нәтижені көреміз:
Хайуанаттар бағы немесе зообақ қызметкері қалай өмір сүреді - 5
Бір қызығы, тіпті орнатудан кейін бірден Zookeeper-де ZNode бар. Оның келесі жолы бар:/zookeeper/quota
Хайуанаттар бағы немесе зообақ қызметкері қалай өмір сүреді - 6
Бұл « квота » деп аталатындар . " Apache ZooKeeper Essentials " бөлімінде айтылғандай , әрбір ZNode оны сақтай алатын деректерді шектей отырып, онымен байланысты квотаға ие болуы мүмкін. Зоналардың санына және сақталған деректер көлеміне шектеу қойылуы мүмкін. Сонымен қатар, егер бұл шектен асып кетсе, ZNode операциясы жойылмайды, бірақ шектен асып кету туралы ескерту алынады. ZNode туралы « ZooKeeper бағдарламашысының нұсқаулығы: ZNodes » бөлімінен оқу ұсынылады . ZNode-мен қалай жұмыс істеуге болатыны туралы бірнеше мысалдар:
Хайуанаттар бағы немесе зообақ қызметкері қалай өмір сүреді - 7
Сондай-ақ, ZNodes әртүрлі екенін атап өткім келеді. Тұрақты ZNode (егер сіз қосымша жалаушаларды көрсетпесеңіз) " тұрақты " типті . « Эфемерлік түйін » түріндегі ZNode бар . Мұндай ZNodes олар жасалған Zookeeper қосылым сеансының ұзақтығы үшін ғана бар. « Реттілік түйіні » типті ZNode бар . Бұл ZNode бірегейлігін қамтамасыз ету үшін реттілік санымен қосылады. Реттік түйін тұрақты немесе эфемерлі болуы мүмкін. Сондай-ақ мұнда ZNode туралы қысқаша ақпарат ұсынылады: “ Zookeeper ZNodes – сипаттамалар және мысал ”.
Хайуанаттар бағы немесе зообақ қызметкері қалай өмір сүреді - 8

ZNode Watcher

Мен бақылаушылар туралы да айтқым келеді. Олар туралы мәліметтер Zookeeper құжаттамасында жазылған: « ZooKeeper Watches ». Қысқаша айтқанда, бақылаушы - бұл қандай да бір оқиға арқылы іске қосылатын бір реттік триггер. getData(), getChildren() немесе exists() операцияларын орындау арқылы деректерді шығарып алу арқылы біз қосымша әрекет ретінде триггер жасай аламыз. Zookeeper оқиғаның өңделу ретін қамтамасыз етеді. Сонымен қатар, құжаттамада біз жаңа ZNode мәнін көрмес бұрын, ескі мәнді жаңасына өзгерту туралы оқиғаны көретінімізді айтады. Бақылаушылар туралы толығырақ мына жерден оқи аласыз: “ ZooKeeper сағаттары – мүмкіндіктер мен кепілдіктер ”. Мұны істеу үшін, CLI-ді қайтадан қолданайық : Бізде қандай да бір қызметтің күйін сақтайтын мәні бар кейбір ZNode бар делік:
[zk: 127.0.0.1:2181(CONNECTED) 0] create /services/service1/status stopped
Created /services/service1/status
[zk: 127.0.0.1:2181(CONNECTED) 1] get /services/service1/status [watch]
stopped
Енді деректер /services/service1/statusөзгерсе, біздің бір реттік триггер іске қосылады:
Хайуанаттар бағы немесе зообақ қызметкері қалай өмір сүреді - 9
Бір қызығы, Zookeeper-ге қосылу кезінде біз бақылаушының қалай жұмыс істейтінін көреміз:
WATCHER::
WatchedEvent state:SyncConnected type:None path:null
SyncConnected мүмкін Zookeper оқиғаларының бірі болып табылады. Бұл туралы қосымша мәліметтерді API сипаттамасында табуға болады.
Хайуанаттар бағы немесе зообақ қызметкері қалай өмір сүреді - 10

Zookeeper және Java

Енді бізде зоопарктың не істей алатыны туралы негізгі түсінік бар. Енді онымен CLI арқылы емес, Java арқылы жұмыс істейік. Ол үшін бізге Java қосымшасы қажет болады, онда Zookeeper-пен қалай жұмыс істеу керектігін көреміз. Қолданбаны жасау үшін біз Gradle жобаны құрастыру жүйесін қолданамыз . « Gradle Build Init плагині » арқылы біз жобаны жасаймыз. Мұны істеу үшін пәрменді орындайық: gradle init --type java-application Егер Gradle бізден нақтылау сұрақтарын сұраса, біз әдепкі мәндерді қалдырамыз (тек Enter пернесін басыңыз). Енді құрастыру сценарийін ашайық, яғни. build.gradle файлы. Онда жобамыздың неден жасалғаны және ол қандай артефактілерге (кітапханалар, фреймворктар) байланысты екендігі туралы сипаттама бар. Өйткені біз Zookeeper қолданбасын қолданғымыз келеді, содан кейін оны қосуымыз керек. Сондықтан, тәуелділіктер блогына Zookeeper тәуелділігін қосамыз:
dependencies {
    implementation 'org.apache.zookeeper:zookeeper:3.4.13'
Сіз Gradle туралы толығырақ шолудан оқи аласыз: « Gradle туралы қысқаша кіріспе ». Сонымен, бізде Java жобасы бар, біз оған Zookeeper кітапханасын қостық. Енді бірдеңе жазайық. Естеріңізде болса, CLI көмегімен біз келесідей нәрсені байланыстырдық: zkCli.cmd -server 127.0.0.1:2181 Негізгі әдісте App класындағы «server» төлсипатын жариялайық:
String server = "127.0.0.1:2181";
Қосылым - бұл бірден орындалатын әрекет емес. Қосылым орын алу үшін бағдарламаны орындаудың негізгі ағынында қандай да бір түрде күтуіміз керек. Сондықтан бізге құлып керек. Оны төменде жария етейік:
Object lock = new Object();
Енді байланыс орнатылды деп айтатын адам керек. Естеріңізде болса, біз мұны CLI арқылы жасаған кезде, бақылаушы біз үшін жұмыс істеді. Сондықтан Java codeында бәрі бірдей. Біздің бақылаушы сәтті аяқталғаны туралы хабарлама көрсетеді және бұл туралы құлып арқылы күтіп тұрғандардың барлығына хабарлайды. Бақылаушыны жазайық:
Watcher connectionWatcher = new Watcher() {
	public void process(WatchedEvent we) {
		if (we.getState() == Event.KeeperState.SyncConnected) {
			System.out.println("Connected to Zookeeper in " + Thread.currentThread().getName());
			synchronized (lock) {
            	lock.notifyAll();
            }
		}
	}
};
Енді zooKeeper serverіне қосылым қосамыз:
int sessionTimeout = 2000;
ZooKeeper zooKeeper = null;
synchronized (lock) {
	zooKeeper = new ZooKeeper(server, sessionTimeout, connectionWatcher);
	lock.wait();
}
Мұнда бәрі қарапайым. Бағдарламаның негізгі ағынында негізгі әдісті орындаған кезде біз құлыпты ұстап, зоопаркқа қосылуды сұраймыз. Сонымен бірге біз құлыпты босатып, басқа біреу құлыпты ұстап алып, жалғастыра алатынымызды ескерткенше күтеміз. Байланыс орнатылған кезде бақылаушы жұмыс істейді. Ол SyncConnected оқиғасының келгенін тексереді (біз есімізде бұл бақылаушы CLI арқылы ұстап алған), содан кейін хабарлама жазады. Содан кейін біз құлыпты ұстаймыз (негізгі ағын оны бұрын шығарғандықтан) және құлыпты күтіп тұрған барлық ағындарға жалғастыра алатынымызды хабарлаймыз. Оқиғаларды өңдеу ағыны синхрондалған блоктан шығады, осылайша құлыпты босатады. Негізгі ағын хабарландыру алды және құлыптың босатылуын күткеннен кейін орындауды жалғастырады, өйткені ол құлыпты алғанша синхрондалған блоктан шығып, жұмысын жалғастыра алмайды. Осылайша, multithreading және Zookeeper API көмегімен біз әртүрлі әрекеттерді орындай аламыз. Zookeeper API CLI рұқсат бергеннен әлдеқайда кең. Мысалы:
// Creation нового узла
String znodePath = "/zookeepernode2";
List<ACL> acls = ZooDefs.Ids.OPEN_ACL_UNSAFE;
if (zooKeeper.exists(znodePath, false) == null) {
	zooKeeper.create(znodePath, "data".getBytes(), acls, CreateMode.PERSISTENT);
}

// Получение данных из узла
byte[] data = zooKeeper.getData(znodePath, null, null);
System.out.println("Result: " + new String(data, "UTF-8"));
Көріп отырғаныңыздай, түйінді құру кезінде біз ACL конфигурациялай аламыз. Бұл тағы бір маңызды қасиет. ACL - ZNode көмегімен әрекеттерге қолданылатын рұқсаттар. Параметрлер өте көп, сондықтан егжей-тегжейлі ақпарат алу үшін ресми құжаттамаға жүгінуді ұсынамын: “ Zookeeper ACL рұқсаттары ”.
Хайуанаттар бағының қызметкері немесе зообақ қызметкері қалай өмір сүреді - 11

Қорытынды

Біз мұны не үшін оқыдық? Өйткені Zookeeper басқа танымал технологияларда қолданылады. Мысалы, Apache Kafka Zookeeper бағдарламасын қажет етеді, ол туралы « Кафканың жылдам бастау нұсқаулығында » оқуға болады. Ол сондай-ақ NOSQL HBase дерекқорында қолданылады, ол туралы толығырақ олардың " HBase Quickstart Guide " бөлімінен оқуға болады. Іс жүзінде көптеген басқа жобалар Zookeeper пайдаланады. Олардың кейбіреулері « Зоопаркті нақты әлемде пайдалану » бөлімінде берілген . «Неге» деген сұраққа жауап бердім деп үміттенемін. Ендігі ең маңызды сұрақ: «Ары қарай не болады?» Алдымен сіз Apache Zookeeper тақырыбы бойынша келесі кітаптарды оқи аласыз: Екіншіден, Zookeeper туралы тамаша бейне есептер бар. Ұсынылатын көру: Үшіншіден, әлем бейнесін толықтыратын бірнеше пайдалы мақалалар бар: Бұл өте қысқа шолу, бірақ кіріспе сөз ретінде бұл пайдалы болады деп үміттенемін. #Вячеслав
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION