Бид жижиглэн худалдааны сүлжээний технологи хөгжүүлэх хэлтэс юм. Нэгэн өдөр удирдлага нь Apache Ignite-ийг MSSQL-тэй хамтатган ашиглан том хэмжээний тооцооллыг хурдасгах зорилт тавиад, Java кодын үзэсгэлэнтэй зураг, жишээ бүхий вэбсайтыг үзүүлэв. Энэ сайт надад шууд таалагдсан
1. Асуудлын тухай мэдэгдэл
Асуудлын мөн чанар нь дараах байдалтай байна. Борлуулалтын цэгүүдийн SalesPoint лавлах болон Sku (Хувьцаа хадгалах нэгж) бүтээгдэхүүний лавлах байдаг. Борлуулалтын цэг нь "жижиг", "том" гэсэн утгатай "Дэлгүүрийн төрөл" шинж чанартай байдаг. Борлуулалтын цэг бүрт төрөл зүйл (борлуулалтын цэгийн бүтээгдэхүүний жагсаалт) холбогдсон (DBMS-ээс ачаалагдсан) бөгөөд заасан өдрөөс эхлэн заасан бүтээгдэхүүн байгаа гэсэн мэдээллийг өгдөг.
нэр төрлөөс хасагдсан эсвэл төрөл зүйлд нэмсэн.
Борлуулалтын цэгүүдийн хуваалттай кэшийг зохион байгуулж, холбогдсон бүтээгдэхүүний талаарх мэдээллийг нэг сарын өмнө хадгалах шаардлагатай. Байлдааны системтэй нийцтэй байхын тулд Ignite клиентийн зангилаа нь өгөгдлийг ачаалж, маягтын нийлбэрийг (Дэлгүүрийн төрөл, Бүтээгдэхүүний код, өдөр, борлуулалтын_цоо) тооцоолж, DBMS-д буцааж байршуулахыг шаарддаг.
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. Single Jar
Денис миний хувийн үнэлгээний эхний байрыг эзэлсэн, IMHO бол байгаа бүх хичээлүүдээс хамгийн хэрэгтэй заавар юм. Түүний дотор
Би үүнийг ижил аргаар хийж, командын мөрийн аргументаас хамааран "өгөгдлийн зангилаа" эсвэл "үйлчлүүлэгчийн зангилаа" -ыг ажиллуулдаг ганц jar файлыг авдаг. Чуулган эхэлж, ажиллаж байна. Zero Deployment ялагдсан.
Туршилтын мегабайтаас хэдэн арван гигабайтын байлдааны өгөгдөлд шилжсэн нь хоёртын формат ямар нэг шалтгаанаар байдгийг харуулсан. Зангилаанууд дээрх санах ойн хэрэглээг оновчтой болгох шаардлагатай байсан бөгөөд энэ нь BinaryObject нь маш ашигтай болсон.
4. Дүгнэлт
Apache Ignite төслийн баримт бичгийн тодорхой бус байдлын талаархи анхны зэмлэл шударга болсон; 2016 оноос хойш бараг өөрчлөгдөөгүй. Эхлэгчдэд вэбсайт болон/эсвэл репозитор дээр суурилсан загвар зохион бүтээх нь амаргүй.
Хийсэн ажлын үр дүнд үндэслэн Zero Deployment нь зөвхөн системийн түвшинд ажилладаг гэсэн сэтгэгдэл төрж байсан. Үүнтэй төстэй зүйл: BinaryObject нь алсын кластерийн зангилааг захиалгат ангиудтай ажиллахад заахад хэрэглэгддэг; Zero Deployment - дотоод механизм
Apache нь өөрөө Ignite бөгөөд системийн объектуудыг кластер даяар түгээдэг.
Миний туршлага Apache Ignite-ийн шинэ хэрэглэгчдэд хэрэг болно гэж найдаж байна.
Эх сурвалж: www.habr.com