Egy kiskereskedelmi hálózat technológiai fejlesztési osztálya vagyunk. Egy napon a vezetőség feladatul tűzte ki a nagyszabású számítások felgyorsítását az Apache Ignite és az MSSQL együttes használatával, és bemutatott egy webhelyet gyönyörű illusztrációkkal és Java kód példákkal. Azonnal megtetszett az oldal
1. A probléma megfogalmazása
A probléma lényege a következő. Létezik egy SalesPoint értékesítési pont-címtár és egy Sku-termékkönyvtár (Stock Keeping Unit). Az értékesítési pontnak van egy „Store type” attribútuma „small” és „large” értékekkel. Minden értékesítési ponthoz (a DBMS-ből betöltve) egy szortiment (az értékesítési pont terméklistája) kapcsolódik, és tájékoztatást ad arról, hogy a megadott dátumtól a megadott termék
kizárják a választékból vagy hozzáadják a választékhoz.
Meg kell szervezni az értékesítési pontok particionált gyorsítótárát, és ebben tárolni kell a csatlakoztatott termékekkel kapcsolatos információkat egy hónapra előre. A harci rendszerrel való kompatibilitás megköveteli, hogy az Ignite kliens csomópont betöltse az adatokat, kiszámítsa az űrlap összesítését (üzlettípus, termékkód, nap, értékesítési_pontok száma) és visszatöltse a DBMS-be.
2. Irodalomtudomány
Még nincs tapasztalatom, ezért elkezdek táncolni a tűzhelyről. Vagyis a kiadványok áttekintéséből.
2016. cikk
optimistán megígéri: „Rendben üzembe kerülsz!” A környezeti változók beállításait találgatom, nézek két Apache Ignite Essentials videót, de nem voltak túl hasznosak a konkrét feladatomhoz. Sikeresen elindítom az Ignite-ot a parancssorból a szabványos „example-ignite.xml” fájllal, létrehozva az első alkalmazást
Tovább olvastam, és ott a példa azonnal az affinityKey-t használja (korábban egy SQL lekérdezéssel jött létre), és még a titokzatos BinaryObject-et is használja:
IgniteCache<BinaryObject, BinaryObject> people
= ignite.cache("Person").withKeepBinary();
olvas
Átalakítom a Számítási alkalmazást, hogy megfeleljen az esetemnek. Az MSSQL-ben az értékesítési pontok címtárának elsődleges kulcsa [id] [int] NOT NULL, analógia alapján létrehozok egy gyorsítótárat
IgniteCache<Integer, SalesPoint> salesPointCache=ignite.cache("spCache")
Az xml konfigban jeleztem, hogy a gyorsítótár particionálva van
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="spCache"/>
<property name="cacheMode" value="PARTITIONED"/>
</bean>
Az értékesítési pont szerinti particionálás azt feltételezi, hogy a szükséges összesítés minden fürtcsomópontra épül az ott elérhető salesPointCache rekordokhoz, majd az ügyfélcsomópont elvégzi a végső összegzést.
Olvasom a tutorialt
@Override
public void run() {
SalesPoint sp=salesPointCache.get(spId);
sp.calculateSalesPointCount();
..
}
Hozzáadom az összesítési és feltöltési logikát, és futtatom egy tesztadatkészleten. Minden helyileg működik a fejlesztői szerveren.
Elindítok két CentOs tesztszervert, megadom az IP-címeket a default-config.xml fájlban, és mindegyiken végrehajtom
./bin/ignite.sh config/default-config.xml
Mindkét Ignite csomópont fut, és látják egymást. A kliens alkalmazás xml konfigjában megadom a szükséges címeket, elindul, hozzáad egy harmadik csomópontot a topológiához és azonnal újra két csomópont. A naplóban a „ClassNotFoundException: model.SalesPoint” látható a sorban
SalesPoint sp=salesPointCache.get(spId);
A StackOverflow szerint a hiba oka az, hogy nincs egyéni SalesPoint osztály a CentOs szervereken. Megérkeztünk. Mit szólnál ahhoz, hogy „nem kell manuálisan telepítenie a Java kódot minden csomóponton” és így tovább? Vagy az Ön Java-kódja nem a SalesPointról szól?
Valószínűleg kihagytam valamit – újra elkezdek keresni, olvasni és újra keresni. Egy idő után az az érzésem, hogy mindent elolvastam a témában, már nincs újdonság. Miközben keresgéltem, találtam néhány érdekes megjegyzést.
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.
Egy másik mérvadó vélemény:
Cikk Habréról
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.
Valóban, ez az. Itt kiderül, miért, ez a titokzatos bináris formátum!
3.SingleJar
Denis az első helyet szerezte meg személyes értékelésemben, az IMHO a leghasznosabb oktatóanyag az összes elérhető közül. Az övében
Ugyanúgy csinálom, és kapok egy egyetlen jar fájlt, amely elindítja a „data node” vagy a „client node” parancssori argumentumtól függően. Az összeszerelés elindul és működik. A Zero Deployment vereséget szenvedett.
A megabájt tesztadatokról több tíz gigabájtnyi harci adatra való átállás megmutatta, hogy a bináris formátum okkal létezik. Optimalizálni kellett a memóriafelhasználást a csomópontokon, és itt bizonyult nagyon hasznosnak a BinaryObject.
4. Konklúziók
Az Apache Ignite projektdokumentáció homályosságával kapcsolatos első szemrehányás igazságosnak bizonyult; 2016 óta alig változott. Egy kezdőnek nem könnyű összeállítani egy működő prototípust egy weboldal és/vagy tárhely alapján.
Az elvégzett munka eredményei alapján az volt a benyomás, hogy a Zero Deployment működik, de csak rendszerszinten. Valami ehhez hasonló: A BinaryObject arra szolgál, hogy megtanítsa a távoli fürtcsomópontokat az egyéni osztályokkal való együttműködésre; Zero Deployment - belső mechanizmus
Az Apache Ignite magát, és elosztja a rendszerobjektumokat a fürtben.
Remélem, hogy tapasztalataim hasznosak lesznek az új Apache Ignite felhasználók számára.
Forrás: will.com