எங்கள் பயனர்கள் சோர்வு தெரியாமல் ஒருவருக்கொருவர் செய்திகளை எழுதுகிறார்கள்.
அது மிகவும் அதிகம். அனைத்து பயனர்களின் அனைத்து செய்திகளையும் படிக்க நீங்கள் புறப்பட்டால், அது 150 ஆயிரம் ஆண்டுகளுக்கு மேல் எடுக்கும். நீங்கள் மிகவும் மேம்பட்ட வாசகர் மற்றும் ஒவ்வொரு செய்திக்கும் ஒரு நொடிக்கு மேல் செலவிட வேண்டாம்.
இத்தகைய தரவுகளின் அளவுடன், அதைச் சேமித்து அணுகுவதற்கான தர்க்கம் உகந்ததாக கட்டமைக்கப்பட்டுள்ளது. இல்லையெனில், ஒரு அற்புதமான தருணத்தில், எல்லாம் விரைவில் தவறாகிவிடும் என்பது தெளிவாகிவிடும்.
எங்களைப் பொறுத்தவரை, இந்த தருணம் ஒன்றரை ஆண்டுகளுக்கு முன்பு வந்தது. நாங்கள் இதற்கு எப்படி வந்தோம், இறுதியில் என்ன நடந்தது - நாங்கள் உங்களுக்கு வரிசையாக சொல்கிறோம்.
வழக்கு வரலாறு
முதல் செயலாக்கத்தில், VKontakte செய்திகள் PHP பின்தளம் மற்றும் MySQL ஆகியவற்றின் கலவையில் வேலை செய்தன. இது ஒரு சிறிய மாணவர் வலைத்தளத்திற்கு முற்றிலும் இயல்பான தீர்வாகும். இருப்பினும், இந்த தளம் கட்டுப்பாடில்லாமல் வளர்ந்தது மற்றும் தனக்கான தரவு கட்டமைப்புகளை மேம்படுத்துவதை கோரத் தொடங்கியது.
2009 ஆம் ஆண்டின் இறுதியில், முதல் உரை இயந்திர களஞ்சியம் எழுதப்பட்டது, மேலும் 2010 இல் செய்திகள் அதற்கு மாற்றப்பட்டன.
உரை இயந்திரத்தில், செய்திகள் பட்டியல்களில் சேமிக்கப்பட்டன - ஒரு வகையான "அஞ்சல் பெட்டிகள்". அத்தகைய ஒவ்வொரு பட்டியலும் ஒரு uid மூலம் தீர்மானிக்கப்படுகிறது - இந்த எல்லா செய்திகளையும் வைத்திருக்கும் பயனர். ஒரு செய்தியானது பண்புக்கூறுகளின் தொகுப்பைக் கொண்டுள்ளது: உரையாசிரியர் அடையாளங்காட்டி, உரை, இணைப்புகள் மற்றும் பல. "பெட்டியில்" உள்ள செய்தி அடையாளங்காட்டி local_id ஆகும், அது மாறாது மற்றும் புதிய செய்திகளுக்கு வரிசையாக ஒதுக்கப்படும். "பெட்டிகள்" சுயாதீனமானவை மற்றும் இயந்திரத்திற்குள் ஒருவருக்கொருவர் ஒத்திசைக்கப்படவில்லை; அவற்றுக்கிடையேயான தொடர்பு PHP மட்டத்தில் நிகழ்கிறது. நீங்கள் உள்ளே இருந்து உரை இயந்திரத்தின் தரவு அமைப்பு மற்றும் திறன்களைப் பார்க்கலாம்
இரண்டு பயனர்களிடையே கடிதப் பரிமாற்றத்திற்கு இது போதுமானதாக இருந்தது. அடுத்து என்ன நடந்தது என்று யூகிக்கவா?
மே 2011 இல், VKontakte பல பங்கேற்பாளர்களுடன் உரையாடல்களை அறிமுகப்படுத்தியது - பல அரட்டை. அவர்களுடன் இணைந்து பணியாற்ற, நாங்கள் இரண்டு புதிய கிளஸ்டர்களை உருவாக்கினோம் - உறுப்பினர்-அரட்டைகள் மற்றும் அரட்டை-உறுப்பினர்கள். முதலாவது பயனர்களின் அரட்டைகளைப் பற்றிய தரவைச் சேமிக்கிறது, இரண்டாவது அரட்டைகள் மூலம் பயனர்களைப் பற்றிய தரவைச் சேமிக்கிறது. பட்டியல்களுக்கு கூடுதலாக, இதில், எடுத்துக்காட்டாக, அழைக்கும் பயனர் மற்றும் அவர்கள் அரட்டையில் சேர்க்கப்பட்ட நேரம் ஆகியவை அடங்கும்.
"PHP, அரட்டைக்கு ஒரு செய்தியை அனுப்புவோம்," என்று பயனர் கூறுகிறார்.
“வாருங்கள், {username},” என்று PHP கூறுகிறது.
இந்த திட்டத்தில் குறைபாடுகள் உள்ளன. ஒத்திசைவு இன்னும் PHP இன் பொறுப்பாகும். பெரிய அரட்டைகள் மற்றும் பயனர்களுக்கு ஒரே நேரத்தில் செய்திகளை அனுப்புவது ஆபத்தான கதை. உரை-இயந்திர நிகழ்வு uid ஐப் பொறுத்தது என்பதால், அரட்டை பங்கேற்பாளர்கள் வெவ்வேறு நேரங்களில் ஒரே செய்தியைப் பெறலாம். முன்னேற்றம் நின்று போனால் ஒருவர் இதனுடன் வாழ முடியும். ஆனால் அது நடக்காது.
2015 ஆம் ஆண்டின் இறுதியில், நாங்கள் சமூக செய்திகளை அறிமுகப்படுத்தினோம், மேலும் 2016 ஆம் ஆண்டின் தொடக்கத்தில் அவற்றுக்கான API ஐ அறிமுகப்படுத்தினோம். சமூகங்களில் பெரிய சாட்போட்களின் வருகையுடன், சுமை விநியோகத்தை கூட மறந்துவிட முடிந்தது.
ஒரு நல்ல போட் ஒரு நாளைக்கு பல மில்லியன் செய்திகளை உருவாக்குகிறது - மிகவும் பேசக்கூடிய பயனர்கள் கூட இதைப் பற்றி பெருமை கொள்ள முடியாது. இது போன்ற போட்கள் வாழ்ந்த சில உரை-எஞ்சின் நிகழ்வுகள் முழுமையாக பாதிக்கப்படத் தொடங்கின.
2016 இல் உள்ள செய்தி இயந்திரங்கள் அரட்டை-உறுப்பினர்கள் மற்றும் உறுப்பினர்-அரட்டைகளின் 100 நிகழ்வுகள் மற்றும் 8000 உரை-இயந்திரங்கள். அவை ஆயிரம் சர்வர்களில் ஹோஸ்ட் செய்யப்பட்டன, ஒவ்வொன்றும் 64 ஜிபி நினைவகம். முதல் அவசர நடவடிக்கையாக, நினைவகத்தை மேலும் 32 ஜிபி அதிகரித்துள்ளோம். நாங்கள் கணிப்புகளை மதிப்பிட்டோம். கடுமையான மாற்றங்கள் இல்லாமல், இது இன்னும் ஒரு வருடத்திற்கு போதுமானதாக இருக்கும். நீங்கள் வன்பொருளைப் பிடிக்க வேண்டும் அல்லது தரவுத்தளங்களை மேம்படுத்த வேண்டும்.
கட்டிடக்கலையின் தன்மை காரணமாக, வன்பொருளை மடங்குகளில் அதிகரிப்பது மட்டுமே அர்த்தமுள்ளதாக இருக்கும். அதாவது, குறைந்தபட்சம் கார்களின் எண்ணிக்கையை இரட்டிப்பாக்குவது - வெளிப்படையாக, இது மிகவும் விலையுயர்ந்த பாதை. நாங்கள் மேம்படுத்துவோம்.
புதிய கருத்து
புதிய அணுகுமுறையின் மைய சாராம்சம் அரட்டை. அரட்டையில் அது தொடர்பான செய்திகளின் பட்டியல் உள்ளது. பயனரிடம் அரட்டைகளின் பட்டியல் உள்ளது.
தேவையான குறைந்தபட்சம் இரண்டு புதிய தரவுத்தளங்கள்:
- அரட்டை இயந்திரம். இது அரட்டை திசையன்களின் களஞ்சியமாகும். ஒவ்வொரு அரட்டையிலும் அது தொடர்பான செய்திகளின் திசையன் உள்ளது. ஒவ்வொரு செய்திக்கும் ஒரு உரை மற்றும் அரட்டையில் ஒரு தனிப்பட்ட செய்தி அடையாளங்காட்டி உள்ளது - chat_local_id.
- பயனர் இயந்திரம். இது பயனர் திசையன்களின் சேமிப்பகமாகும் - பயனர்களுக்கான இணைப்புகள். ஒவ்வொரு பயனருக்கும் peer_id (interlocutors - பிற பயனர்கள், பல அரட்டை அல்லது சமூகங்கள்) மற்றும் செய்திகளின் திசையன் உள்ளது. ஒவ்வொரு peer_idக்கும் அதனுடன் தொடர்புடைய செய்திகளின் திசையன் உள்ளது. ஒவ்வொரு செய்தியிலும் ஒரு chat_local_id மற்றும் அந்த பயனருக்கான தனிப்பட்ட செய்தி ஐடி உள்ளது - user_local_id.
புதிய கிளஸ்டர்கள் TCP ஐப் பயன்படுத்தி ஒருவருக்கொருவர் தொடர்பு கொள்கின்றன - இது கோரிக்கைகளின் வரிசை மாறாமல் இருப்பதை உறுதி செய்கிறது. கோரிக்கைகள் மற்றும் அவற்றுக்கான உறுதிப்படுத்தல்கள் வன்வட்டில் பதிவு செய்யப்படுகின்றன - எனவே எஞ்சின் தோல்வி அல்லது மறுதொடக்கம் செய்த பிறகு எந்த நேரத்திலும் வரிசையின் நிலையை மீட்டெடுக்கலாம். பயனர்-இயந்திரம் மற்றும் அரட்டை-இயந்திரம் ஒவ்வொன்றும் 4 ஆயிரம் துண்டுகளாக இருப்பதால், கிளஸ்டர்களுக்கு இடையே உள்ள கோரிக்கை வரிசை சமமாக விநியோகிக்கப்படும் (ஆனால் உண்மையில் எதுவும் இல்லை - அது மிக விரைவாக வேலை செய்கிறது).
பெரும்பாலான சந்தர்ப்பங்களில் எங்கள் தரவுத்தளங்களில் வட்டுடன் பணிபுரிவது பைனரி பதிவு மாற்றங்கள் (பின்லாக்), நிலையான ஸ்னாப்ஷாட்கள் மற்றும் நினைவகத்தில் ஒரு பகுதி படம் ஆகியவற்றின் கலவையை அடிப்படையாகக் கொண்டது. பகலில் ஏற்படும் மாற்றங்கள் பின்லாக்கில் எழுதப்பட்டு, தற்போதைய நிலையின் ஸ்னாப்ஷாட் அவ்வப்போது உருவாக்கப்படும். ஸ்னாப்ஷாட் என்பது எங்கள் நோக்கங்களுக்காக மேம்படுத்தப்பட்ட தரவு கட்டமைப்புகளின் தொகுப்பாகும். இது ஒரு தலைப்பு (படத்தின் மெட்டெண்டெக்ஸ்) மற்றும் மெட்டாஃபைல்களின் தொகுப்பைக் கொண்டுள்ளது. தலைப்பு நிரந்தரமாக RAM இல் சேமிக்கப்படுகிறது மற்றும் ஸ்னாப்ஷாட்டில் இருந்து தரவை எங்கு தேடுவது என்பதைக் குறிக்கிறது. ஒவ்வொரு மெட்டாஃபைலிலும் நெருங்கிய நேரத்தில் தேவைப்படக்கூடிய தரவுகள் அடங்கும் - எடுத்துக்காட்டாக, ஒரு பயனருடன் தொடர்புடையது. ஸ்னாப்ஷாட் தலைப்பைப் பயன்படுத்தி தரவுத்தளத்தை நீங்கள் வினவும்போது, தேவையான மெட்டாஃபைல் படிக்கப்படும், பின்னர் ஸ்னாப்ஷாட் உருவாக்கப்பட்ட பின் ஏற்பட்ட பின்லாக்கில் ஏற்படும் மாற்றங்கள் கணக்கில் எடுத்துக்கொள்ளப்படும். இந்த அணுகுமுறையின் நன்மைகளைப் பற்றி நீங்கள் மேலும் படிக்கலாம்
அதே நேரத்தில், வன்வட்டில் உள்ள தரவு ஒரு நாளைக்கு ஒரு முறை மட்டுமே மாறுகிறது - மாஸ்கோவில் இரவு தாமதமாக, சுமை குறைவாக இருக்கும்போது. இதற்கு நன்றி (வட்டில் உள்ள அமைப்பு நாள் முழுவதும் நிலையானது என்பதை அறிந்தால்), திசையன்களை ஒரு நிலையான அளவிலான வரிசைகளுடன் மாற்றலாம் - இதன் காரணமாக, நினைவகத்தைப் பெறலாம்.
புதிய திட்டத்தில் ஒரு செய்தியை அனுப்புவது இப்படி இருக்கும்:
- PHP பின்தளமானது ஒரு செய்தியை அனுப்புவதற்கான கோரிக்கையுடன் பயனர் இயந்திரத்தைத் தொடர்பு கொள்கிறது.
- பயனர்-இயந்திரம் விரும்பிய அரட்டை-இயந்திர நிகழ்வுக்கான கோரிக்கையை ப்ராக்ஸி செய்கிறது, இது பயனர்-இயந்திர chat_local_id-க்கு திரும்பும் - இந்த அரட்டையில் உள்ள புதிய செய்தியின் தனிப்பட்ட அடையாளங்காட்டி. chat_engine பின்னர் அரட்டையில் உள்ள அனைத்து பெறுநர்களுக்கும் செய்தியை ஒளிபரப்புகிறது.
- பயனர்-இயந்திரம் chat_local_id ஐ chat-engine இலிருந்து பெறுகிறது மற்றும் user_local_id ஐ PHPக்கு வழங்குகிறது - இந்தப் பயனருக்கான தனிப்பட்ட செய்தி அடையாளங்காட்டி. இந்த அடையாளங்காட்டி, எடுத்துக்காட்டாக, API வழியாக செய்திகளுடன் வேலை செய்ய பயன்படுத்தப்படுகிறது.
ஆனால் உண்மையில் செய்திகளை அனுப்புவதற்கு கூடுதலாக, நீங்கள் இன்னும் சில முக்கியமான விஷயங்களைச் செயல்படுத்த வேண்டும்:
- சப்லிஸ்ட்கள், எடுத்துக்காட்டாக, உரையாடல் பட்டியலைத் திறக்கும்போது நீங்கள் பார்க்கும் மிக சமீபத்திய செய்திகள். படிக்காத செய்திகள், குறிச்சொற்கள் கொண்ட செய்திகள் ("முக்கியமானது", "ஸ்பேம்" போன்றவை).
- அரட்டை இயந்திரத்தில் செய்திகளை சுருக்குதல்
- பயனர் இயந்திரத்தில் செய்திகளை தேக்ககப்படுத்துதல்
- தேடல் (அனைத்து உரையாடல்கள் மூலமாகவும் மற்றும் ஒரு குறிப்பிட்ட ஒன்றிற்குள்).
- நிகழ்நேர புதுப்பிப்பு (லாங்போலிங்).
- மொபைல் கிளையண்டுகளில் கேச்சிங்கைச் செயல்படுத்த வரலாற்றைச் சேமிக்கிறது.
அனைத்து துணைப் பட்டியல்களும் விரைவாக கட்டமைப்புகளை மாற்றுகின்றன. அவர்களுடன் வேலை செய்ய நாங்கள் பயன்படுத்துகிறோம்
செய்திகள் பெரிய அளவிலான தகவலை உள்ளடக்கியது, பெரும்பாலும் உரை, சுருக்க முடியும். ஒரு தனிப்பட்ட செய்தியைக் கூட நாம் துல்லியமாக மீட்டெடுக்க முடியும் என்பது முக்கியம். செய்திகளை சுருக்கப் பயன்படுகிறது
அரட்டைகளை விட குறைவான பயனர்கள் இருப்பதால், சீரற்ற அணுகல் வட்டு கோரிக்கைகளை அரட்டை-இயந்திரத்தில் சேமிக்க, நாங்கள் பயனர்-இயந்திரத்தில் செய்திகளை தேக்ககப்படுத்துகிறோம்.
இந்த பயனரின் அரட்டைகளைக் கொண்ட அனைத்து அரட்டை-இயந்திர நிகழ்வுகளுக்கும் பயனர் இயந்திரத்திலிருந்து குறுக்கு வினவலாக செய்தித் தேடல் செயல்படுத்தப்படுகிறது. முடிவுகள் பயனர் இயந்திரத்திலேயே இணைக்கப்பட்டுள்ளன.
சரி, அனைத்து விவரங்களும் கணக்கில் எடுத்துக்கொள்ளப்பட்டுள்ளன, எஞ்சியிருப்பது புதிய திட்டத்திற்கு மாறுவது மட்டுமே - மற்றும் பயனர்கள் அதை கவனிக்காமல் இருக்க வேண்டும்.
தரவு இடம்பெயர்வு
எனவே, எங்களிடம் பயனர் மூலம் செய்திகளைச் சேமிக்கும் உரை-இயந்திரம் உள்ளது, மேலும் பல அரட்டை அறைகள் மற்றும் அவற்றில் உள்ள பயனர்கள் பற்றிய தரவைச் சேமிக்கும் இரண்டு கிளஸ்டர்கள் அரட்டை-உறுப்பினர்கள் மற்றும் உறுப்பினர்-அரட்டைகள் உள்ளன. இதிலிருந்து புதிய பயனர்-இயந்திரம் மற்றும் அரட்டை-இயந்திரத்திற்கு மாறுவது எப்படி?
பழைய திட்டத்தில் உறுப்பினர்-அரட்டைகள் முதன்மையாக தேர்வுமுறைக்கு பயன்படுத்தப்பட்டது. அதிலிருந்து தேவையான தரவை அரட்டை-உறுப்பினர்களுக்கு விரைவாக மாற்றினோம், பின்னர் அது இடம்பெயர்வு செயல்பாட்டில் பங்கேற்காது.
அரட்டை உறுப்பினர்களுக்கான வரிசை. இது 100 நிகழ்வுகளை உள்ளடக்கியது, அரட்டை இயந்திரத்தில் 4 ஆயிரம் நிகழ்வுகள் உள்ளன. தரவை மாற்ற, நீங்கள் அதை இணக்கமாக கொண்டு வர வேண்டும் - இதற்காக, அரட்டை-உறுப்பினர்கள் அதே 4 ஆயிரம் பிரதிகளாகப் பிரிக்கப்பட்டனர், பின்னர் அரட்டை-உறுப்பினர்கள் பின்லாக்கைப் படிப்பது அரட்டை இயந்திரத்தில் இயக்கப்பட்டது.
இப்போது அரட்டை-இயந்திரம் அரட்டை-உறுப்பினர்களிடமிருந்து மல்டி-அரட்டை பற்றி அறிந்திருக்கிறது, ஆனால் அது இன்னும் இரண்டு உரையாசிரியர்களுடன் உரையாடல் பற்றி எதுவும் தெரியாது. இத்தகைய உரையாடல்கள் உரை இயந்திரத்தில் பயனர்களைக் குறிக்கும். இங்கே நாங்கள் "ஹெட்-ஆன்" தரவை எடுத்தோம்: ஒவ்வொரு அரட்டை-இயந்திர நிகழ்வுகளும் எல்லா உரை-இயந்திர நிகழ்வுகளுக்கும் தேவையான உரையாடல் உள்ளதா என்று கேட்டோம்.
கிரேட் - அரட்டை-இயந்திரத்திற்கு பல அரட்டை அரட்டைகள் உள்ளன மற்றும் என்ன உரையாடல்கள் உள்ளன என்பது தெரியும்.
நீங்கள் பல அரட்டை அரட்டைகளில் செய்திகளை இணைக்க வேண்டும், இதன் மூலம் ஒவ்வொரு அரட்டையிலும் செய்திகளின் பட்டியலை நீங்கள் பெறுவீர்கள். முதலில், இந்த அரட்டையிலிருந்து அனைத்து பயனர் செய்திகளையும் chat-engine உரை இயந்திரத்திலிருந்து மீட்டெடுக்கிறது. சில சந்தர்ப்பங்களில் அவற்றில் நிறைய உள்ளன (நூற்றுக்கணக்கான மில்லியன்கள் வரை), ஆனால் மிகவும் அரிதான விதிவிலக்குகளுடன் அரட்டை முற்றிலும் RAM இல் பொருந்துகிறது. எங்களிடம் ஆர்டர் செய்யப்படாத செய்திகள் உள்ளன, ஒவ்வொன்றும் பல நகல்களில் உள்ளன - எல்லாவற்றிற்கும் மேலாக, அவை அனைத்தும் பயனர்களுடன் தொடர்புடைய வெவ்வேறு உரை-இயந்திர நிகழ்வுகளிலிருந்து இழுக்கப்படுகின்றன. செய்திகளை வரிசைப்படுத்துவது மற்றும் தேவையற்ற இடத்தை எடுத்துக் கொள்ளும் நகல்களை அகற்றுவதே குறிக்கோள்.
ஒவ்வொரு செய்திக்கும் அது அனுப்பப்பட்ட நேரம் மற்றும் உரை அடங்கிய நேர முத்திரை உள்ளது. வரிசைப்படுத்துவதற்கு நேரத்தைப் பயன்படுத்துகிறோம் - மல்டிசாட் பங்கேற்பாளர்களின் பழமையான செய்திகளுக்கு சுட்டிகளை வைக்கிறோம் மற்றும் உத்தேசித்துள்ள நகல்களின் உரையிலிருந்து ஹாஷ்களை ஒப்பிட்டு, நேர முத்திரையை அதிகரிப்பதை நோக்கி நகர்கிறோம். நகல்கள் ஒரே ஹாஷ் மற்றும் நேர முத்திரையைக் கொண்டிருக்கும் என்பது தர்க்கரீதியானது, ஆனால் நடைமுறையில் இது எப்போதும் இல்லை. நீங்கள் நினைவில் வைத்திருப்பது போல், பழைய திட்டத்தில் ஒத்திசைவு PHP ஆல் மேற்கொள்ளப்பட்டது - மேலும் அரிதான சந்தர்ப்பங்களில், வெவ்வேறு பயனர்களிடையே ஒரே செய்தியை அனுப்பும் நேரம் வேறுபட்டது. இந்தச் சமயங்களில், நேரமுத்திரையைத் திருத்துவதற்கு நாங்களே அனுமதித்துள்ளோம் - பொதுவாக ஒரு நொடிக்குள். இரண்டாவது பிரச்சனை, வெவ்வேறு பெறுநர்களுக்கான செய்திகளின் வெவ்வேறு வரிசை. இதுபோன்ற சந்தர்ப்பங்களில், வெவ்வேறு பயனர்களுக்கு வெவ்வேறு வரிசைப்படுத்தும் விருப்பங்களுடன் கூடுதல் நகலை உருவாக்க அனுமதித்தோம்.
இதற்குப் பிறகு, மல்டிசாட்டில் உள்ள செய்திகளைப் பற்றிய தரவு பயனர் இயந்திரத்திற்கு அனுப்பப்படும். இறக்குமதி செய்யப்பட்ட செய்திகளின் விரும்பத்தகாத அம்சம் இங்கே வருகிறது. இயல்பான செயல்பாட்டில், இன்ஜினுக்கு வரும் செய்திகள் user_local_id மூலம் ஏறுவரிசையில் கண்டிப்பாக வரிசைப்படுத்தப்படும். பழைய எஞ்சினிலிருந்து பயனர் எஞ்சினுக்குள் இறக்குமதி செய்யப்பட்ட செய்திகள் இந்த பயனுள்ள பண்பை இழந்தன. அதே நேரத்தில், சோதனையின் வசதிக்காக, அவற்றை விரைவாக அணுகவும், அவற்றில் ஏதேனும் ஒன்றைத் தேடவும், புதியவற்றைச் சேர்க்கவும்.
இறக்குமதி செய்யப்பட்ட செய்திகளைச் சேமிக்க, நாங்கள் ஒரு சிறப்பு தரவு கட்டமைப்பைப் பயன்படுத்துகிறோம்.
இது அளவு வெக்டரைக் குறிக்கிறது எல்லோரும் எங்கே - தனிமங்களின் சிறப்பு வரிசையுடன் வெவ்வேறு மற்றும் இறங்கு வரிசையில் வரிசைப்படுத்தப்படுகின்றன. குறியீடுகளுடன் ஒவ்வொரு பிரிவிலும் கூறுகள் வரிசைப்படுத்தப்படுகின்றன. அத்தகைய கட்டமைப்பில் ஒரு உறுப்பைத் தேடுவதற்கு நேரம் எடுக்கும் மூலம் பைனரி தேடல்கள். ஒரு உறுப்பைச் சேர்ப்பது மாற்றியமைக்கப்படுகிறது .
எனவே, பழைய எஞ்சின்களிலிருந்து புதியவற்றுக்கு தரவை எவ்வாறு மாற்றுவது என்பதை நாங்கள் கண்டுபிடித்தோம். ஆனால் இந்த செயல்முறை பல நாட்கள் எடுக்கும் - மேலும் இந்த நாட்களில் எங்கள் பயனர்கள் ஒருவருக்கொருவர் எழுதும் பழக்கத்தை கைவிடுவது சாத்தியமில்லை. இந்த நேரத்தில் செய்திகளை இழக்காமல் இருக்க, பழைய மற்றும் புதிய கிளஸ்டர்களைப் பயன்படுத்தும் பணித் திட்டத்திற்கு மாறுகிறோம்.
தரவு அரட்டை-உறுப்பினர்கள் மற்றும் பயனர்-இயந்திரத்திற்கு எழுதப்படுகிறது (மற்றும் பழைய திட்டத்தின் படி சாதாரண செயல்பாட்டில் உள்ள உரை-இயந்திரத்திற்கு அல்ல). பயனர்-இயந்திரம் அரட்டை-இயந்திரத்திற்கான கோரிக்கையை ப்ராக்ஸி செய்கிறது - மேலும் இந்த அரட்டை ஏற்கனவே இணைக்கப்பட்டுள்ளதா இல்லையா என்பதைப் பொறுத்தே இந்த நடத்தை இருக்கும். அரட்டை இன்னும் ஒன்றிணைக்கப்படவில்லை என்றால், அரட்டை இயந்திரம் தனக்குத்தானே செய்தியை எழுதாது, மேலும் அதன் செயலாக்கம் உரை இயந்திரத்தில் மட்டுமே நிகழ்கிறது. அரட்டை ஏற்கனவே அரட்டை இயந்திரத்தில் இணைக்கப்பட்டிருந்தால், அது chat_local_id ஐ பயனர்-இயந்திரத்திற்கு திருப்பி அனைத்து பெறுநர்களுக்கும் செய்தியை அனுப்புகிறது. பயனர்-இயந்திரம் எல்லா தரவையும் டெக்ஸ்ட்-இன்ஜினுக்கு ப்ராக்ஸி செய்கிறது - இதனால் ஏதாவது நடந்தால், பழைய எஞ்சினில் தற்போதைய எல்லா தரவையும் கொண்டு, எப்போதும் பின்வாங்கலாம். text-engine ஆனது user_local_id ஐ வழங்குகிறது, இது பயனர் இயந்திரம் சேமித்து பின்தளத்திற்கு திரும்பும்.
இதன் விளைவாக, மாற்றம் செயல்முறை இதுபோல் தெரிகிறது: வெற்று பயனர்-இயந்திரம் மற்றும் அரட்டை-இயந்திர கிளஸ்டர்களை இணைக்கிறோம். chat-engine முழு அரட்டை-உறுப்பினர்களின் பின்லாக்கையும் படிக்கிறது, பின்னர் மேலே விவரிக்கப்பட்ட திட்டத்தின் படி ப்ராக்ஸிங் தொடங்குகிறது. நாங்கள் பழைய தரவை மாற்றி இரண்டு ஒத்திசைக்கப்பட்ட கிளஸ்டர்களைப் பெறுகிறோம் (பழைய மற்றும் புதியது). டெக்ஸ்ட் எஞ்சினிலிருந்து யூசர் எஞ்சினுக்கு வாசிப்பை மாற்றுவது மற்றும் ப்ராக்ஸியை முடக்குவது மட்டுமே மீதமுள்ளது.
Результаты
புதிய அணுகுமுறைக்கு நன்றி, என்ஜின்களின் அனைத்து செயல்திறன் அளவீடுகளும் மேம்படுத்தப்பட்டுள்ளன மற்றும் தரவு நிலைத்தன்மையில் உள்ள சிக்கல்கள் தீர்க்கப்பட்டுள்ளன. இப்போது நாம் செய்திகளில் புதிய அம்சங்களை விரைவாகச் செயல்படுத்தலாம் (மேலும் இதைச் செய்யத் தொடங்கினோம் - அதிகபட்ச அரட்டை பங்கேற்பாளர்களின் எண்ணிக்கையை அதிகரித்துள்ளோம், அனுப்பப்பட்ட செய்திகளுக்கான தேடலைச் செயல்படுத்தினோம், பின் செய்யப்பட்ட செய்திகளைத் தொடங்கினோம் மற்றும் ஒரு பயனருக்கு மொத்த செய்திகளின் வரம்பை உயர்த்தினோம்) .
தர்க்கத்தில் ஏற்படும் மாற்றங்கள் உண்மையிலேயே மகத்தானவை. இது எப்போதும் ஒரு பெரிய குழு மற்றும் எண்ணற்ற கோடுகளின் முழு ஆண்டு வளர்ச்சியைக் குறிக்காது என்பதை நான் கவனிக்க விரும்புகிறேன். அரட்டை-இயந்திரம் மற்றும் பயனர் இயந்திரம், செய்தி சுருக்கத்திற்கான ஹஃப்மேன், ஸ்ப்ளே மரங்கள் மற்றும் இறக்குமதி செய்யப்பட்ட செய்திகளுக்கான அமைப்பு போன்ற அனைத்து கூடுதல் கதைகளும் 20 ஆயிரம் வரிகளுக்குக் குறைவான குறியீடு ஆகும். மேலும் அவை வெறும் 3 மாதங்களில் 10 டெவலப்பர்களால் எழுதப்பட்டன (இருப்பினும், அதை மனதில் வைத்துக்கொள்ள வேண்டும்
மேலும், சேவையகங்களின் எண்ணிக்கையை இரட்டிப்பாக்குவதற்குப் பதிலாக, அவற்றின் எண்ணிக்கையை பாதியாகக் குறைத்துள்ளோம் - இப்போது பயனர்-இயந்திரம் மற்றும் அரட்டை-இயந்திரம் 500 இயற்பியல் இயந்திரங்களில் இயங்குகின்றன, அதே நேரத்தில் புதிய திட்டத்தில் ஏற்றுவதற்கு ஒரு பெரிய ஹெட்ரூம் உள்ளது. உபகரணங்களில் நாங்கள் நிறைய பணம் சேமித்தோம் - சுமார் $ 5 மில்லியன் + இயக்க செலவுகளில் ஆண்டுக்கு $ 750 ஆயிரம்.
மிகவும் சிக்கலான மற்றும் பெரிய அளவிலான பிரச்சனைகளுக்கு சிறந்த தீர்வைக் கண்டறிய நாங்கள் முயற்சி செய்கிறோம். எங்களிடம் ஏராளமானவை உள்ளன - அதனால்தான் தரவுத்தளத் துறையில் திறமையான டெவலப்பர்களைத் தேடுகிறோம். இதுபோன்ற சிக்கல்களை எவ்வாறு தீர்ப்பது என்பதை நீங்கள் விரும்பி அறிந்திருந்தால், அல்காரிதம்கள் மற்றும் தரவு கட்டமைப்புகள் பற்றிய சிறந்த அறிவு இருந்தால், குழுவில் சேர உங்களை அழைக்கிறோம். எங்களை தொடர்பு கொள்ளவும்
இந்தக் கதை உங்களைப் பற்றியதாக இல்லாவிட்டாலும், பரிந்துரைகளை நாங்கள் மதிக்கிறோம் என்பதை நினைவில் கொள்ளவும். பற்றி நண்பரிடம் சொல்லுங்கள்
ஆதாரம்: www.habr.com