Apache Ignite Zero Deployment: Үнэхээр тэг үү?

Apache Ignite Zero Deployment: Үнэхээр тэг үү?

Бид жижиглэн худалдааны сүлжээний технологи хөгжүүлэх хэлтэс юм. Нэгэн өдөр удирдлага нь Apache Ignite-ийг MSSQL-тэй хамтатган ашиглан том хэмжээний тооцооллыг хурдасгах зорилт тавиад, Java кодын үзэсгэлэнтэй зураг, жишээ бүхий вэбсайтыг үзүүлэв. Энэ сайт надад шууд таалагдсан Тэг байршуулалт, тайлбар нь гайхамшгуудыг амлаж байна: та сүлжээн дэх зангилаа бүр дээр Java эсвэл Scala кодыг гараар байрлуулж, өөрчлөгдөх бүрт дахин байршуулах шаардлагагүй. Ажил ахих тусам Zero Deployment нь тодорхой хэрэглээтэй болох нь тогтоогдсон бөгөөд тэдгээрийн онцлог шинж чанаруудыг би хуваалцахыг хүсч байна. Зүсэлтийн доор бодол санаа, хэрэгжилтийн дэлгэрэнгүй мэдээлэл байна.

1. Асуудлын тухай мэдэгдэл

Асуудлын мөн чанар нь дараах байдалтай байна. Борлуулалтын цэгүүдийн SalesPoint лавлах болон Sku (Хувьцаа хадгалах нэгж) бүтээгдэхүүний лавлах байдаг. Борлуулалтын цэг нь "жижиг", "том" гэсэн утгатай "Дэлгүүрийн төрөл" шинж чанартай байдаг. Борлуулалтын цэг бүрт төрөл зүйл (борлуулалтын цэгийн бүтээгдэхүүний жагсаалт) холбогдсон (DBMS-ээс ачаалагдсан) бөгөөд заасан өдрөөс эхлэн заасан бүтээгдэхүүн байгаа гэсэн мэдээллийг өгдөг.
нэр төрлөөс хасагдсан эсвэл төрөл зүйлд нэмсэн.

Борлуулалтын цэгүүдийн хуваалттай кэшийг зохион байгуулж, холбогдсон бүтээгдэхүүний талаарх мэдээллийг нэг сарын өмнө хадгалах шаардлагатай. Байлдааны системтэй нийцтэй байхын тулд Ignite клиентийн зангилаа нь өгөгдлийг ачаалж, маягтын нийлбэрийг (Дэлгүүрийн төрөл, Бүтээгдэхүүний код, өдөр, борлуулалтын_цоо) тооцоолж, DBMS-д буцааж байршуулахыг шаарддаг.

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(); 

Би үүнийг уншсан немного: хоёртын формат - тусгал гэх мэт зүйл, нэрээр нь объектын талбарт хандах. Объектыг бүрэн цувралаас гаргахгүйгээр талбарын утгыг унших боломжтой (санах ойг хадгалах). Гэхдээ тэг байршуулалт байдаг тул яагаад Person-ын оронд BinaryObject ашигладаг вэ? Яагаад 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 тооцоолох програм, Би үүнийг аналогиар хийдэг. Кластерын зангилаа бүр дээр би 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 компанийн ахлах архитектор, хариулт 2016 оны XNUMX-р сарын StackOverflow дээр:

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. Single Jar

Денис миний хувийн үнэлгээний эхний байрыг эзэлсэн, IMHO бол байгаа бүх хичээлүүдээс хамгийн хэрэгтэй заавар юм. Түүний дотор MicroServices Жишээ Github нь кластерын зангилаа үүсгэх бүрэн бэлэн жишээг агуулдаг бөгөөд энэ нь нэмэлт squatгүйгээр эмхэтдэг.

Би үүнийг ижил аргаар хийж, командын мөрийн аргументаас хамааран "өгөгдлийн зангилаа" эсвэл "үйлчлүүлэгчийн зангилаа" -ыг ажиллуулдаг ганц jar файлыг авдаг. Чуулган эхэлж, ажиллаж байна. Zero Deployment ялагдсан.

Туршилтын мегабайтаас хэдэн арван гигабайтын байлдааны өгөгдөлд шилжсэн нь хоёртын формат ямар нэг шалтгаанаар байдгийг харуулсан. Зангилаанууд дээрх санах ойн хэрэглээг оновчтой болгох шаардлагатай байсан бөгөөд энэ нь BinaryObject нь маш ашигтай болсон.

4. Дүгнэлт

Apache Ignite төслийн баримт бичгийн тодорхой бус байдлын талаархи анхны зэмлэл шударга болсон; 2016 оноос хойш бараг өөрчлөгдөөгүй. Эхлэгчдэд вэбсайт болон/эсвэл репозитор дээр суурилсан загвар зохион бүтээх нь амаргүй.

Хийсэн ажлын үр дүнд үндэслэн Zero Deployment нь зөвхөн системийн түвшинд ажилладаг гэсэн сэтгэгдэл төрж байсан. Үүнтэй төстэй зүйл: BinaryObject нь алсын кластерийн зангилааг захиалгат ангиудтай ажиллахад заахад хэрэглэгддэг; Zero Deployment - дотоод механизм
Apache нь өөрөө Ignite бөгөөд системийн объектуудыг кластер даяар түгээдэг.

Миний туршлага Apache Ignite-ийн шинэ хэрэглэгчдэд хэрэг болно гэж найдаж байна.

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх