Біз бөлшек сауда желісінің технологияларды дамыту бөліміміз. Бір күні басшылық Apache Ignite-ті MSSQL-пен бірге қолдану арқылы ауқымды есептеулерді жылдамдату міндетін қойды және әдемі иллюстрациялар мен Java кодының мысалдары бар веб-сайтты көрсетті. Маған сайт бірден ұнады
1. Мәселе туралы мәлімдеме
Мәселенің мәні мынада. Сатылым нүктелерінің SalesPoint каталогы және Sku (Қорларды сақтау бірлігі) өнім анықтамалығы бар. Сауда нүктесінде «кіші» және «үлкен» мәндері бар «Дүкен түрі» атрибуты бар. Әрбір сауда нүктесіне ассортимент (сату орнының өнімдерінің тізімі) қосылады (ДҚБЖ жүктеледі) және көрсетілген күннен бастап көрсетілген өнім туралы ақпарат ұсынылады.
ассортименттен шығарылған немесе ассортиментке қосылған.
Сауда нүктелерінің бөлінген кэшін ұйымдастыру және оған қосылған өнімдер туралы ақпаратты бір ай бұрын сақтау қажет. Жауынгерлік жүйемен үйлесімділік Ignite клиент түйінінен деректерді жүктеп, пішін жиынын есептеп (Дүкен түрі, Өнім коды, күн, сату_нүктелерінің_саны) және оны ДҚБЖ-ға кері жүктеп салуды талап етеді.
2. Әдебиеттану
Менің әлі тәжірибем жоқ, сондықтан мен пештен билей бастадым. Яғни, басылымдарға шолудан.
2016-бап
оптимистік түрде «Сіз тез арада жұмыс істейсіз!» деп уәде береді. Мен екі Apache Ignite Essentials бейнелерін көріп, ортаның айнымалы параметрлерін анықтап жатырмын, бірақ олар менің нақты тапсырмам үшін өте пайдалы болмады. Мен Ignite бағдарламасын пәрмен жолынан стандартты «example-ignite.xml» файлымен сәтті іске қосып, бірінші қолданбаны құрастырдым.
Мен әрі қарай оқыдым және мысал бірден affinityKey (SQL сұрауы арқылы бұрын жасалған) пайдаланады және тіпті жұмбақ BinaryObject пайдаланады:
IgniteCache<BinaryObject, BinaryObject> people
= ignite.cache("Person").withKeepBinary();
оқу
Мен Есептеу қолданбасын өз жағдайыма сәйкес қайта жасап жатырмын. 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 жазбалары үшін әрбір кластер түйінінде құрастырылады деп болжайды, содан кейін клиент түйіні соңғы қорытындыны орындайды.
Мен оқу құралын оқып жатырмын
@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 туралы емес пе?
Мен бір нәрсені жіберіп алған шығармын - мен қайтадан іздей бастаймын, қайта оқимын және іздеймін. Біраз уақыттан кейін мен тақырып бойынша бәрін оқып шықтым, енді жаңа ештеңе жоқ сияқты сезім пайда болады. Іздеп жүріп, қызықты пікірлер таптым.
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.
Тағы бір беделді пікір:
Хабре туралы мақала
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 барлық қолжетімді оқулықтардың ішіндегі ең пайдалысы. Оның ішінде
Мен мұны дәл осылай жасаймын және пәрмен жолы аргументіне байланысты «деректер түйінін» немесе «клиент түйінін» іске қосатын жалғыз jar файлын аламын. Жинау басталады және жұмыс істейді. Zero Deployment жеңіліске ұшырады.
Мегабайт сынақ деректерінен ондаған гигабайт жауынгерлік деректерге көшу екілік форматтың белгілі бір себептермен бар екенін көрсетті. Түйіндердегі жадты тұтынуды оңтайландыру қажет болды және бұл жерде BinaryObject өте пайдалы болып шықты.
4. Қорытындылар
Apache Ignite жобалық құжаттамасының анық еместігіне қатысты бірінші сөгіс әділ болып шықты; 2016 жылдан бері аз өзгерді. Жаңадан бастаушыға веб-сайтқа және/немесе репозиторийге негізделген жұмыс істейтін прототипті құрастыру оңай емес.
Жасалған жұмыстардың нәтижелері бойынша Zero Deployment жұмыс істейді деген әсер қалды, бірақ тек жүйелік деңгейде. Мынадай нәрсе: BinaryObject қашықтағы кластер түйіндерін теңшелетін сыныптармен жұмыс істеуге үйрету үшін пайдаланылады; Zero Deployment – ішкі механизм
Apache Ignite өзі және жүйе нысандарын бүкіл кластерге таратады.
Менің тәжірибем жаңа Apache Ignite пайдаланушыларына пайдалы болады деп үміттенемін.
Ақпарат көзі: www.habr.com