అపాచీ ఇగ్నైట్ జీరో డిప్లాయ్‌మెంట్: నిజంగా సున్నా?

అపాచీ ఇగ్నైట్ జీరో డిప్లాయ్‌మెంట్: నిజంగా సున్నా?

మేము రిటైల్ నెట్‌వర్క్ యొక్క సాంకేతిక అభివృద్ధి విభాగం. ఒకరోజు, 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(); 

నేను దానిని చదివాను కొద్దిగా: బైనరీ ఫార్మాట్ - ప్రతిబింబం వంటిది, పేరు ద్వారా వస్తువు యొక్క ఫీల్డ్‌లను యాక్సెస్ చేయడం. ఆబ్జెక్ట్‌ను పూర్తిగా డీరియలైజ్ చేయకుండా ఫీల్డ్ విలువను చదవగలదు (మెమొరీని ఆదా చేయడం). జీరో డిప్లాయ్‌మెంట్ ఉన్నందున, వ్యక్తికి బదులుగా బైనరీ ఆబ్జెక్ట్ ఎందుకు ఉపయోగించబడింది? ఎందుకు IgniteCache IgniteCacheకి బదిలీ చేయబడింది ? అనేది ఇంకా స్పష్టంగా తెలియలేదు.

నా సందర్భానికి తగ్గట్టుగా నేను కంప్యూట్ అప్లికేషన్‌ని రీమేక్ చేస్తున్నాను. 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>

పాయింట్ ఆఫ్ సేల్ వారీగా విభజన చేయడం వలన ప్రతి క్లస్టర్ నోడ్‌లో అందుబాటులో ఉన్న సేల్స్‌పాయింట్‌కాష్ రికార్డ్‌ల కోసం అవసరమైన మొత్తం నిర్మించబడుతుందని భావించబడుతుంది, ఆ తర్వాత క్లయింట్ నోడ్ తుది సమ్మషన్‌ను నిర్వహిస్తుంది.

నేను ట్యుటోరియల్ చదువుతున్నాను మొదటి ఇగ్నైట్ కంప్యూట్ అప్లికేషన్, నేను సారూప్యతతో చేస్తాను. ప్రతి క్లస్టర్ నోడ్‌లో నేను IgniteRunnable(), ఇలాంటిదేని అమలు చేస్తాను:

  @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 చెప్పింది. మేము వచ్చాము. "మీరు ప్రతి నోడ్‌లో మీ జావా కోడ్‌ను మాన్యువల్‌గా అమలు చేయనవసరం లేదు" మరియు ఇంకా ఎలా? లేదా "మీ జావా కోడ్" సేల్స్‌పాయింట్ గురించి కాదా?

నేను బహుశా ఏదో కోల్పోయాను - నేను మళ్లీ వెతకడం, చదవడం మరియు మళ్లీ వెతకడం ప్రారంభిస్తాను. కాసేపయ్యాక, టాపిక్ అంతా చదివాను, ఇక కొత్తేమీ లేదు అన్న ఫీలింగ్ కలుగుతుంది. నేను వెతుకుతున్నప్పుడు, నాకు కొన్ని ఆసక్తికరమైన వ్యాఖ్యలు కనిపించాయి.

వాలెంటిన్ కులిచెంకో, గ్రిడ్‌గెయిన్ సిస్టమ్స్‌లో లీడ్ ఆర్కిటెక్ట్, సమాధానం స్టాక్ ఓవర్‌ఫ్లో, ఏప్రిల్ 2016:

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 సిస్టమ్స్.

హబ్రేపై కథనం మైక్రోసర్వీస్ గురించి డెనిస్ మాగ్డా యొక్క మూడు వ్యాసాలను సూచిస్తుంది: మైక్రోసర్వీసెస్ పార్ట్ 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.SingleJar

డెనిస్ నా వ్యక్తిగత రేటింగ్‌లో మొదటి స్థానంలో నిలిచాడు, అందుబాటులో ఉన్న అన్నింటిలో IMHO అత్యంత ఉపయోగకరమైన ట్యుటోరియల్. ఆయన లో మైక్రోసర్వీసెస్ ఉదాహరణ Github క్లస్టర్ నోడ్‌లను సెటప్ చేయడానికి పూర్తిగా రెడీమేడ్ ఉదాహరణను కలిగి ఉంది, ఇది అదనపు స్క్వాటింగ్ లేకుండా కంపైల్ చేస్తుంది.

నేను అదే విధంగా చేస్తాను మరియు కమాండ్ లైన్ ఆర్గ్యుమెంట్ ఆధారంగా "డేటా నోడ్" లేదా "క్లయింట్ నోడ్"ని ప్రారంభించే ఒకే జార్ ఫైల్‌ని పొందుతాను. అసెంబ్లీ ప్రారంభమవుతుంది మరియు పని చేస్తుంది. జీరో డిప్లాయ్‌మెంట్ ఓడిపోయింది.

మెగాబైట్‌ల పరీక్ష డేటా నుండి పదుల గిగాబైట్‌ల పోరాట డేటాకు మారడం వల్ల బైనరీ ఫార్మాట్ ఒక కారణంతో ఉందని తేలింది. నోడ్‌లలో మెమరీ వినియోగాన్ని ఆప్టిమైజ్ చేయడం అవసరం మరియు ఇక్కడే బైనరీ ఆబ్జెక్ట్ చాలా ఉపయోగకరంగా మారింది.

4. ముగింపులు

అపాచీ ఇగ్నైట్ ప్రాజెక్ట్ డాక్యుమెంటేషన్ యొక్క అస్పష్టత గురించి ఎదురైన మొదటి నింద సరసమైనది; 2016 నుండి కొద్దిగా మార్పు వచ్చింది. ఒక అనుభవశూన్యుడు వెబ్‌సైట్ మరియు/లేదా రిపోజిటరీ ఆధారంగా పనిచేసే ప్రోటోటైప్‌ను సమీకరించడం సులభం కాదు.

చేసిన పని ఫలితాల ఆధారంగా, జీరో డిప్లాయ్‌మెంట్ పని చేస్తుందనే అభిప్రాయం ఉంది, కానీ సిస్టమ్ స్థాయిలో మాత్రమే. ఇలాంటివి: BinaryObject కస్టమ్ తరగతులతో పని చేయడానికి రిమోట్ క్లస్టర్ నోడ్‌లను బోధించడానికి ఉపయోగించబడుతుంది; జీరో డిప్లాయ్‌మెంట్ - అంతర్గత మెకానిజం
అపాచీ స్వయంగా ఇగ్నైట్ చేస్తుంది మరియు క్లస్టర్ అంతటా సిస్టమ్ వస్తువులను పంపిణీ చేస్తుంది.

నా అనుభవం కొత్త Apache Ignite వినియోగదారులకు ఉపయోగకరంగా ఉంటుందని నేను ఆశిస్తున్నాను.

మూలం: www.habr.com

ఒక వ్యాఖ్యను జోడించండి