JavaRush /Java блогу /Random-KY /Зоопарк же зоопарктын жашоосу кандай
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 эки режимдин биринде иштетorши мүмкүн: өз алдынча же репликацияланган . Келгиле, эң жөнөкөй вариантты карап көрөлү, биринчи вариант катары да белгилүү - Standalone режими. Zookeper иштеши үчүн ага конфигурация файлы керек. Ошондуктан, келгиле, аны ушул жерден түзөлү: [КаталогРаспаковкиZookeeper]/conf/zoo.cfg. Windows үчүн, биз Medium сунушун колдонобуз: “ Windows боюнча Apache ZooKeeper орнотуу ”. Конфигурация файлынын мазмуну төмөнкүдөй болот:
tickTime=2000
dataDir=C:/zookeeper-3.4.13/data
clientPort=2181
Келгиле, ZOOKEEPER_HOME чөйрө өзгөрмөсүн зоокепердин тамыр каталогуна жолду кошолу (ортодогу нускамалардагыдай), ошондой эле PATH чөйрө өзгөрмөсүнө төмөнкү фрагментти кошолу: ;%ZOOKEEPER_HOME%\bin; Ошондой эле, dataDirде көрсөтүлгөн каталог болушу керек, антпесе Zookeeper болбойт. serverди баштоого болот. Эми биз serverди zkServer буйругу менен коопсуз баштасак болот. Zookeeper каталогу жол чөйрө өзгөрмөсүнө кошулгандыктан, биз Zookeper буйруктарын бин каталогунан эле эмес, каалаган жерден чакыра алабыз.
Зоопарктын кызматкери же зоопарктын кызматкери кандай жашайт - 4

ZNode

" Zookeper Обзорунда " айтылгандай , Zookeperдеги маалыматтар дарак структурасында уюшулган ZNodes (түйүндөр) түрүндө көрсөтүлөт . Башкача айтканда, ар бир ZNode маалыматтарды камтышы жана бала ZNodes болушу мүмкүн. ZNode уюму жөнүндө көбүрөөк маалыматты Zookeeper documentтеринен тапса болот: " Берorштер модели жана иерархиялык аттар мейкиндиги ". Zookeeper жана ZNode менен иштөө үчүн биз Zookeeper CLI (Command Line интерфейси) колдонобуз . Мурда биз serverди zkServer буйругун колдонуп баштаганбыз. Эми, туташуу үчүн, аткаралы. zkCli.cmd -server 127.0.0.1:2181 Эгер ийгorктүү болсо, Zookeeper менен туташуу сеансы түзүлөт жана биз болжол менен төмөнкү жыйынтыкты көрөбүз:
Зоопарктын кызматкери же зоопарктын кызматкери кандай жашайт - 5
Кызыгы, орнотулгандан кийин да, Zookeeper ZNode бар. Анын төмөнкү жолу бар:/zookeeper/quota
Зоопарктын кызматкери же зоопарктын кызматкери кандай жашайт - 6
Булар “ квота ” деп аталат . " Apache ZooKeeper Essentials " бөлүмүндө айтылгандай , ар бир ZNode аны менен байланышкан квотага ээ болушу мүмкүн, ал сактай турган маалыматтарды чектейт. Зноддордун санына жана сакталган маалыматтардын көлөмүнө чектөө коюлушу мүмкүн. Мындан тышкары, эгерде бул чектен ашып кетсе, анда ZNode менен операция жокко чыгарылbyte, бирок чектен ашкандыгы жөнүндө эскертүү алынат. ZNode жөнүндө " ZooKeeper программисттин колдонмосу: ZNodes " дегенден окуу сунушталат . ZNode менен кантип иштөөгө болот деген бир нече мисалдар:
Зоопарктын кызматкери же зоопарктын кызматкери кандай жашайт - 7
Ошондой эле ZNodes ар кандай экенин белгилегим келет. Кадимки ZNodes (кошумча желекчелерди көрсөтпөсөңүз) " туруктуу " түрүнө кирет. " Эфемердик түйүн " тибиндеги ZNode бар . Мындай ZNodes алар түзүлгөн Zookeeper байланыш сеансынын узактыгы үчүн гана бар. " Sequence Node " түрүндөгү ZNode бар . Бул ZNodes уникалдуулугун камсыз кылуу үчүн ырааттуулугу бир сан менен тиркелет. Тартип түйүнү туруктуу же эфемердик болушу мүмкүн. Бул жерде ZNode жөнүндө бир аз маалымат сунушталат: “ Zookeeper ZNodes – Характеристикалар & Мисал ”.
Зоопарктын кызматкери же зоопарктын кызматкери кандай жашайт - 8

ZNode Watcher

Мен дагы байкоочулар жөнүндө айткым келет. Алар жөнүндө толук маалымат Zookeeper documentациясында жазылган: " ZooKeeper Watches ". Кыскача айтканда, байкоочу кандайдыр бир окуядан улам пайда болгон бир жолку триггер. getData(), getChildren() же exists() операцияларын аткаруу менен маалыматтарды алуу менен биз кошумча аракет катары триггер түзө алабыз. Зоопарктын кароолчусу окуянын иштөө тартибин камсыздайт. Мындан тышкары, documentацияда жаңы ZNode маанисин көрүүдөн мурун, биз эски маанини жаңысына өзгөртүү тууралуу окуяны көрөбүз деп айтылат. Watchers жөнүндө кененирээк бул жерден окуй аласыз: “ 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

Азыр биз Zookeeper эмне кыла ала тургандыгы жөнүндө негизги түшүнүккө ээ болдук. Эми аны менен 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'
Градл жөнүндө кененирээк карап чыгуудан окуй аласыз: " Градлга кыскача киришүү ". Ошентип, бизде 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унда баары бирдей. Биздин байкоочубуз ийгorктүү аяктагандыгы тууралуу билдирүүнү көрсөтүп, кулпу аркылуу бул тууралуу күтүп жаткандардын баарына кабарлайт. Келгиле, байкоочу жазалы:
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 аркылуу кармаган), андан кийин билдирүү жазат. Андан кийин, кулпуну кармайбыз (негизги жип аны мурда чыгаргандыктан) жана кулпуну күтүп жаткан бардык жиптерге биз уланта турганыбызды билдиребиз. Окуяны иштетүү жип синхрондоштурулган блоктон чыгып, ошону менен кулпуну бошотот. Негизги жип эскертме алды жана кулпу бошотулушун күткөндөн кийин, аткарууну улантат, анткени кулпуну алганга чейин, ал синхрондоштурулган блоктон чыгып, ишин уланта алbyte. Ошентип, 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 конфигурациялай алабыз. Бул дагы бир маанилүү өзгөчөлүгү болуп саналат. ACLs - ZNode менен болгон аракеттерге тиешелүү уруксаттар. Орнотуулар көп, андыктан чоо-жайын билүү үчүн расмий documentтерге кайрылууну сунуштайм: “ 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