Apache Ignite Zero Deployment: Чын эле нөлбү?

Apache Ignite Zero Deployment: Чын эле нөлбү?

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

1. Проблеманы баяндоо

Маселенин маңызы төмөндөгүдөй. Сатуу пункттарынын SalesPoint каталогу жана Sku (Stock Keeping Unit) продукт каталогу бар. Соода түйүнүндө "кичинекей" жана "чоң" маанилери бар "Дүкөн түрү" атрибуту бар. Ар бир соода түйүнүнө ассортимент (сатуу пунктунун продукциясынын тизмеси) кошулат (МБМБдан жүктөлөт) жана көрсөтүлгөн күндөн тартып көрсөтүлгөн продукция
ассортименттен чыгарылган же ассортиментке кошулган.

Сатуу пункттарынын бөлүнгөн кэшин уюштуруу жана анда туташкан продукциялар тууралуу маалыматты бир ай мурун сактоо талап кылынат. Күжүрмөн система менен шайкештик Ignite кардар түйүнүнөн маалыматтарды жүктөө, форманын агрегатын эсептөө (Дүкөн түрү, Продукт коду, күн, сатуу_пункттарынын_саны) жана аны кайра СУБДга жүктөө үчүн талап кылат.

2. Адабият таануу

Азырынча тажрыйбам жок, ошондуктан мештен бийлеп баштадым. Башкача айтканда, басылмалардын рецензиясынан.

2016-статья Apache Ignite менен таанышуу: Биринчи кадамдар Apache Ignite долбоорунун документтерине шилтемени камтыйт жана ошол эле учурда бул документациянын бүдөмүк экендиги үчүн жемелейт. Бир-эки жолу кайталап окудум, айкындык чыкпайт. Мен расмий окуу куралына кайрылам баштооошол
оптимисттик көз караш менен убада кылат: «Силер тез арада иштейсиңер!» Мен эки Apache Ignite Essentials видеосун көрүп, чөйрө өзгөрмөлөрүнүн жөндөөлөрүн аныктап жатам, бирок алар менин конкреттүү тапшырмам үчүн анча пайдалуу болгон жок. Мен биринчи тиркемени түзүп, стандарттык файл "example-ignite.xml" менен команда сабынан Igniteти ийгиликтүү ишке киргиздим. Compute Application 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 продуктуларды башкаруу боюнча директору.

Habré боюнча макала микросервис жөнүндө Денис Магданын үч макаласына шилтемелер: Микросервистер 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 бардык колдо болгон эң пайдалуу окуу куралы. Анын MicroServicesExample Github кластердик түйүндөрдү орнотуунун толугу менен даяр мисалын камтыйт, ал эч кандай кошумча скваттоосуз түзүлөт.

Мен муну ушундай кылам жана буйрук сабынын аргументине жараша "маалымат түйүнү" же "кардар түйүнү" ишке киргизген бир jar файлын алам. Чогулуш башталат жана иштейт. Zero Deployment утулуп калды.

Мегабайттан тесттик маалыматтардан ондогон гигабайттарга өтүү экилик форматтын кандайдыр бир себептерден улам бар экенин көрсөттү. Түйүндөрдө эстутум керектөөсүн оптималдаштыруу керек болчу, жана бул жерде BinaryObject абдан пайдалуу болуп чыкты.

4. Корутундулар

Apache Ignite долбоорунун документтеринин бүдөмүк экендиги жөнүндө биринчи жемелөө адилеттүү болуп чыкты; 2016-жылдан бери эч нерсе өзгөргөн жок. Жаңы баштаган адам үчүн веб-сайтка жана/же репозиторийге негизделген иштеп жаткан прототибин чогултуу оңой эмес.

Аткарылган иштин жыйынтыгы боюнча, Zero Deployment иштейт деген ой пайда болду, бирок система деңгээлинде гана. Бул сыяктуу бир нерсе: BinaryObject алыскы кластер түйүндөрүн колдонуучу класстар менен иштөөгө үйрөтүү үчүн колдонулат; Zero Deployment - ички механизм
Apache Ignite өзү жана система объекттерин кластер боюнча таратат.

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

Source: www.habr.com

Комментарий кошуу