Apache Ignite Zero орналастыру: шынымен нөл ме?

Apache Ignite Zero орналастыру: шынымен нөл ме?

Біз бөлшек сауда желісінің технологияларды дамыту бөліміміз. Бір күні басшылық Apache Ignite-ті MSSQL-пен бірге қолдану арқылы ауқымды есептеулерді жылдамдату міндетін қойды және әдемі иллюстрациялар мен Java кодының мысалдары бар веб-сайтты көрсетті. Маған сайт бірден ұнады Нөлдік орналастыру, оның сипаттамасы ғажайыптарды уәде етеді: Java немесе Scala кодын тордағы әрбір түйінге қолмен орналастырудың және ол өзгерген сайын оны қайта орналастырудың қажеті жоқ. Жұмыс өрбіген сайын, Zero Deployment-тің мен бөліскім келетін мүмкіндіктері бар екені белгілі болды. Кесектің астында ойлар мен іске асыру мәліметтері берілген.

1. Мәселе туралы мәлімдеме

Мәселенің мәні мынада. Сатылым нүктелерінің SalesPoint каталогы және Sku (Қорларды сақтау бірлігі) өнім анықтамалығы бар. Сауда нүктесінде «кіші» және «үлкен» мәндері бар «Дүкен түрі» атрибуты бар. Әрбір сауда нүктесіне ассортимент (сату орнының өнімдерінің тізімі) қосылады (ДҚБЖ жүктеледі) және көрсетілген күннен бастап көрсетілген өнім туралы ақпарат ұсынылады.
ассортименттен шығарылған немесе ассортиментке қосылған.

Сауда нүктелерінің бөлінген кэшін ұйымдастыру және оған қосылған өнімдер туралы ақпаратты бір ай бұрын сақтау қажет. Жауынгерлік жүйемен үйлесімділік Ignite клиент түйінінен деректерді жүктеп, пішін жиынын есептеп (Дүкен түрі, Өнім коды, күн, сату_нүктелерінің_саны) және оны ДҚБЖ-ға кері жүктеп салуды талап етеді.

2. Әдебиеттану

Менің әлі тәжірибем жоқ, сондықтан мен пештен билей бастадым. Яғни, басылымдарға шолудан.

2016-бап Apache Ignite-мен таныстыру: алғашқы қадамдар құрамында Apache Ignite жобасының құжаттамасына сілтеме және сонымен бірге осы құжаттаманың анық еместігі үшін сөгіс бар. Бір-екі рет қайталап оқыдым, түсініксіз. Мен ресми оқу құралына сілтеме жасаймын басталусол
оптимистік түрде «Сіз тез арада жұмыс істейсіз!» деп уәде береді. Мен екі Apache Ignite Essentials бейнелерін көріп, ортаның айнымалы параметрлерін анықтап жатырмын, бірақ олар менің нақты тапсырмам үшін өте пайдалы болмады. Мен Ignite бағдарламасын пәрмен жолынан стандартты «example-ignite.xml» файлымен сәтті іске қосып, бірінші қолданбаны құрастырдым. Қолданбаны есептеу Maven көмегімен. Қолданба жұмыс істейді және Zero Deployment пайдаланады, бұл қандай әдемі!

Мен әрі қарай оқыдым және мысал бірден affinityKey (SQL сұрауы арқылы бұрын жасалған) пайдаланады және тіпті жұмбақ BinaryObject пайдаланады:

IgniteCache<BinaryObject, BinaryObject> people 
        = ignite.cache("Person").withKeepBinary(); 

оқу немного: екілік пішім – рефлексия, аты бойынша нысанның өрістеріне қол жеткізу сияқты нәрсе. Өрістің мәнін объектіні толық сериядан шығармай оқи алады (жадыны сақтау). Неліктен BinaryObject Person орнына пайдаланылады, өйткені Zero Deployment бар? Неліктен IgniteCache IgniteCache-ге жіберілді ? Әлі анық емес.

Мен Есептеу қолданбасын өз жағдайыма сәйкес қайта жасап жатырмын. MSSQL-дегі сату нүктелері каталогының негізгі кілті [id] [int] NULL ЕМЕС, аналогия бойынша кэш жасаймын.

IgniteCache<Integer, SalesPoint> salesPointCache=ignite.cache("spCache")

xml конфигурациясында мен кэштің бөлінгенін көрсетемін

<bean class="org.apache.ignite.configuration.CacheConfiguration">
    <property name="name" value="spCache"/>
    <property name="cacheMode" value="PARTITIONED"/>
</bean>

Сатылым нүктесі бойынша бөлу қажетті жиынтық сол жерде қолжетімді salesPointCache жазбалары үшін әрбір кластер түйінінде құрастырылады деп болжайды, содан кейін клиент түйіні соңғы қорытындыны орындайды.

Мен оқу құралын оқып жатырмын Бірінші Ignite Compute қолданбасы, Мен мұны аналогия бойынша жасаймын. Әрбір кластер түйінінде IgniteRunnable() іске қосамын, келесідей нәрсе:

  @Override
  public void run() {
    SalesPoint sp=salesPointCache.get(spId);
    sp.calculateSalesPointCount();
    ..
  }

Мен біріктіру және жүктеу логикасын қосып, оны сынақ деректер жинағында іске қосамын. Барлығы әзірлеу серверінде жергілікті түрде жұмыс істейді.

Мен екі CentOs сынақ серверін іске қосамын, default-config.xml ішінде IP мекенжайларын көрсетемін, әрқайсысында орындаймын

./bin/ignite.sh config/default-config.xml

Ignite түйіндерінің екеуі де жұмыс істейді және бір-бірін көре алады. Мен клиенттік қолданбаның xml конфигурациясында қажетті мекенжайларды көрсетемін, ол басталады, топологияға үшінші түйінді қосады және бірден екі түйін қайтадан пайда болады. Журнал жолда "ClassNotFoundException: model.SalesPoint" көрсетеді

SalesPoint sp=salesPointCache.get(spId);

StackOverflow қатенің себебі CentOs серверлерінде реттелетін SalesPoint класы жоқ екенін айтады. Біз келдік. «Әр түйінде Java кодын қолмен орналастырудың қажеті жоқ» және т.б. туралы не деуге болады? Немесе «сіздің Java коды» SalesPoint туралы емес пе?

Мен бір нәрсені жіберіп алған шығармын - мен қайтадан іздей бастаймын, қайта оқимын және іздеймін. Біраз уақыттан кейін мен тақырып бойынша бәрін оқып шықтым, енді жаңа ештеңе жоқ сияқты сезім пайда болады. Іздеп жүріп, қызықты пікірлер таптым.

Валентин Куличенко, GridGain Systems компаниясының жетекші сәулетшісі, жауап StackOverflow, 2016 жылдың сәуірінде:

Model classes are not peer deployed, but you can use withKeepBinary() flag
on the cache and query BinaryObjects. This way you will avoid deserialization
on the server side and will not get ClassNotFoundException.

Тағы бір беделді пікір: Денис Магда, GridGain Systems өнімді басқару директоры.

Хабре туралы мақала микросервис туралы Денис Магданың үш мақаласына сілтеме жасайды: Микросервис I бөлім, Микросервис II бөлім, Микросервис III бөлім 2016-2017 жж. Екінші мақалада Денис MaintenanceServiceNodeStartup.jar арқылы кластерлік түйінді бастауды ұсынады. Сондай-ақ, іске қосуды xml конфигурациясымен және пәрмен жолы арқылы пайдалануға болады, бірақ содан кейін әрбір орналастырылған кластер түйініне теңшелетін сыныптарды қолмен қою керек:

That's it. Start (..)  node using MaintenanceServiceNodeStartup file or pass
maintenance-service-node-config.xml to Apache Ignite's ignite.sh/bat scripts.
If you prefer the latter then make sure to build a jar file that will contain
all the classes from java/app/common and java/services/maintenance directories.
The jar has to be added to the classpath of every node where the service
might be deployed.

Шынында да, солай. Міне, неге бұл жұмбақ екілік пішім шықты!

3.SingleJar

Денис менің жеке рейтингімде бірінші орынға ие болды, IMHO барлық қолжетімді оқулықтардың ішіндегі ең пайдалысы. Оның ішінде MicroServicesМысал Github кластер түйіндерін орнатудың толығымен дайын мысалын қамтиды, ол ешқандай қосымша скватизациясыз құрастырылады.

Мен мұны дәл осылай жасаймын және пәрмен жолы аргументіне байланысты «деректер түйінін» немесе «клиент түйінін» іске қосатын жалғыз jar файлын аламын. Жинау басталады және жұмыс істейді. Zero Deployment жеңіліске ұшырады.

Мегабайт сынақ деректерінен ондаған гигабайт жауынгерлік деректерге көшу екілік форматтың белгілі бір себептермен бар екенін көрсетті. Түйіндердегі жадты тұтынуды оңтайландыру қажет болды және бұл жерде BinaryObject өте пайдалы болып шықты.

4. Қорытындылар

Apache Ignite жобалық құжаттамасының анық еместігіне қатысты бірінші сөгіс әділ болып шықты; 2016 жылдан бері аз өзгерді. Жаңадан бастаушыға веб-сайтқа және/немесе репозиторийге негізделген жұмыс істейтін прототипті құрастыру оңай емес.

Жасалған жұмыстардың нәтижелері бойынша Zero Deployment жұмыс істейді деген әсер қалды, бірақ тек жүйелік деңгейде. Мынадай нәрсе: BinaryObject қашықтағы кластер түйіндерін теңшелетін сыныптармен жұмыс істеуге үйрету үшін пайдаланылады; Zero Deployment – ​​ішкі механизм
Apache Ignite өзі және жүйе нысандарын бүкіл кластерге таратады.

Менің тәжірибем жаңа Apache Ignite пайдаланушыларына пайдалы болады деп үміттенемін.

Ақпарат көзі: www.habr.com

пікір қалдыру