1C: எண்டர்பிரைஸ்: ஜாவா, போஸ்ட்கிரெஸ்க்யூஎல், ஹேசல்காஸ்ட் ஆகியவற்றிற்கான உயர்-சுமை அளவிடக்கூடிய சேவையை எப்படி, ஏன் எழுதினோம்

இந்த கட்டுரையில் நாம் எப்படி, ஏன் வளர்ந்தோம் என்பதைப் பற்றி பேசுவோம் தொடர்பு அமைப்பு - கிளையன்ட் பயன்பாடுகள் மற்றும் 1C: எண்டர்பிரைஸ் சர்வர்கள் இடையே தகவலை மாற்றும் ஒரு பொறிமுறை - ஒரு பணியை அமைப்பதில் இருந்து கட்டமைப்பு மற்றும் செயல்படுத்தல் விவரங்கள் மூலம் சிந்திக்கும் வரை.

இண்டராக்ஷன் சிஸ்டம் (இனி SV என குறிப்பிடப்படுகிறது) என்பது ஒரு விநியோகிக்கப்பட்ட, தவறான-சகிப்புத்தன்மை கொண்ட செய்தியிடல் அமைப்பாகும். SV ஆனது அதிக அளவீடுகளுடன் கூடிய உயர்-சுமை சேவையாக வடிவமைக்கப்பட்டுள்ளது, இது ஆன்லைன் சேவையாக (1C ஆல் வழங்கப்படுகிறது) மற்றும் உங்கள் சொந்த சர்வர் வசதிகளில் பயன்படுத்தக்கூடிய பெருமளவிலான தயாரிப்பாகவும் கிடைக்கிறது.

SV விநியோகிக்கப்பட்ட சேமிப்பிடத்தைப் பயன்படுத்துகிறது ஹேசல்காஸ்ட் மற்றும் தேடுபொறி Elasticsearch. ஜாவா மற்றும் PostgreSQL ஐ கிடைமட்டமாக அளவிடுவது பற்றியும் பேசுவோம்.
1C: எண்டர்பிரைஸ்: ஜாவா, போஸ்ட்கிரெஸ்க்யூஎல், ஹேசல்காஸ்ட் ஆகியவற்றிற்கான உயர்-சுமை அளவிடக்கூடிய சேவையை எப்படி, ஏன் எழுதினோம்

பிரச்சனை அறிக்கை

நாங்கள் ஏன் தொடர்பு அமைப்பை உருவாக்கினோம் என்பதை தெளிவுபடுத்த, 1C இல் வணிக பயன்பாடுகளின் மேம்பாடு எவ்வாறு செயல்படுகிறது என்பதைப் பற்றி நான் உங்களுக்குச் சொல்கிறேன்.

தொடங்குவதற்கு, நாங்கள் என்ன செய்கிறோம் என்று இன்னும் தெரியாதவர்களுக்காக எங்களைப் பற்றி கொஞ்சம் :) நாங்கள் 1C: எண்டர்பிரைஸ் தொழில்நுட்ப தளத்தை உருவாக்குகிறோம். இயங்குதளத்தில் வணிக பயன்பாட்டு மேம்பாட்டுக் கருவியும், வணிக பயன்பாடுகளை குறுக்கு-தள சூழலில் இயக்க அனுமதிக்கும் இயக்க நேரமும் அடங்கும்.

கிளையண்ட்-சர்வர் மேம்பாட்டிற்கான முன்னுதாரணம்

1C இல் உருவாக்கப்பட்ட வணிக பயன்பாடுகள்: எண்டர்பிரைஸ் மூன்று நிலைகளில் இயங்குகிறது கிளையன்ட்-சர்வர் கட்டமைப்பு "DBMS - பயன்பாட்டு சேவையகம் - கிளையன்ட்". விண்ணப்பக் குறியீடு எழுதப்பட்டுள்ளது உள்ளமைக்கப்பட்ட 1C மொழி, பயன்பாட்டு சேவையகத்தில் அல்லது கிளையண்டில் செயல்படுத்தப்படலாம். பயன்பாட்டு பொருள்களுடன் (அடைவுகள், ஆவணங்கள், முதலியன) அனைத்து வேலைகளும், அத்துடன் தரவுத்தளத்தைப் படிப்பது மற்றும் எழுதுவது, சேவையகத்தில் மட்டுமே செய்யப்படுகிறது. படிவங்கள் மற்றும் கட்டளை இடைமுகத்தின் செயல்பாடும் சர்வரில் செயல்படுத்தப்படுகிறது. கிளையன்ட் படிவங்களைப் பெறுதல், திறப்பது மற்றும் காட்சிப்படுத்துதல், பயனருடன் "தொடர்பு" (எச்சரிக்கைகள், கேள்விகள்...), விரைவான பதில் தேவைப்படும் படிவங்களில் சிறிய கணக்கீடுகள் (உதாரணமாக, விலையை அளவு மூலம் பெருக்குதல்), உள்ளூர் கோப்புகளுடன் பணிபுரிதல், உபகரணங்கள் வேலை.

பயன்பாட்டுக் குறியீட்டில், &AtClient / &AtServer வழிமுறைகளைப் பயன்படுத்தி (&AtClient / &AtServer மொழியின் ஆங்கிலப் பதிப்பில்) குறியீடு எங்கு செயல்படுத்தப்படும் என்பதை நடைமுறைகள் மற்றும் செயல்பாடுகளின் தலைப்புகள் வெளிப்படையாகக் குறிப்பிட வேண்டும். 1C டெவலப்பர்கள் இப்போது கட்டளைகள் உண்மையில் உள்ளன என்று கூறி என்னை சரிசெய்வார்கள் விட, ஆனால் எங்களுக்கு இது இப்போது முக்கியமில்லை.

நீங்கள் கிளையன்ட் குறியீட்டிலிருந்து சேவையகக் குறியீட்டை அழைக்கலாம், ஆனால் சேவையகக் குறியீட்டிலிருந்து கிளையன்ட் குறியீட்டை நீங்கள் அழைக்க முடியாது. இது பல காரணங்களுக்காக நாங்கள் செய்த அடிப்படை வரம்பு. குறிப்பாக, சர்வர் குறியீடு எங்கு அழைக்கப்பட்டாலும் அதே வழியில் செயல்படும் வகையில் எழுதப்பட வேண்டும் - கிளையண்ட் அல்லது சர்வரில் இருந்து. மற்றொரு சேவையகக் குறியீட்டிலிருந்து சேவையகக் குறியீட்டை அழைக்கும் விஷயத்தில், அத்தகைய கிளையன்ட் இல்லை. சர்வர் குறியீட்டை செயல்படுத்தும் போது, ​​அதை அழைத்த கிளையன்ட் மூடலாம், பயன்பாட்டிலிருந்து வெளியேறலாம், மேலும் சேவையகம் இனி யாரையும் அழைக்க முடியாது.

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

இதன் பொருள் என்னவென்றால், சேவையகத்திலிருந்து கிளையன்ட் பயன்பாட்டிற்கு சில செய்திகளை அனுப்ப விரும்பினால், எடுத்துக்காட்டாக, "நீண்டகால" அறிக்கையின் உருவாக்கம் முடிந்துவிட்டது மற்றும் அறிக்கையைப் பார்க்க முடியும், அத்தகைய முறை எங்களிடம் இல்லை. நீங்கள் தந்திரங்களைப் பயன்படுத்த வேண்டும், எடுத்துக்காட்டாக, கிளையன்ட் குறியீட்டிலிருந்து சேவையகத்தை அவ்வப்போது வாக்களிக்கவும். ஆனால் இந்த அணுகுமுறை தேவையற்ற அழைப்புகளுடன் கணினியை ஏற்றுகிறது, மேலும் பொதுவாக மிகவும் நேர்த்தியாகத் தெரியவில்லை.

மேலும் ஒரு தேவை உள்ளது, எடுத்துக்காட்டாக, ஒரு தொலைபேசி அழைப்பு வரும்போது மேலும் SIP- அழைப்பைச் செய்யும்போது, ​​இது குறித்து கிளையன்ட் பயன்பாட்டிற்குத் தெரிவிக்கவும், இதனால் அழைப்பாளரின் எண்ணைப் பயன்படுத்தி அதை எதிர் தரப்பு தரவுத்தளத்தில் கண்டறிந்து, அழைப்பு எதிர்தரப்பைப் பற்றிய பயனர் தகவலைக் காண்பிக்க முடியும். அல்லது, எடுத்துக்காட்டாக, கிடங்கிற்கு ஆர்டர் வரும்போது, ​​வாடிக்கையாளரின் கிளையன்ட் விண்ணப்பத்திற்கு இதைப் பற்றி தெரிவிக்கவும். பொதுவாக, அத்தகைய பொறிமுறையானது பயனுள்ளதாக இருக்கும் பல சந்தர்ப்பங்கள் உள்ளன.

உற்பத்தியே

செய்தி அனுப்பும் பொறிமுறையை உருவாக்கவும். வேகமான, நம்பகமான, உத்தரவாதமான டெலிவரியுடன், மெசேஜ்களை நெகிழ்வாகத் தேடும் திறனுடன். பொறிமுறையின் அடிப்படையில், 1C பயன்பாடுகளுக்குள் இயங்கும் மெசஞ்சரை (செய்திகள், வீடியோ அழைப்புகள்) செயல்படுத்தவும்.

கணினியை கிடைமட்டமாக அளவிடக்கூடியதாக வடிவமைக்கவும். கணுக்களின் எண்ணிக்கையை அதிகரிப்பதன் மூலம் அதிகரிக்கும் சுமை மூடப்பட வேண்டும்.

Реализация

SV இன் சர்வர் பகுதியை நேரடியாக 1C:Enterprise பிளாட்ஃபார்மில் ஒருங்கிணைக்க வேண்டாம் என்று முடிவு செய்தோம், ஆனால் அதை ஒரு தனி தயாரிப்பாக செயல்படுத்த முடிவு செய்தோம், இதன் API ஐ 1C பயன்பாட்டு தீர்வுகளின் குறியீட்டிலிருந்து அழைக்கலாம். இது பல காரணங்களுக்காக செய்யப்பட்டது, அதில் முக்கியமானது, வெவ்வேறு 1C பயன்பாடுகளுக்கு இடையில் செய்திகளை பரிமாறிக்கொள்ள நான் விரும்பினேன் (உதாரணமாக, வர்த்தக மேலாண்மை மற்றும் கணக்கியல் இடையே). வெவ்வேறு 1C பயன்பாடுகள் 1C இன் வெவ்வேறு பதிப்புகளில் இயங்கலாம்: எண்டர்பிரைஸ் இயங்குதளம், வெவ்வேறு சேவையகங்களில் அமைந்திருக்கும். இத்தகைய நிலைமைகளில், 1C நிறுவல்களின் "பக்கத்தில்" அமைந்துள்ள ஒரு தனி தயாரிப்பாக SV ஐ செயல்படுத்துவது உகந்த தீர்வாகும்.

எனவே, எஸ்.வி.யை தனி தயாரிப்பாக உருவாக்க முடிவு செய்தோம். உள்ளூர் நிறுவல் மற்றும் சர்வரின் உள்ளமைவுடன் தொடர்புடைய மேல்நிலைச் செலவுகளைத் தவிர்க்க, எங்கள் கிளவுட்டில் (wss://1cdialog.com) நிறுவிய CB சேவையகத்தை சிறிய நிறுவனங்கள் பயன்படுத்த பரிந்துரைக்கிறோம். பெரிய வாடிக்கையாளர்கள் தங்கள் வசதிகளில் தங்கள் சொந்த CB சேவையகத்தை நிறுவுவது நல்லது. எங்கள் கிளவுட் சாஸ் தயாரிப்பிலும் இதே அணுகுமுறையைப் பயன்படுத்தினோம் 1c புதியது - இது வாடிக்கையாளர்களின் தளங்களில் நிறுவுவதற்காக பெருமளவில் தயாரிக்கப்பட்ட தயாரிப்பாக தயாரிக்கப்படுகிறது, மேலும் இது எங்கள் கிளவுடிலும் பயன்படுத்தப்படுகிறது. https://1cfresh.com/.

விண்ணப்ப

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

கிளையன்ட் மற்றும் சர்வர் இடையேயான தொடர்பு வெப்சாக்கெட் வழியாகும். இது நிகழ்நேர அமைப்புகளுக்கு மிகவும் பொருத்தமானது.

விநியோகிக்கப்பட்ட தற்காலிக சேமிப்பு

நாங்கள் Redis, Hazelcast மற்றும் Ehcache ஆகியவற்றிற்கு இடையே தேர்வு செய்தோம். அது 2015. ரெடிஸ் இப்போது ஒரு புதிய கிளஸ்டரை வெளியிட்டார் (மிகவும் புதியது, பயங்கரமானது), நிறைய கட்டுப்பாடுகளுடன் சென்டினல் உள்ளது. Ehcache க்கு ஒரு கிளஸ்டரில் எவ்வாறு இணைப்பது என்று தெரியவில்லை (இந்த செயல்பாடு பின்னர் தோன்றியது). ஹேசல்காஸ்ட் 3.4 உடன் முயற்சிக்க முடிவு செய்தோம்.
ஹேசல்காஸ்ட் பெட்டிக்கு வெளியே ஒரு கொத்துக்குள் கூடியது. ஒற்றை முனை பயன்முறையில், இது மிகவும் பயனுள்ளதாக இல்லை மற்றும் தற்காலிக சேமிப்பாக மட்டுமே பயன்படுத்த முடியும் - வட்டில் தரவை எவ்வாறு டம்ப் செய்வது என்று அதற்குத் தெரியாது, நீங்கள் ஒரே முனையை இழந்தால், தரவை இழக்கிறீர்கள். நாங்கள் பல ஹேசல்காஸ்ட்களை வரிசைப்படுத்துகிறோம், அவற்றுக்கு இடையே முக்கியமான தரவை காப்புப் பிரதி எடுக்கிறோம். நாங்கள் தற்காலிக சேமிப்பை காப்புப் பிரதி எடுக்கவில்லை - நாங்கள் அதைப் பொருட்படுத்தவில்லை.

எங்களைப் பொறுத்தவரை, ஹேசல்காஸ்ட்:

  • பயனர் அமர்வுகளின் சேமிப்பு. ஒவ்வொரு முறையும் ஒரு அமர்வுக்கான தரவுத்தளத்திற்குச் செல்ல நீண்ட நேரம் எடுக்கும், எனவே அனைத்து அமர்வுகளையும் Hazelcast இல் வைக்கிறோம்.
  • தற்காலிக சேமிப்பு. நீங்கள் பயனர் சுயவிவரத்தைத் தேடுகிறீர்களானால், தற்காலிக சேமிப்பைச் சரிபார்க்கவும். ஒரு புதிய செய்தியை எழுதினார் - அதை தற்காலிக சேமிப்பில் வைக்கவும்.
  • பயன்பாட்டு நிகழ்வுகளுக்கு இடையிலான தொடர்புக்கான தலைப்புகள். முனை ஒரு நிகழ்வை உருவாக்கி அதை ஹேசல்காஸ்ட் தலைப்பில் வைக்கிறது. இந்த தலைப்புக்கு குழுசேர்ந்த பிற பயன்பாட்டு முனைகள் நிகழ்வைப் பெற்று செயலாக்குகின்றன.
  • கொத்து பூட்டுகள். எடுத்துக்காட்டாக, தனித்துவமான விசையைப் பயன்படுத்தி ஒரு விவாதத்தை உருவாக்குகிறோம் (1C தரவுத்தளத்தில் உள்ள ஒற்றை விவாதம்):

conversationKeyChecker.check("БЕНЗОКОЛОНКА");

      doInClusterLock("БЕНЗОКОЛОНКА", () -> {

          conversationKeyChecker.check("БЕНЗОКОЛОНКА");

          createChannel("БЕНЗОКОЛОНКА");
      });

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

டிபிஎம்எஸ் தேர்வு

PostgreSQL உடன் பணிபுரிந்து, இந்த DBMS இன் டெவலப்பர்களுடன் இணைந்து பணியாற்றுவதில் எங்களுக்கு விரிவான மற்றும் வெற்றிகரமான அனுபவம் உள்ளது.

PostgreSQL கிளஸ்டருடன் இது எளிதானது அல்ல - உள்ளது XL, XC, சிட்டஸ், ஆனால் பொதுவாக இவை NoSQLகள் அல்ல. NoSQL ஐ முக்கிய சேமிப்பகமாக நாங்கள் கருதவில்லை; இதற்கு முன்பு நாங்கள் வேலை செய்யாத Hazelcast ஐ எடுத்தாலே போதுமானது.

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

எங்கள் பகிர்வின் முதல் பதிப்பு, எங்கள் பயன்பாட்டின் ஒவ்வொரு அட்டவணையையும் வெவ்வேறு விகிதங்களில் வெவ்வேறு சேவையகங்களில் விநியோகிக்கும் திறனைக் கருதுகிறது. சேவையகம் A இல் நிறைய செய்திகள் உள்ளன - தயவுசெய்து, இந்த அட்டவணையின் ஒரு பகுதியை சர்வர் B க்கு நகர்த்துவோம். இந்த முடிவு முன்கூட்டிய மேம்படுத்தல் பற்றி வெறுமனே அலறுகிறது, எனவே நாங்கள் பல குத்தகைதாரர் அணுகுமுறைக்கு நம்மை கட்டுப்படுத்த முடிவு செய்தோம்.

பல குத்தகைதாரர்களைப் பற்றி நீங்கள் படிக்கலாம், எடுத்துக்காட்டாக, இணையதளத்தில் Citus தரவு.

SV பயன்பாடு மற்றும் சந்தாதாரர் என்ற கருத்துகளை கொண்டுள்ளது. ஒரு பயன்பாடு என்பது அதன் பயனர்கள் மற்றும் வணிகத் தரவுகளுடன், ERP அல்லது கணக்கியல் போன்ற வணிகப் பயன்பாட்டின் குறிப்பிட்ட நிறுவலாகும். சந்தாதாரர் என்பது ஒரு நிறுவனம் அல்லது தனிநபர், அதன் சார்பாக விண்ணப்பம் SV சேவையகத்தில் பதிவு செய்யப்பட்டுள்ளது. ஒரு சந்தாதாரர் பல பயன்பாடுகளை பதிவு செய்து வைத்திருக்கலாம், மேலும் இந்த பயன்பாடுகள் ஒருவருக்கொருவர் செய்திகளை பரிமாறிக்கொள்ளலாம். சந்தாதாரர் எங்கள் அமைப்பில் குத்தகைதாரர் ஆனார். பல சந்தாதாரர்களிடமிருந்து வரும் செய்திகளை ஒரு இயற்பியல் தரவுத்தளத்தில் காணலாம்; ஒரு சந்தாதாரர் அதிக ட்ராஃபிக்கை உருவாக்கத் தொடங்கியிருப்பதைக் கண்டால், அதை ஒரு தனி இயற்பியல் தரவுத்தளத்திற்கு (அல்லது ஒரு தனி தரவுத்தள சேவையகத்திற்கு கூட) நகர்த்துவோம்.

அனைத்து சந்தாதாரர் தரவுத்தளங்களின் இருப்பிடம் பற்றிய தகவலுடன் ரூட்டிங் அட்டவணை சேமிக்கப்படும் முக்கிய தரவுத்தளத்தை நாங்கள் கொண்டுள்ளோம்.

1C: எண்டர்பிரைஸ்: ஜாவா, போஸ்ட்கிரெஸ்க்யூஎல், ஹேசல்காஸ்ட் ஆகியவற்றிற்கான உயர்-சுமை அளவிடக்கூடிய சேவையை எப்படி, ஏன் எழுதினோம்

முக்கிய தரவுத்தளமானது இடையூறாக இருப்பதைத் தடுக்க, ரூட்டிங் அட்டவணையை (மற்றும் அடிக்கடி தேவைப்படும் பிற தரவு) தற்காலிக சேமிப்பில் வைத்திருக்கிறோம்.

சந்தாதாரரின் தரவுத்தளம் மெதுவாகத் தொடங்கினால், அதை உள்ளே பகிர்வுகளாக வெட்டுவோம். நாங்கள் பயன்படுத்தும் பிற திட்டங்களில் pg_pathman.

பயனர் செய்திகளை இழப்பது மோசமானது என்பதால், நாங்கள் எங்கள் தரவுத்தளங்களை பிரதிகளுடன் பராமரிக்கிறோம். ஒத்திசைவான மற்றும் ஒத்திசைவற்ற பிரதிகளின் கலவையானது முக்கிய தரவுத்தளத்தை இழந்தால் உங்களை நீங்களே காப்பீடு செய்ய அனுமதிக்கிறது. முதன்மை தரவுத்தளமும் அதன் ஒத்திசைவான பிரதியும் ஒரே நேரத்தில் தோல்வியுற்றால் மட்டுமே செய்தி இழப்பு ஏற்படும்.

ஒரு ஒத்திசைவான பிரதி இழந்தால், ஒத்திசைவற்ற பிரதி ஒத்திசைவாக மாறும்.
முக்கிய தரவுத்தளம் தொலைந்துவிட்டால், ஒத்திசைவான பிரதி முக்கிய தரவுத்தளமாக மாறும், மேலும் ஒத்திசைவற்ற பிரதி ஒரு ஒத்திசைவான பிரதியாக மாறும்.

தேடலுக்கான மீள் தேடல்

மற்றவற்றுடன், SV ஒரு தூதுவராக இருப்பதால், துல்லியமற்ற பொருத்தங்களைப் பயன்படுத்தி, உருவ அமைப்பை கணக்கில் எடுத்துக்கொண்டு, வேகமான, வசதியான மற்றும் நெகிழ்வான தேடல் தேவைப்படுகிறது. சக்கரத்தை மீண்டும் கண்டுபிடிக்க வேண்டாம் என்றும், நூலகத்தின் அடிப்படையில் உருவாக்கப்பட்ட இலவச தேடுபொறியான Elasticsearch ஐப் பயன்படுத்த வேண்டாம் என்றும் முடிவு செய்தோம் லூசீன். அப்ளிகேஷன் நோட்கள் தோல்வியுற்றால் ஏற்படும் சிக்கல்களை அகற்ற, எலாஸ்டிக் தேடலை ஒரு கிளஸ்டரில் (மாஸ்டர் - டேட்டா - டேட்டா) பயன்படுத்துகிறோம்.

கிதுப்பில் நாங்கள் கண்டுபிடித்தோம் ரஷ்ய உருவவியல் செருகுநிரல் எலாஸ்டிக் தேடல் மற்றும் அதைப் பயன்படுத்தவும். Elasticsearch குறியீட்டில் நாம் சொல் வேர்கள் (சொருகி தீர்மானிக்கும்) மற்றும் N-கிராம்களை சேமிக்கிறோம். தேடுவதற்கு பயனர் உரையை உள்ளிடும்போது, ​​N-கிராம்களில் தட்டச்சு செய்த உரையைத் தேடுவோம். குறியீட்டில் சேமிக்கப்படும் போது, ​​"உரைகள்" என்ற வார்த்தை பின்வரும் N-கிராம்களாக பிரிக்கப்படும்:

[அவை, டெக், டெக்ஸ், உரை, உரைகள், ek, ex, ext, texts, ks, kst, ksty, st, sty, you],

மேலும் "உரை" என்ற வார்த்தையின் மூலமும் பாதுகாக்கப்படும். இந்த அணுகுமுறை வார்த்தையின் தொடக்கத்திலும், நடுவிலும், முடிவிலும் தேட அனுமதிக்கிறது.

பெரிய படம்

1C: எண்டர்பிரைஸ்: ஜாவா, போஸ்ட்கிரெஸ்க்யூஎல், ஹேசல்காஸ்ட் ஆகியவற்றிற்கான உயர்-சுமை அளவிடக்கூடிய சேவையை எப்படி, ஏன் எழுதினோம்
கட்டுரையின் தொடக்கத்திலிருந்து படத்தை மீண்டும் செய்யவும், ஆனால் விளக்கங்களுடன்:

  • பேலன்சர் இணையத்தில் அம்பலமானது; எங்களிடம் nginx உள்ளது, அது ஏதேனும் இருக்கலாம்.
  • ஜாவா பயன்பாட்டு நிகழ்வுகள் ஹேசல்காஸ்ட் வழியாக ஒருவருக்கொருவர் தொடர்பு கொள்கின்றன.
  • நாம் பயன்படுத்தும் வலை சாக்கெட்டுடன் வேலை செய்ய நெட்டி.
  • ஜாவா பயன்பாடு ஜாவா 8 இல் எழுதப்பட்டுள்ளது மற்றும் மூட்டைகளைக் கொண்டுள்ளது OSGi. திட்டங்களில் ஜாவா 10 க்கு இடம்பெயர்தல் மற்றும் தொகுதிகளுக்கு மாறுதல் ஆகியவை அடங்கும்.

வளர்ச்சி மற்றும் சோதனை

SV ஐ உருவாக்கி சோதனை செய்யும் செயல்பாட்டில், நாங்கள் பயன்படுத்தும் தயாரிப்புகளின் பல சுவாரஸ்யமான அம்சங்களைக் கண்டோம்.

சுமை சோதனை மற்றும் நினைவக கசிவுகள்

ஒவ்வொரு SV வெளியீட்டின் வெளியீடும் சுமை சோதனையை உள்ளடக்கியது. இது வெற்றிகரமாக இருக்கும் போது:

  • சோதனை பல நாட்கள் வேலை செய்தது மற்றும் சேவை தோல்விகள் எதுவும் இல்லை
  • முக்கிய செயல்பாடுகளுக்கான பதில் நேரம் வசதியான வரம்பைத் தாண்டவில்லை
  • முந்தைய பதிப்போடு ஒப்பிடும்போது செயல்திறன் சரிவு 10% க்கு மேல் இல்லை

சோதனை தரவுத்தளத்தை தரவுகளுடன் நிரப்புகிறோம் - இதைச் செய்ய, உற்பத்தி சேவையகத்திலிருந்து மிகவும் செயலில் உள்ள சந்தாதாரரைப் பற்றிய தகவலைப் பெறுகிறோம், அதன் எண்களை 5 ஆல் பெருக்கி (செய்திகள், விவாதங்கள், பயனர்களின் எண்ணிக்கை) மற்றும் அதை அந்த வழியில் சோதிக்கவும்.

மூன்று உள்ளமைவுகளில் தொடர்பு அமைப்பின் சுமை சோதனையை நாங்கள் மேற்கொள்கிறோம்:

  1. அழுத்த சோதனை
  2. இணைப்புகள் மட்டுமே
  3. சந்தாதாரர் பதிவு

அழுத்த சோதனையின் போது, ​​நாங்கள் பல நூறு நூல்களைத் தொடங்குகிறோம், மேலும் அவை நிறுத்தாமல் கணினியை ஏற்றுகின்றன: செய்திகளை எழுதுதல், விவாதங்களை உருவாக்குதல், செய்திகளின் பட்டியலைப் பெறுதல். சாதாரண பயனர்களின் செயல்களையும் (எனது படிக்காத செய்திகளின் பட்டியலைப் பெறவும், ஒருவருக்கு எழுதவும்) மற்றும் மென்பொருள் தீர்வுகள் (வேறு உள்ளமைவின் தொகுப்பை அனுப்பவும், எச்சரிக்கையைச் செயலாக்கவும்) நாங்கள் உருவகப்படுத்துகிறோம்.

எடுத்துக்காட்டாக, மன அழுத்த சோதனையின் ஒரு பகுதி இப்படி இருக்கும்:

  • பயனர் உள்நுழைகிறார்
    • உங்கள் படிக்காத விவாதங்களைக் கோருகிறது
    • 50% செய்திகளைப் படிக்க வாய்ப்புள்ளது
    • 50% உரை அனுப்ப வாய்ப்பு உள்ளது
    • அடுத்த பயனர்:
      • புதிய விவாதத்தை உருவாக்க 20% வாய்ப்பு உள்ளது
      • அதன் எந்த விவாதத்தையும் தோராயமாக தேர்ந்தெடுக்கிறது
      • உள்ளே செல்கிறது
      • செய்திகள், பயனர் சுயவிவரங்களைக் கோருகிறது
      • இந்த விவாதத்திலிருந்து சீரற்ற பயனர்களுக்கு ஐந்து செய்திகளை உருவாக்குகிறது
      • விவாதத்தை விட்டுச் செல்கிறது
      • 20 முறை மீண்டும்
      • வெளியேறி, ஸ்கிரிப்ட்டின் தொடக்கத்திற்குச் செல்கிறது

    • ஒரு சாட்போட் கணினியில் நுழைகிறது (பயன்பாட்டுக் குறியீட்டிலிருந்து செய்தி அனுப்புவதைப் பின்பற்றுகிறது)
      • தரவு பரிமாற்றத்திற்கான புதிய சேனலை உருவாக்க 50% வாய்ப்பு உள்ளது (சிறப்பு விவாதம்)
      • 50% ஏற்கனவே உள்ள சேனல்களில் ஏதேனும் ஒரு செய்தியை எழுத வாய்ப்புள்ளது

"இணைப்புகள் மட்டும்" காட்சி ஒரு காரணத்திற்காக தோன்றியது. ஒரு சூழ்நிலை உள்ளது: பயனர்கள் கணினியை இணைத்துள்ளனர், ஆனால் இன்னும் ஈடுபடவில்லை. ஒவ்வொரு பயனரும் காலை 09:00 மணிக்கு கணினியை ஆன் செய்து, சர்வருடன் இணைப்பை ஏற்படுத்தி அமைதியாக இருக்கிறார்கள். இந்த நபர்கள் ஆபத்தானவர்கள், அவர்களில் பலர் உள்ளனர் - அவர்களிடம் உள்ள ஒரே தொகுப்புகள் பிங்/பாங், ஆனால் அவர்கள் சேவையகத்துடன் இணைப்பை வைத்திருக்கிறார்கள் (அவர்களால் அதைத் தொடர முடியாது - ஒரு புதிய செய்தி இருந்தால் என்ன). அத்தகைய பயனர்கள் அதிக எண்ணிக்கையில் அரை மணி நேரத்தில் கணினியில் உள்நுழைய முயற்சிக்கும் சூழ்நிலையை சோதனை மீண்டும் உருவாக்குகிறது. இது ஒரு அழுத்த சோதனையைப் போன்றது, ஆனால் அதன் கவனம் துல்லியமாக இந்த முதல் உள்ளீட்டில் உள்ளது - அதனால் தோல்விகள் எதுவும் இல்லை (ஒரு நபர் கணினியைப் பயன்படுத்துவதில்லை, அது ஏற்கனவே விழுந்துவிடும் - மோசமான ஒன்றைப் பற்றி யோசிப்பது கடினம்).

சந்தாதாரர் பதிவு ஸ்கிரிப்ட் முதல் துவக்கத்தில் இருந்து தொடங்குகிறது. நாங்கள் அழுத்த சோதனையை நடத்தினோம், கடிதப் பரிமாற்றத்தின் போது கணினி மெதுவாக இல்லை என்பதில் உறுதியாக இருந்தோம். ஆனால் பயனர்கள் வந்தார்கள் மற்றும் நேரம் முடிந்ததால் பதிவு தோல்வியடையத் தொடங்கியது. பதிவு செய்யும் போது நாங்கள் பயன்படுத்தினோம் / dev / சீரற்ற, இது அமைப்பின் என்ட்ரோபியுடன் தொடர்புடையது. போதுமான என்ட்ரோபியைக் குவிப்பதற்கு சேவையகத்திற்கு நேரம் இல்லை, மேலும் ஒரு புதிய SecureRandom கோரப்பட்டபோது, ​​அது பத்து வினாடிகளுக்கு உறைந்தது. இந்த சூழ்நிலையிலிருந்து பல வழிகள் உள்ளன, எடுத்துக்காட்டாக: குறைந்த பாதுகாப்பு /dev/urandomக்கு மாறவும், என்ட்ரோபியை உருவாக்கும் சிறப்பு பலகையை நிறுவவும், ரேண்டம் எண்களை முன்கூட்டியே உருவாக்கி அவற்றை ஒரு குளத்தில் சேமிக்கவும். குளத்தில் உள்ள சிக்கலை நாங்கள் தற்காலிகமாக மூடிவிட்டோம், ஆனால் அதன் பின்னர் புதிய சந்தாதாரர்களைப் பதிவு செய்வதற்கான தனி சோதனையை நாங்கள் நடத்தி வருகிறோம்.

சுமை ஜெனரேட்டராகப் பயன்படுத்துகிறோம் ஜே மீட்டர். வெப்சாக்கெட்டில் எப்படி வேலை செய்வது என்று தெரியவில்லை; அதற்கு ஒரு செருகுநிரல் தேவை. "jmeter websocket" என்ற வினவிற்கான தேடல் முடிவுகளில் முதன்மையானது: BlazeMeter இலிருந்து கட்டுரைகள், இது பரிந்துரைக்கிறது சொருகி Maciej Zaleski.

அங்குதான் தொடங்க முடிவு செய்தோம்.

தீவிர சோதனையைத் தொடங்கிய உடனேயே, JMeter நினைவகத்தை கசியத் தொடங்கியதைக் கண்டுபிடித்தோம்.

செருகுநிரல் ஒரு தனி பெரிய கதை; 176 நட்சத்திரங்களுடன், இது கிதுப்பில் 132 ஃபோர்க்குகளைக் கொண்டுள்ளது. ஆசிரியரே 2015 ஆம் ஆண்டிலிருந்து அதற்கு உறுதியளிக்கவில்லை (நாங்கள் அதை 2015 இல் எடுத்தோம், பின்னர் அது சந்தேகத்தை எழுப்பவில்லை), நினைவக கசிவுகள் தொடர்பான பல கிட்ஹப் சிக்கல்கள், 7 மூடப்படாத இழுத்தல் கோரிக்கைகள்.
இந்தச் செருகுநிரலைப் பயன்படுத்தி சுமை சோதனையைச் செய்ய நீங்கள் முடிவு செய்தால், பின்வரும் விவாதங்களுக்கு கவனம் செலுத்தவும்:

  1. பல திரிக்கப்பட்ட சூழலில், வழக்கமான லிங்க்டுலிஸ்ட் பயன்படுத்தப்பட்டது, அதன் விளைவாக இருந்தது NPE இயக்க நேரத்தில். ConcurrentLinkedDeque க்கு மாறுவதன் மூலமோ அல்லது ஒத்திசைக்கப்பட்ட தொகுதிகள் மூலமாகவோ இது தீர்க்கப்படும். எங்களுக்கான முதல் விருப்பத்தை நாங்கள் தேர்ந்தெடுத்தோம் (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/43).
  2. நினைவக கசிவு; துண்டிக்கும்போது, ​​இணைப்புத் தகவல் நீக்கப்படாது (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/44).
  3. ஸ்ட்ரீமிங் பயன்முறையில் (மாதிரியின் முடிவில் வெப்சாக்கெட் மூடப்படாமல், பின்னர் திட்டத்தில் பயன்படுத்தப்படும் போது), பதில் வடிவங்கள் வேலை செய்யாது (https://github.com/maciejzaleski/JMeter-WebSocketSampler/issues/19).

கிதுப்பில் உள்ளவர்களில் இதுவும் ஒன்று. நாங்கள் என்ன செய்தோம்:

  1. எடுத்துள்ளனர் போர்க் எலிரன் கோகன் (@elyrank) - இது 1 மற்றும் 3 சிக்கல்களை சரிசெய்கிறது
  2. தீர்க்கப்பட்ட பிரச்சனை 2
  3. ஜெட்டி 9.2.14 முதல் 9.3.12 வரை புதுப்பிக்கப்பட்டது
  4. ThreadLocal இல் சுற்றப்பட்ட SimpleDateFormat; SimpleDateFormat நூல்-பாதுகாப்பானது அல்ல, இது இயக்க நேரத்தில் NPEக்கு வழிவகுத்தது
  5. மற்றொரு நினைவக கசிவு சரி செய்யப்பட்டது (துண்டிக்கப்பட்ட போது இணைப்பு தவறாக மூடப்பட்டது)

இன்னும் அது பாய்கிறது!

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

இரண்டு நாட்கள் கடந்தன...

இப்போது Hazelcast நினைவகம் தீர்ந்து விட்டது. இரண்டு நாட்கள் சோதனைக்குப் பிறகு, ஹேசல்காஸ்ட் நினைவாற்றல் குறைபாடு குறித்து புகார் செய்யத் தொடங்கினார், சிறிது நேரம் கழித்து கொத்து உடைந்து விழுந்தது, மேலும் முனைகள் ஒவ்வொன்றாக இறந்து கொண்டே இருந்தன என்று பதிவுகள் காட்டுகின்றன. நாங்கள் JVisualVM ஐ ஹேசல்காஸ்டுடன் இணைத்தோம், மேலும் ஒரு "ரைசிங் ரம்" பார்த்தோம் - இது வழக்கமாக GC என்று அழைக்கப்பட்டது, ஆனால் நினைவகத்தை அழிக்க முடியவில்லை.

1C: எண்டர்பிரைஸ்: ஜாவா, போஸ்ட்கிரெஸ்க்யூஎல், ஹேசல்காஸ்ட் ஆகியவற்றிற்கான உயர்-சுமை அளவிடக்கூடிய சேவையை எப்படி, ஏன் எழுதினோம்

ஹேசல்காஸ்ட் 3.4 இல், வரைபடம் / மல்டிமேப்பை (map.destroy()) நீக்கும் போது, ​​நினைவகம் முழுமையாக விடுவிக்கப்படவில்லை:

github.com/hazelcast/hazelcast/issues/6317
github.com/hazelcast/hazelcast/issues/4888

பிழை இப்போது 3.5 இல் சரி செய்யப்பட்டது, ஆனால் அது அப்போது ஒரு பிரச்சனையாக இருந்தது. டைனமிக் பெயர்களுடன் புதிய மல்டிமேப்களை உருவாக்கி, அவற்றை எங்கள் தர்க்கத்தின்படி நீக்கிவிட்டோம். குறியீடு இப்படி இருந்தது:

public void join(Authentication auth, String sub) {
    MultiMap<UUID, Authentication> sessions = instance.getMultiMap(sub);
    sessions.put(auth.getUserId(), auth);
}

public void leave(Authentication auth, String sub) {
    MultiMap<UUID, Authentication> sessions = instance.getMultiMap(sub);
    sessions.remove(auth.getUserId(), auth);

    if (sessions.size() == 0) {
        sessions.destroy();
    }
}

விஜோவ்:

service.join(auth1, "НОВЫЕ_СООБЩЕНИЯ_В_ОБСУЖДЕНИИ_UUID1");
service.join(auth2, "НОВЫЕ_СООБЩЕНИЯ_В_ОБСУЖДЕНИИ_UUID1");

ஒவ்வொரு சந்தாவிற்கும் மல்டிமேப் உருவாக்கப்பட்டு அது தேவையில்லாத போது நீக்கப்பட்டது. நாங்கள் வரைபடத்தைத் தொடங்க முடிவு செய்தோம் , திறவுகோல் சந்தாவின் பெயராகவும், மதிப்புகள் அமர்வு அடையாளங்காட்டிகளாகவும் இருக்கும் (தேவைப்பட்டால் நீங்கள் பயனர் அடையாளங்காட்டிகளைப் பெறலாம்).

public void join(Authentication auth, String sub) {
    addValueToMap(sub, auth.getSessionId());
}

public void leave(Authentication auth, String sub) { 
    removeValueFromMap(sub, auth.getSessionId());
}

விளக்கப்படங்கள் மேம்படுத்தப்பட்டுள்ளன.

1C: எண்டர்பிரைஸ்: ஜாவா, போஸ்ட்கிரெஸ்க்யூஎல், ஹேசல்காஸ்ட் ஆகியவற்றிற்கான உயர்-சுமை அளவிடக்கூடிய சேவையை எப்படி, ஏன் எழுதினோம்

சுமை சோதனை பற்றி நாம் வேறு என்ன கற்றுக்கொண்டோம்?

  1. JSR223 க்ரூவியில் எழுதப்பட வேண்டும் மற்றும் தொகுத்தல் தற்காலிக சேமிப்பை சேர்க்க வேண்டும் - இது மிகவும் வேகமானது. இணைப்பை.
  2. Jmeter-Plugins வரைபடங்கள் நிலையானவற்றை விட எளிதாக புரிந்து கொள்ள முடியும். இணைப்பை.

Hazelcast உடனான எங்கள் அனுபவம் பற்றி

Hazelcast எங்களுக்கு ஒரு புதிய தயாரிப்பு, நாங்கள் பதிப்பு 3.4.1 இலிருந்து வேலை செய்யத் தொடங்கினோம், இப்போது எங்கள் தயாரிப்பு சேவையகம் பதிப்பு 3.9.2 ஐ இயக்குகிறது (எழுதும் நேரத்தில், Hazelcast இன் சமீபத்திய பதிப்பு 3.10 ஆகும்).

அடையாள உருவாக்கம்

முழு எண் அடையாளங்காட்டிகளுடன் தொடங்கினோம். ஒரு புதிய நிறுவனத்திற்கு மற்றொரு லாங் தேவை என்று கற்பனை செய்து கொள்வோம். தரவுத்தளத்தில் உள்ள வரிசை பொருத்தமானது அல்ல, அட்டவணைகள் பகிர்தலில் ஈடுபட்டுள்ளன - DB1 இல் ஒரு செய்தி ID = 1 மற்றும் DB1 இல் ஒரு செய்தி ID = 2 உள்ளது என்று மாறிவிடும், நீங்கள் இந்த ஐடியை Elasticsearch அல்லது Hazelcast இல் வைக்க முடியாது. , ஆனால் மோசமான விஷயம் என்னவென்றால், நீங்கள் இரண்டு தரவுத்தளங்களிலிருந்து தரவை ஒன்றாக இணைக்க விரும்பினால் (உதாரணமாக, இந்த சந்தாதாரர்களுக்கு ஒரு தரவுத்தளம் போதுமானது என்று முடிவு செய்தல்). நீங்கள் Hazelcast இல் பல AtomicLongs ஐச் சேர்த்து, கவுண்டரை அங்கேயே வைத்திருக்கலாம், பின்னர் ஒரு புதிய ஐடியைப் பெறுவதற்கான செயல்திறன் அதிகரிப்பு மற்றும் ஹேசல்காஸ்டுக்கான கோரிக்கைக்கான நேரம். ஆனால் Hazelcast இன்னும் உகந்த ஒன்று உள்ளது - FlakeIdGenerator. ஒவ்வொரு வாடிக்கையாளரையும் தொடர்பு கொள்ளும்போது, ​​அவர்களுக்கு ஒரு ஐடி வரம்பு வழங்கப்படுகிறது, எடுத்துக்காட்டாக, முதல் ஒன்று - 1 முதல் 10 வரை, இரண்டாவது - 000 முதல் 10 வரை, மற்றும் பல. இப்போது கிளையன்ட் தனக்கு வழங்கப்பட்ட வரம்பு முடிவடையும் வரை புதிய அடையாளங்காட்டிகளை தானே வழங்க முடியும். இது விரைவாக வேலை செய்யும், ஆனால் நீங்கள் பயன்பாட்டை (மற்றும் ஹேசல்காஸ்ட் கிளையன்ட்) மறுதொடக்கம் செய்யும் போது, ​​ஒரு புதிய வரிசை தொடங்குகிறது - எனவே ஸ்கிப்கள் போன்றவை. கூடுதலாக, ஐடிகள் ஏன் முழு எண் என்று டெவலப்பர்கள் உண்மையில் புரிந்து கொள்ளவில்லை, ஆனால் அவை மிகவும் சீரற்றவை. எல்லாவற்றையும் எடைபோட்டு UUIDகளுக்கு மாறினோம்.

மூலம், ட்விட்டரைப் போல இருக்க விரும்புவோருக்கு, அத்தகைய ஸ்னோகாஸ்ட் நூலகம் உள்ளது - இது ஹேசல்காஸ்டின் மேல் ஸ்னோஃப்ளேக்கை செயல்படுத்துவதாகும். நீங்கள் அதை இங்கே பார்க்கலாம்:

github.com/noctarius/snowcast
github.com/twitter/snowflake

ஆனால் நாங்கள் இனி அதைச் சுற்றி வரவில்லை.

TransactionalMap.replace

மற்றொரு ஆச்சரியம்: TransactionalMap.replace வேலை செய்யாது. இதோ ஒரு சோதனை:

@Test
public void replaceInMap_putsAndGetsInsideTransaction() {

    hazelcastInstance.executeTransaction(context -> {
        HazelcastTransactionContextHolder.setContext(context);
        try {
            context.getMap("map").put("key", "oldValue");
            context.getMap("map").replace("key", "oldValue", "newValue");
            
            String value = (String) context.getMap("map").get("key");
            assertEquals("newValue", value);

            return null;
        } finally {
            HazelcastTransactionContextHolder.clearContext();
        }        
    });
}

Expected : newValue
Actual : oldValue

getForUpdate ஐப் பயன்படுத்தி எனது சொந்த மாற்றீட்டை நான் எழுத வேண்டியிருந்தது:

protected <K,V> boolean replaceInMap(String mapName, K key, V oldValue, V newValue) {
    TransactionalTaskContext context = HazelcastTransactionContextHolder.getContext();
    if (context != null) {
        log.trace("[CACHE] Replacing value in a transactional map");
        TransactionalMap<K, V> map = context.getMap(mapName);
        V value = map.getForUpdate(key);
        if (oldValue.equals(value)) {
            map.put(key, newValue);
            return true;
        }

        return false;
    }
    log.trace("[CACHE] Replacing value in a not transactional map");
    IMap<K, V> map = hazelcastInstance.getMap(mapName);
    return map.replace(key, oldValue, newValue);
}

வழக்கமான தரவு கட்டமைப்புகளை மட்டுமல்ல, அவற்றின் பரிவர்த்தனை பதிப்புகளையும் சோதிக்கவும். IMap வேலை செய்கிறது, ஆனால் TransactionalMap இனி இல்லை.

வேலையில்லா நேரம் இல்லாமல் புதிய JAR ஐச் செருகவும்

முதலில், எங்கள் வகுப்புகளின் பொருட்களை ஹேசல்காஸ்டில் பதிவு செய்ய முடிவு செய்தோம். எடுத்துக்காட்டாக, எங்களிடம் பயன்பாட்டு வகுப்பு உள்ளது, அதைச் சேமித்து படிக்க விரும்புகிறோம். சேமி:

IMap<UUID, Application> map = hazelcastInstance.getMap("application");
map.set(id, application);

நாங்கள் படிக்கிறோம்:

IMap<UUID, Application> map = hazelcastInstance.getMap("application");
return map.get(id);

எல்லாம் வேலை செய்கிறது. பின், ஹேசல்காஸ்டில் ஒரு குறியீட்டை உருவாக்க முடிவு செய்தோம்:

map.addIndex("subscriberId", false);

ஒரு புதிய நிறுவனத்தை எழுதும் போது, ​​அவர்கள் ClassNotFoundException ஐப் பெறத் தொடங்கினர். ஹேசல்காஸ்ட் குறியீட்டில் சேர்க்க முயற்சித்தார், ஆனால் எங்கள் வகுப்பைப் பற்றி எதுவும் தெரியாது, மேலும் இந்த வகுப்பைக் கொண்ட ஒரு JAR அதற்கு வழங்கப்பட வேண்டும் என்று விரும்பினார். நாங்கள் அதைச் செய்தோம், எல்லாம் வேலை செய்தது, ஆனால் ஒரு புதிய சிக்கல் தோன்றியது: கிளஸ்டரை முழுவதுமாக நிறுத்தாமல் JAR ஐ எவ்வாறு புதுப்பிப்பது? நோட்-பை-நோட் புதுப்பிப்பின் போது ஹேசல்காஸ்ட் புதிய JARஐ எடுக்கவில்லை. இந்த கட்டத்தில் குறியீட்டு தேடல் இல்லாமல் வாழலாம் என்று முடிவு செய்தோம். எல்லாவற்றிற்கும் மேலாக, நீங்கள் ஹேசல்காஸ்டை ஒரு முக்கிய மதிப்பு கடையாகப் பயன்படுத்தினால், எல்லாம் வேலை செய்யுமா? உண்மையில் இல்லை. இங்கே மீண்டும் IMap மற்றும் TransactionalMap இன் நடத்தை வேறுபட்டது. IMap கவலைப்படாத இடத்தில், பரிவர்த்தனை வரைபடம் பிழையை ஏற்படுத்துகிறது.

IMap. நாங்கள் 5000 பொருட்களை எழுதுகிறோம், படிக்கிறோம். எல்லாம் எதிர்பார்க்கப்படுகிறது.

@Test
void get5000() {
    IMap<UUID, Application> map = hazelcastInstance.getMap("application");
    UUID subscriberId = UUID.randomUUID();

    for (int i = 0; i < 5000; i++) {
        UUID id = UUID.randomUUID();
        String title = RandomStringUtils.random(5);
        Application application = new Application(id, title, subscriberId);
        
        map.set(id, application);
        Application retrieved = map.get(id);
        assertEquals(id, retrieved.getId());
    }
}

ஆனால் இது ஒரு பரிவர்த்தனையில் வேலை செய்யாது, நாங்கள் ClassNotFoundException ஐப் பெறுகிறோம்:

@Test
void get_transaction() {
    IMap<UUID, Application> map = hazelcastInstance.getMap("application_t");
    UUID subscriberId = UUID.randomUUID();
    UUID id = UUID.randomUUID();

    Application application = new Application(id, "qwer", subscriberId);
    map.set(id, application);
    
    Application retrievedOutside = map.get(id);
    assertEquals(id, retrievedOutside.getId());

    hazelcastInstance.executeTransaction(context -> {
        HazelcastTransactionContextHolder.setContext(context);
        try {
            TransactionalMap<UUID, Application> transactionalMap = context.getMap("application_t");
            Application retrievedInside = transactionalMap.get(id);

            assertEquals(id, retrievedInside.getId());
            return null;
        } finally {
            HazelcastTransactionContextHolder.clearContext();
        }
    });
}

3.8 இல், பயனர் வகுப்பு வரிசைப்படுத்தல் பொறிமுறை தோன்றியது. நீங்கள் ஒரு முதன்மை முனையைக் குறிப்பிட்டு அதில் JAR கோப்பைப் புதுப்பிக்கலாம்.

இப்போது நாங்கள் எங்கள் அணுகுமுறையை முற்றிலுமாக மாற்றிவிட்டோம்: அதை நாமே JSON இல் வரிசைப்படுத்தி ஹேசல்காஸ்டில் சேமிக்கிறோம். Hazelcast எங்கள் வகுப்புகளின் கட்டமைப்பை அறிந்து கொள்ள வேண்டிய அவசியமில்லை, மேலும் வேலையில்லா நேரமின்றி புதுப்பிக்க முடியும். டொமைன் பொருள்களின் பதிப்பு பயன்பாடு மூலம் கட்டுப்படுத்தப்படுகிறது. பயன்பாட்டின் வெவ்வேறு பதிப்புகள் ஒரே நேரத்தில் இயங்கக்கூடும், மேலும் புதிய பயன்பாடு புதிய புலங்களுடன் பொருட்களை எழுதும்போது ஒரு சூழ்நிலை சாத்தியமாகும், ஆனால் பழையது இந்த புலங்களைப் பற்றி இன்னும் தெரியவில்லை. அதே நேரத்தில், புதிய பயன்பாடு புதிய புலங்கள் இல்லாத பழைய பயன்பாட்டின் மூலம் எழுதப்பட்ட பொருட்களைப் படிக்கிறது. பயன்பாட்டிற்குள் இதுபோன்ற சூழ்நிலைகளை நாங்கள் கையாளுகிறோம், ஆனால் எளிமைக்காக நாங்கள் புலங்களை மாற்றவோ அல்லது நீக்கவோ மாட்டோம், புதிய புலங்களைச் சேர்ப்பதன் மூலம் மட்டுமே வகுப்புகளை விரிவுபடுத்துகிறோம்.

உயர் செயல்திறனை எவ்வாறு உறுதிப்படுத்துகிறோம்

Hazelcast க்கு நான்கு பயணங்கள் - நல்லது, தரவுத்தளத்திற்கு இரண்டு - மோசமானது

தரவுத்தளத்திற்குச் செல்வதை விட தரவுக்கான தற்காலிக சேமிப்பிற்குச் செல்வது எப்போதும் சிறந்தது, ஆனால் நீங்கள் பயன்படுத்தப்படாத பதிவுகளையும் சேமிக்க விரும்பவில்லை. வளர்ச்சியின் கடைசி கட்டம் வரை எதை தற்காலிகமாக சேமிப்பது என்பது பற்றிய முடிவை நாங்கள் விட்டுவிடுகிறோம். புதிய செயல்பாடு குறியிடப்படும் போது, ​​PostgreSQL இல் உள்ள அனைத்து வினவல்களையும் பதிவு செய்வதை இயக்குவோம் (log_min_duration_statement to 0) மற்றும் 20 நிமிடங்களுக்கு சுமை சோதனையை இயக்குவோம். சேகரிக்கப்பட்ட பதிவுகளைப் பயன்படுத்தி, pgFouine மற்றும் pgBadger போன்ற பயன்பாடுகள் பகுப்பாய்வு அறிக்கைகளை உருவாக்க முடியும். அறிக்கைகளில், நாங்கள் முதன்மையாக மெதுவான மற்றும் அடிக்கடி வினவல்களைத் தேடுகிறோம். மெதுவான வினவல்களுக்கு, நாங்கள் செயல்படுத்தும் திட்டத்தை (விளக்க) உருவாக்கி, அத்தகைய வினவலை துரிதப்படுத்த முடியுமா என்பதை மதிப்பீடு செய்கிறோம். ஒரே உள்ளீட்டுத் தரவுக்கான அடிக்கடி கோரிக்கைகள் தற்காலிக சேமிப்பில் நன்றாகப் பொருந்துகின்றன. வினவல்களை "தட்டையாக" வைக்க முயற்சிக்கிறோம், ஒரு வினவலுக்கு ஒரு அட்டவணை.

சுரண்டல்

ஆன்லைன் சேவையாக SV 2017 வசந்த காலத்தில் செயல்படுத்தப்பட்டது, மேலும் ஒரு தனி தயாரிப்பாக, SV நவம்பர் 2017 இல் வெளியிடப்பட்டது (அந்த நேரத்தில் பீட்டா பதிப்பு நிலையில்).

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

SV சர்வர் விநியோகமானது நேட்டிவ் பேக்கேஜ்களின் வடிவத்தில் வழங்கப்படுகிறது: RPM, DEB, MSI. விண்டோஸுக்கு கூடுதலாக, ஒரு கணினியில் சேவையகம், Hazelcast மற்றும் Elasticsearch ஆகியவற்றை நிறுவும் ஒரு EXE வடிவில் ஒரு நிறுவியை நாங்கள் வழங்குகிறோம். நிறுவலின் இந்தப் பதிப்பை நாங்கள் முதலில் "டெமோ" பதிப்பாகக் குறிப்பிட்டோம், ஆனால் இது மிகவும் பிரபலமான வரிசைப்படுத்தல் விருப்பம் என்பது இப்போது தெளிவாகிவிட்டது.

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

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