அப்பாச்சி இக்னைட் ஜீரோ வரிசைப்படுத்தல்: உண்மையில் பூஜ்ஜியமா?

அப்பாச்சி இக்னைட் ஜீரோ வரிசைப்படுத்தல்: உண்மையில் பூஜ்ஜியமா?

நாங்கள் சில்லறை நெட்வொர்க்கின் தொழில்நுட்ப மேம்பாட்டுத் துறை. ஒரு நாள், நிர்வாகம் MSSQL உடன் இணைந்து Apache Ignite ஐப் பயன்படுத்தி பெரிய அளவிலான கணக்கீடுகளை விரைவுபடுத்தும் பணியை அமைத்தது, மேலும் ஜாவா குறியீட்டின் அழகான எடுத்துக்காட்டுகள் மற்றும் எடுத்துக்காட்டுகளுடன் ஒரு வலைத்தளத்தைக் காட்டியது. நான் உடனடியாக தளத்தை விரும்பினேன் பூஜ்ஜிய வரிசைப்படுத்தல், இதன் விளக்கம் அற்புதங்களை உறுதியளிக்கிறது: உங்கள் ஜாவா அல்லது ஸ்கலா குறியீட்டை கிரிட்டில் உள்ள ஒவ்வொரு முனையிலும் கைமுறையாக வரிசைப்படுத்த வேண்டியதில்லை மற்றும் ஒவ்வொரு முறையும் அது மாறும் போது அதை மீண்டும் வரிசைப்படுத்த வேண்டும். வேலை முன்னேறும்போது, ​​ஜீரோ டெப்லாய்மென்ட் குறிப்பிட்ட பயன்பாடுகளைக் கொண்டுள்ளது, அதன் அம்சங்களை நான் பகிர்ந்து கொள்ள விரும்புகிறேன். வெட்டுக்கு கீழே எண்ணங்கள் மற்றும் செயல்படுத்தல் விவரங்கள் உள்ளன.

1. பிரச்சனையின் அறிக்கை

பிரச்சனையின் சாராம்சம் பின்வருமாறு. SalesPoint விற்பனை புள்ளி அடைவு மற்றும் Sku (Stock Keeping Unit) தயாரிப்பு கோப்பகம் உள்ளது. விற்பனை புள்ளியில் "சிறிய" மற்றும் "பெரிய" மதிப்புகளுடன் "ஸ்டோர் வகை" பண்பு உள்ளது. ஒரு வகைப்படுத்தல் (விற்பனை புள்ளியின் தயாரிப்புகளின் பட்டியல்) ஒவ்வொரு விற்பனைப் புள்ளியுடனும் இணைக்கப்பட்டுள்ளது (DBMS இலிருந்து ஏற்றப்பட்டது) மற்றும் குறிப்பிட்ட தேதியிலிருந்து குறிப்பிட்ட தயாரிப்பு பற்றிய தகவல் வழங்கப்படுகிறது.
வகைப்படுத்தலில் இருந்து விலக்கப்பட்டது அல்லது வகைப்படுத்தலில் சேர்க்கப்பட்டது.

விற்பனை புள்ளிகளின் பிரிக்கப்பட்ட தற்காலிக சேமிப்பை ஒழுங்கமைத்து, இணைக்கப்பட்ட தயாரிப்புகள் பற்றிய தகவல்களை ஒரு மாதத்திற்கு முன்பே அதில் சேமிக்க வேண்டும். காம்பாட் சிஸ்டத்துடன் இணக்கத்தன்மைக்கு, தரவை ஏற்றுவதற்கு, படிவத்தின் (ஸ்டோர் வகை, தயாரிப்புக் குறியீடு, நாள், எண்_of_sales_points) மொத்தத்தைக் கணக்கிட்டு, அதை மீண்டும் DBMS இல் பதிவேற்றுவதற்கு, Ignite கிளையன்ட் நோட் தேவைப்படுகிறது.

2. இலக்கியம் பற்றிய ஆய்வு

எனக்கு இதுவரை எந்த அனுபவமும் இல்லை, அதனால் நான் அடுப்பில் இருந்து நடனமாடத் தொடங்குகிறேன். அதாவது, வெளியீடுகளின் மதிப்பாய்விலிருந்து.

கட்டுரை 2016 அப்பாச்சி இக்னைட்டை அறிமுகப்படுத்துகிறோம்: முதல் படிகள் அப்பாச்சி இக்னைட் திட்டத்தின் ஆவணத்திற்கான இணைப்பைக் கொண்டுள்ளது மற்றும் அதே நேரத்தில் இந்த ஆவணத்தின் தெளிவற்ற தன்மைக்கான ஒரு பழிவாங்கும். ஓரிரு முறை மீண்டும் படித்தேன், தெளிவு வரவில்லை. நான் அதிகாரப்பூர்வ டுடோரியலைப் பார்க்கிறேன் தொடங்குதல், இது
நம்பிக்கையுடன் உறுதியளிக்கிறார் "நீங்கள் ஒரு நொடியில் இயங்குவீர்கள்!" இரண்டு அப்பாச்சி இக்னைட் எசென்ஷியல்ஸ் வீடியோக்களைப் பார்த்து, சூழல் மாறி அமைப்புகளைக் கண்டுபிடித்து வருகிறேன், ஆனால் அவை எனது குறிப்பிட்ட பணிக்கு மிகவும் பயனுள்ளதாக இல்லை. "example-ignite.xml" என்ற நிலையான கோப்புடன் கட்டளை வரியிலிருந்து Ignite ஐ வெற்றிகரமாக துவக்கி, முதல் பயன்பாட்டை உருவாக்குகிறேன் கணக்கீடு விண்ணப்பம் மேவன் பயன்படுத்தி. பயன்பாடு வேலை செய்கிறது மற்றும் ஜீரோ வரிசைப்படுத்தலைப் பயன்படுத்துகிறது, என்ன அழகு!

நான் மேலும் படித்தேன், அங்கு உதாரணம் உடனடியாக affinityKey ஐப் பயன்படுத்துகிறது (முன்பு SQL வினவல் மூலம் உருவாக்கப்பட்டது), மேலும் மர்மமான BinaryObject ஐப் பயன்படுத்துகிறது:

IgniteCache<BinaryObject, BinaryObject> people 
        = ignite.cache("Person").withKeepBinary(); 

நான் அதைப் படித்தேன் немного: பைனரி வடிவம் - பிரதிபலிப்பு போன்ற ஒன்று, ஒரு பொருளின் புலங்களை பெயரால் அணுகுவது. ஒரு புலத்தின் மதிப்பை, பொருளை முழுவதுமாக நீக்காமல் படிக்க முடியும் (நினைவகத்தை சேமிக்கிறது). பூஜ்ஜிய வரிசைப்படுத்தல் இருப்பதால், நபருக்குப் பதிலாக பைனரி ஆப்ஜெக்ட் ஏன் பயன்படுத்தப்படுகிறது? ஏன் IgniteCache IgniteCache க்கு மாற்றப்பட்டது ? இன்னும் தெளிவாக தெரியவில்லை.

எனது வழக்குக்கு ஏற்றவாறு கம்ப்யூட் அப்ளிகேஷனை ரீமேக் செய்கிறேன். 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 பதிவுகளுக்கு ஒவ்வொரு கிளஸ்டர் முனையிலும் தேவையான மொத்த அளவு கட்டமைக்கப்படும் என்று கருதுகிறது, அதன் பிறகு கிளையன்ட் முனை இறுதி கூட்டுத்தொகையைச் செய்யும்.

நான் டுடோரியலைப் படிக்கிறேன் முதலில் இக்னிட் கம்ப்யூட் அப்ளிகேஷன், நான் அதை ஒப்புமை மூலம் செய்கிறேன். ஒவ்வொரு கிளஸ்டர் முனையிலும் நான் 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 சேவையகங்களில் தனிப்பயன் SalesPoint வகுப்பு இல்லாததே பிழைக்கான காரணம் என்று StackOverflow கூறுகிறது. வந்துவிட்டோம். "ஒவ்வொரு முனையிலும் உங்கள் ஜாவா குறியீட்டை கைமுறையாகப் பயன்படுத்த வேண்டியதில்லை" மற்றும் பலவற்றைப் பற்றி எப்படி? அல்லது "உங்கள் ஜாவா குறியீடு" சேல்ஸ்பாயிண்ட் பற்றியது இல்லையா?

நான் எதையாவது தவறவிட்டிருக்கலாம் - நான் மீண்டும் தேட ஆரம்பிக்கிறேன், மீண்டும் படிக்கிறேன் மற்றும் தேடுகிறேன். சிறிது நேரம் கழித்து, நான் தலைப்பில் எல்லாவற்றையும் படித்தேன், இனி புதிதாக எதுவும் இல்லை என்ற உணர்வு எனக்கு வருகிறது. நான் தேடும் போது, ​​சில சுவாரஸ்யமான கருத்துகள் கிடைத்தது.

வாலண்டைன் குலிச்சென்கோ, GridGain Systems இல் முன்னணி கட்டிடக்கலை நிபுணர், பதில் ஸ்டாக்ஓவர்ஃப்ளோவில், ஏப்ரல் 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 அனைத்து கிடைக்கக்கூடிய மிகவும் பயனுள்ள பயிற்சி. அவரது மைக்ரோ சர்வீசஸ் உதாரணம் கிதுப் கிளஸ்டர் முனைகளை அமைப்பதற்கான முற்றிலும் ஆயத்த உதாரணத்தைக் கொண்டுள்ளது, இது கூடுதல் குந்துதல் இல்லாமல் தொகுக்கிறது.

நான் அதை அதே வழியில் செய்கிறேன் மற்றும் கட்டளை வரி வாதத்தைப் பொறுத்து “டேட்டா நோட்” அல்லது “கிளையன்ட் நோட்” ஐத் தொடங்கும் ஒரு ஜார் கோப்பைப் பெறுகிறேன். சட்டசபை தொடங்குகிறது மற்றும் வேலை செய்கிறது. பூஜ்ஜிய வரிசைப்படுத்தல் தோற்கடிக்கப்பட்டது.

சோதனைத் தரவின் மெகாபைட்களிலிருந்து பத்து ஜிகாபைட் போர் தரவுகளுக்கு மாறுவது பைனரி வடிவம் ஒரு காரணத்திற்காக இருப்பதைக் காட்டுகிறது. முனைகளில் நினைவக நுகர்வுகளை மேம்படுத்துவது அவசியமாக இருந்தது, இங்குதான் பைனரிஆப்ஜெக்ட் மிகவும் பயனுள்ளதாக இருந்தது.

4. கண்டுபிடிப்புகள்

அப்பாச்சி இக்னைட் திட்ட ஆவணங்களின் தெளிவின்மை பற்றி எதிர்கொண்ட முதல் பழி நியாயமானது; 2016 முதல் சிறிதும் மாறவில்லை. இணையதளம் மற்றும்/அல்லது களஞ்சியத்தின் அடிப்படையில் செயல்படும் முன்மாதிரியை ஒரு தொடக்கநிலையாளர் ஒன்று சேர்ப்பது எளிதானது அல்ல.

செய்யப்பட்ட வேலையின் முடிவுகளின் அடிப்படையில், ஜீரோ டெப்லாய்மென்ட் வேலை செய்கிறது, ஆனால் கணினி மட்டத்தில் மட்டுமே செயல்படுகிறது. இது போன்ற ஒன்று: தனிப்பயன் வகுப்புகளுடன் பணிபுரிய தொலைநிலை கிளஸ்டர் முனைகளை கற்பிக்க பைனரிஆப்ஜெக்ட் பயன்படுத்தப்படுகிறது; பூஜ்ஜிய வரிசைப்படுத்தல் - உள் பொறிமுறை
அப்பாச்சி தன்னைத்தானே பற்றவைத்து, சிஸ்டம் அப்ஜெக்ட்களை கிளஸ்டர் முழுவதும் விநியோகம் செய்கிறது.

எனது அனுபவம் புதிய Apache Ignite பயனர்களுக்கு பயனுள்ளதாக இருக்கும் என்று நம்புகிறேன்.

ஆதாரம்: www.habr.com

கருத்தைச் சேர்