Биз чекене тармагынын технологияны өнүктүрүү бөлүмү болуп саналат. Бир күнү жетекчилик Apache Ignite программасын MSSQL менен бирге колдонуу менен масштабдуу эсептөөлөрдү тездетүү милдетин койду жана Java кодунун кооз иллюстрациялары жана мисалдары бар веб-сайтты көрсөттү. Мага дароо сайт жакты
1. Проблеманы баяндоо
Маселенин маңызы төмөндөгүдөй. Сатуу пункттарынын SalesPoint каталогу жана Sku (Stock Keeping Unit) продукт каталогу бар. Соода түйүнүндө "кичинекей" жана "чоң" маанилери бар "Дүкөн түрү" атрибуту бар. Ар бир соода түйүнүнө ассортимент (сатуу пунктунун продукциясынын тизмеси) кошулат (МБМБдан жүктөлөт) жана көрсөтүлгөн күндөн тартып көрсөтүлгөн продукция
ассортименттен чыгарылган же ассортиментке кошулган.
Сатуу пункттарынын бөлүнгөн кэшин уюштуруу жана анда туташкан продукциялар тууралуу маалыматты бир ай мурун сактоо талап кылынат. Күжүрмөн система менен шайкештик Ignite кардар түйүнүнөн маалыматтарды жүктөө, форманын агрегатын эсептөө (Дүкөн түрү, Продукт коду, күн, сатуу_пункттарынын_саны) жана аны кайра СУБДга жүктөө үчүн талап кылат.
2. Адабият таануу
Азырынча тажрыйбам жок, ошондуктан мештен бийлеп баштадым. Башкача айтканда, басылмалардын рецензиясынан.
2016-статья
оптимисттик көз караш менен убада кылат: «Силер тез арада иштейсиңер!» Мен эки Apache Ignite Essentials видеосун көрүп, чөйрө өзгөрмөлөрүнүн жөндөөлөрүн аныктап жатам, бирок алар менин конкреттүү тапшырмам үчүн анча пайдалуу болгон жок. Мен биринчи тиркемени түзүп, стандарттык файл "example-ignite.xml" менен команда сабынан Igniteти ийгиликтүү ишке киргиздим.
Мен андан ары окудум, ал жерде мисал дароо 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.
Дагы бир авторитеттүү пикир:
Habré боюнча макала
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 колдонуучуларына пайдалуу болот деп ишенем.
Source: www.habr.com