Semu u dipartimentu di sviluppu tecnologicu di una reta di vendita. Un ghjornu, a gestione hà stabilitu u compitu di accelerà i calculi à grande scala usendu Apache Ignite in cungiunzione cù MSSQL, è mostrò un situ web cù belli illustrazioni è esempi di codice Java. Mi piacia subitu u situ
1. Dichjarazione di u prublema
L'essenza di u prublema hè a siguenti. Ci hè un repertoriu di punti di vendita SalesPoint è un repertoriu di prudutti Sku (Stock Keeping Unit). U puntu di vendita hà un attributu "Tippu Store" cù i valori "picculu" è "grande". Un assortiment (lista di prudutti di u puntu di vendita) hè cunnessu à ogni puntu di vendita (caricatu da u DBMS) è l'infurmazione hè furnita chì da a data specificata u pruduttu specificatu.
esclusu da l'assortimentu o aghjuntu à l'assortiment.
Hè necessariu urganizà una cache partizionata di punti di vendita è almacenà in questu infurmazione nantu à i prudutti cunnessi per un mesi in anticipu. A cumpatibilità cù u sistema di cummattimentu richiede u nodu di u cliente Ignite per carricà e dati, calculà un aggregatu di a forma (Tippu Store, Codice di u produttu, ghjornu, number_of_sales_points) è caricate torna à u DBMS.
2. Studiu di a literatura
Ùn aghju micca una sperienza ancu, cusì cuminciu à ballà da a stufa. Questu hè, da una rivista di publicazioni.
Articulu 2016
promette ottimista "Sarete attivu in un battitu!" Scuprite i paràmetri di l'ambienti variabili, fighjendu dui video Apache Ignite Essentials, ma ùn eranu micca assai utili per u mo compitu specificu. Aghju lanciatu successu Ignite da a linea di cummanda cù u schedariu standard "example-ignite.xml", custruendu a prima applicazione
Aghju lettu più, è quì l'esempiu usa immediatamente affinityKey (creatu prima attraversu una query SQL), è ancu usa u misteriosu BinaryObject:
IgniteCache<BinaryObject, BinaryObject> people
= ignite.cache("Person").withKeepBinary();
Aghju lettu
Aghju rifacendu l'Applicazione di Compute per adattà à u mo casu. A chjave primaria di u repertoriu di punti di vendita in MSSQL hè definitu cum'è [id] [int] NOT NULL, creanu un cache per analogia.
IgniteCache<Integer, SalesPoint> salesPointCache=ignite.cache("spCache")
In u xml config indicà chì a cache hè partizionata
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="spCache"/>
<property name="cacheMode" value="PARTITIONED"/>
</bean>
A particione per u puntu di vendita assume chì l'agregatu necessariu serà custruitu nantu à ogni node di cluster per i registri salesPointCache dispunibuli quì, dopu chì u nodu di u cliente farà a somma finale.
Leghje u tutoriale
@Override
public void run() {
SalesPoint sp=salesPointCache.get(spId);
sp.calculateSalesPointCount();
..
}
Aghju aghjustatu l'agregazione è a logica di carica è eseguite nantu à un set di dati di prova. Tuttu u travagliu locale nantu à u servitore di sviluppu.
Lanciau dui servitori di teste CentOs, specificate l'indirizzi IP in default-config.xml, eseguite nantu à ognunu.
./bin/ignite.sh config/default-config.xml
I dui nodi Ignite sò in esecuzione è ponu vede l'altru. Specificu l'indirizzi richiesti in a cunfigurazione xml di l'applicazione cliente, cumencia, aghjunghje un terzu node à a topologia è immediatamente ci sò dui nodi di novu. U logu mostra "ClassNotFoundException: model.SalesPoint" in a linea
SalesPoint sp=salesPointCache.get(spId);
StackOverflow dice chì u mutivu di l'errore hè chì ùn ci hè micca una classa SalesPoint persunalizata in i servitori CentOs. Avemu ghjuntu. Chì ne dite di "ùn avete micca bisognu di implementà manualmente u vostru codice Java in ogni node" è cusì? O "u vostru codice Java" ùn hè micca nantu à SalesPoint?
Probabilmente mi mancava qualcosa - cuminciu à circà di novu, leghje è cercà di novu. Dopu qualchì tempu, aghju a sensazione chì aghju lettu tuttu nantu à u tema, ùn ci hè più nunda di novu. Mentre cercava, aghju trovu alcuni cumenti interessanti.
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.
Un altru opinione autoritariu:
Articulu nantu à 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.
Infatti, hè questu. Quì si trova, perchè, stu misteriu furmatu binariu!
3.SingleJar
Denis hà pigliatu u primu postu in a mo valutazione persunale, IMHO u tutoriale più utile di tutti i dispunibili. In u so
Facciu u listessu modu è uttene un unicu schedariu jar chì lancia "node di dati" o "node di cliente" secondu l'argumentu di a linea di cumanda. L'assemblea principia è travaglia. Zero Deployment hè statu scunfittu.
A transizione da megabytes di dati di teste à decine di gigabytes di dati di cummattimentu hà dimustratu chì u formatu binariu esiste per una ragione. Era necessariu di ottimisà u cunsumu di memoria nantu à i nodi, è questu hè induve BinaryObject resultò assai utile.
4. Cunclusioni
U primu rimproveru scontru annantu à a vaguezza di a documentazione di u prughjettu Apache Ignite hè statu ghjustu; pocu hè cambiatu da u 2016. Ùn hè micca faciule per un principiante assemble un prototipu funzionante basatu annantu à un situ web è / o repository.
Basatu nantu à i risultati di u travagliu fattu, l'impressione era chì Zero Deployment travaglia, ma solu à u livellu di u sistema. Qualcosa cum'è questu: BinaryObject hè utilizatu per insignà i nodi di cluster remoti per travaglià cù classi persunalizati; Zero Deployment - mecanismu internu
Apache Ignite stessu è distribuisce l'ogetti di u sistema in tuttu u cluster.
Spergu chì a mo sperienza serà utile à i novi utilizatori Apache Ignite.
Source: www.habr.com