మేము రిటైల్ నెట్వర్క్ యొక్క సాంకేతిక అభివృద్ధి విభాగం. ఒకరోజు, MSSQLతో కలిపి అపాచీ ఇగ్నైట్ని ఉపయోగించడం ద్వారా పెద్ద ఎత్తున గణనలను వేగవంతం చేసే పనిని మేనేజ్మెంట్ సెట్ చేసింది మరియు జావా కోడ్ యొక్క అందమైన దృష్టాంతాలు మరియు ఉదాహరణలతో కూడిన వెబ్సైట్ను చూపించింది. నేను వెంటనే సైట్ను ఇష్టపడ్డాను
1. సమస్య యొక్క ప్రకటన
సమస్య యొక్క సారాంశం క్రింది విధంగా ఉంది. సేల్స్ పాయింట్ల సేల్స్ పాయింట్ డైరెక్టరీ మరియు Sku (స్టాక్ కీపింగ్ యూనిట్) ఉత్పత్తి డైరెక్టరీ ఉన్నాయి. సేల్ పాయింట్లో “చిన్న” మరియు “పెద్ద” విలువలతో “స్టోర్ రకం” లక్షణం ఉంది. ఒక కలగలుపు (పాయింట్ ఆఫ్ సేల్ యొక్క ఉత్పత్తుల జాబితా) ప్రతి అమ్మకపు పాయింట్కి (DBMS నుండి లోడ్ చేయబడింది) అనుసంధానించబడి ఉంటుంది మరియు పేర్కొన్న తేదీ నుండి పేర్కొన్న ఉత్పత్తి గురించి సమాచారం అందించబడుతుంది
కలగలుపు నుండి మినహాయించబడింది లేదా కలగలుపుకు జోడించబడింది.
సేల్ పాయింట్ల విభజన కాష్ను నిర్వహించడం మరియు కనెక్ట్ చేయబడిన ఉత్పత్తుల గురించి సమాచారాన్ని ఒక నెల ముందుగానే నిల్వ చేయడం అవసరం. కంబాట్ సిస్టమ్తో అనుకూలతకు డేటాను లోడ్ చేయడానికి ఇగ్నైట్ క్లయింట్ నోడ్ అవసరం, ఫారమ్ (స్టోర్ రకం, ఉత్పత్తి కోడ్, రోజు, number_of_sales_points) మొత్తాన్ని లెక్కించి, దానిని తిరిగి DBMSకి అప్లోడ్ చేయండి.
2. సాహిత్యం అధ్యయనం
నాకు ఇంకా ఎలాంటి అనుభవం లేదు, కాబట్టి నేను స్టవ్ నుండి నృత్యం చేయడం ప్రారంభించాను. అంటే, ప్రచురణల సమీక్ష నుండి.
ఆర్టికల్ 2016
ఆశాజనకంగా వాగ్దానం చేసింది "మీరు ఒక క్షణంలో లేచి నడుస్తున్నారు!" నేను ఎన్విరాన్మెంట్ వేరియబుల్ సెట్టింగ్లను కనుగొంటున్నాను, రెండు Apache Ignite Essentials వీడియోలను చూస్తున్నాను, కానీ అవి నా నిర్దిష్ట పనికి చాలా ఉపయోగకరంగా లేవు. నేను కమాండ్ లైన్ నుండి "example-ignite.xml" అనే ప్రామాణిక ఫైల్తో ఇగ్నైట్ని విజయవంతంగా ప్రారంభించాను, మొదటి అప్లికేషన్ను రూపొందించాను
నేను ఇంకా చదివాను మరియు అక్కడ ఉదాహరణ వెంటనే అనుబంధ కీని ఉపయోగిస్తుంది (ముందు SQL ప్రశ్న ద్వారా సృష్టించబడింది), మరియు రహస్యమైన BinaryObjectని కూడా ఉపయోగిస్తుంది:
IgniteCache<BinaryObject, BinaryObject> people
= ignite.cache("Person").withKeepBinary();
నేను దానిని చదివాను
నా సందర్భానికి తగ్గట్టుగా నేను కంప్యూట్ అప్లికేషన్ని రీమేక్ చేస్తున్నాను. MSSQLలో సేల్ పాయింట్ల డైరెక్టరీ యొక్క ప్రాధమిక కీ [id] [int] శూన్యం కాదు, నేను సారూప్యత ద్వారా కాష్ని సృష్టిస్తాను
IgniteCache<Integer, SalesPoint> salesPointCache=ignite.cache("spCache")
xml configలో నేను కాష్ విభజించబడిందని సూచిస్తున్నాను
<bean class="org.apache.ignite.configuration.CacheConfiguration">
<property name="name" value="spCache"/>
<property name="cacheMode" value="PARTITIONED"/>
</bean>
పాయింట్ ఆఫ్ సేల్ వారీగా విభజన చేయడం వలన ప్రతి క్లస్టర్ నోడ్లో అందుబాటులో ఉన్న సేల్స్పాయింట్కాష్ రికార్డ్ల కోసం అవసరమైన మొత్తం నిర్మించబడుతుందని భావించబడుతుంది, ఆ తర్వాత క్లయింట్ నోడ్ తుది సమ్మషన్ను నిర్వహిస్తుంది.
నేను ట్యుటోరియల్ చదువుతున్నాను
@Override
public void run() {
SalesPoint sp=salesPointCache.get(spId);
sp.calculateSalesPointCount();
..
}
నేను అగ్రిగేషన్ మరియు అప్లోడ్ లాజిక్ని జోడించి, దానిని టెస్ట్ డేటా సెట్లో రన్ చేస్తాను. డెవలప్మెంట్ సర్వర్లో ప్రతిదీ స్థానికంగా పనిచేస్తుంది.
నేను రెండు CentOs టెస్ట్ సర్వర్లను ప్రారంభిస్తాను, IP చిరునామాలను default-config.xmlలో పేర్కొనండి, ప్రతిదానిపై అమలు చేయండి
./bin/ignite.sh config/default-config.xml
ఇగ్నైట్ నోడ్లు రెండూ నడుస్తున్నాయి మరియు ఒకదానికొకటి చూడగలవు. నేను క్లయింట్ అప్లికేషన్ యొక్క xml కాన్ఫిగరేషన్లో అవసరమైన చిరునామాలను నిర్దేశిస్తాను, అది ప్రారంభమవుతుంది, టోపోలాజీకి మూడవ నోడ్ను జోడిస్తుంది మరియు వెంటనే మళ్లీ రెండు నోడ్లు ఉన్నాయి. లాగ్ లైన్లో “ClassNotFoundException: model.SalesPoint”ని చూపుతుంది
SalesPoint sp=salesPointCache.get(spId);
CentOs సర్వర్లలో కస్టమ్ సేల్స్పాయింట్ క్లాస్ లేకపోవడమే ఎర్రర్కు కారణమని 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.
మరొక అధికారిక అభిప్రాయం:
హబ్రేపై కథనం
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 అత్యంత ఉపయోగకరమైన ట్యుటోరియల్. ఆయన లో
నేను అదే విధంగా చేస్తాను మరియు కమాండ్ లైన్ ఆర్గ్యుమెంట్ ఆధారంగా "డేటా నోడ్" లేదా "క్లయింట్ నోడ్"ని ప్రారంభించే ఒకే జార్ ఫైల్ని పొందుతాను. అసెంబ్లీ ప్రారంభమవుతుంది మరియు పని చేస్తుంది. జీరో డిప్లాయ్మెంట్ ఓడిపోయింది.
మెగాబైట్ల పరీక్ష డేటా నుండి పదుల గిగాబైట్ల పోరాట డేటాకు మారడం వల్ల బైనరీ ఫార్మాట్ ఒక కారణంతో ఉందని తేలింది. నోడ్లలో మెమరీ వినియోగాన్ని ఆప్టిమైజ్ చేయడం అవసరం మరియు ఇక్కడే బైనరీ ఆబ్జెక్ట్ చాలా ఉపయోగకరంగా మారింది.
4. ముగింపులు
అపాచీ ఇగ్నైట్ ప్రాజెక్ట్ డాక్యుమెంటేషన్ యొక్క అస్పష్టత గురించి ఎదురైన మొదటి నింద సరసమైనది; 2016 నుండి కొద్దిగా మార్పు వచ్చింది. ఒక అనుభవశూన్యుడు వెబ్సైట్ మరియు/లేదా రిపోజిటరీ ఆధారంగా పనిచేసే ప్రోటోటైప్ను సమీకరించడం సులభం కాదు.
చేసిన పని ఫలితాల ఆధారంగా, జీరో డిప్లాయ్మెంట్ పని చేస్తుందనే అభిప్రాయం ఉంది, కానీ సిస్టమ్ స్థాయిలో మాత్రమే. ఇలాంటివి: BinaryObject కస్టమ్ తరగతులతో పని చేయడానికి రిమోట్ క్లస్టర్ నోడ్లను బోధించడానికి ఉపయోగించబడుతుంది; జీరో డిప్లాయ్మెంట్ - అంతర్గత మెకానిజం
అపాచీ స్వయంగా ఇగ్నైట్ చేస్తుంది మరియు క్లస్టర్ అంతటా సిస్టమ్ వస్తువులను పంపిణీ చేస్తుంది.
నా అనుభవం కొత్త Apache Ignite వినియోగదారులకు ఉపయోగకరంగా ఉంటుందని నేను ఆశిస్తున్నాను.
మూలం: www.habr.com