Mail.ru සමූහයේ අපට Tarantool ඇත - මෙය Lua හි යෙදුම් සේවාදායකයකි, එය දත්ත සමුදායක් ලෙස දෙගුණ කරයි (හෝ අනෙක් අතට?). එය වේගවත් සහ සිසිල්, නමුත් එක් සේවාදායකයක හැකියාවන් තවමත් අසීමිත නොවේ. සිරස් පරිමාණය ද කෝකටත් තෛලයක් නොවේ, එබැවින් Tarantool හි තිරස් පරිමාණය සඳහා මෙවලම් ඇත - vshard මොඩියුලය
ශුභාරංචිය: අපි විශාල ඡායාරූප කිහිපයක් එකතු කර ඇත (උදා
ඇත්ත වශයෙන්ම ගැටලුව කුමක්ද?
අපට ටැරන්ටුලයක් තිබේ, අපට vshard ඇත - ඔබට තවත් අවශ්ය වන්නේ කුමක්ද?
පළමුව, එය පහසුව පිළිබඳ කාරණයකි. vshard වින්යාසය Lua වගු හරහා වින්යාස කර ඇත. බෙදා හරින ලද බහුවිධ ටැරන්ටූල් ක්රියාවලි පද්ධතියක් නිවැරදිව ක්රියා කිරීම සඳහා, වින්යාසය සෑම තැනකම එකම විය යුතුය. කිසිවෙකු මෙය අතින් කිරීමට කැමති නැත. එබැවින්, සියලු වර්ගවල scripts, Ansible සහ deployment පද්ධති භාවිතා වේ.
කාට්රිජ් විසින්ම vshard වින්යාසය කළමනාකරණය කරයි, එය එය මත පදනම්ව මෙය කරයි තමන්ගේම බෙදා හරින ලද වින්යාසය. එය අත්යවශ්යයෙන්ම සරල YAML ගොනුවක් වන අතර, එහි පිටපතක් එක් එක් Tarantool අවස්ථාවෙහි ගබඩා කර ඇත. සරල කිරීම යනු රාමුව විසින්ම එහි වින්යාසය නිරීක්ෂණය කරන අතර එය සෑම තැනකම එක හා සමාන බව සහතික කරයි.
දෙවනුව, එය නැවතත් පහසුව පිළිබඳ කාරණයකි. vshard වින්යාසය ව්යාපාර තර්කනය වර්ධනය කිරීම සමඟ කිසිදු සම්බන්ධයක් නොමැති අතර ක්රමලේඛකයාගේ වැඩවලින් පමණක් අවධානය වෙනතකට යොමු කරයි. අපි ව්යාපෘතියක ගෘහ නිර්මාණ ශිල්පය ගැන සාකච්ඡා කරන විට, අපි බොහෝ විට කතා කරන්නේ තනි සංරචක සහ ඒවායේ අන්තර්ක්රියා ගැන ය. දත්ත මධ්යස්ථාන 3කට පොකුරක් දියත් කිරීම ගැන සිතීමට ඉක්මන් වැඩිය.
අපි මෙම ගැටලු නැවත නැවතත් විසඳා ගත් අතර, යම් අවස්ථාවක දී යෙදුම සමඟ එහි සම්පූර්ණ ජීවන චක්රය තුළ වැඩ කිරීම සරල කළ ප්රවේශයක් සංවර්ධනය කිරීමට අපි සමත් විය: නිර්මාණය, සංවර්ධනය, පරීක්ෂා කිරීම, CI/CD, නඩත්තු කිරීම.
කාට්රිජ් එක් එක් ටැරන්ටූල් ක්රියාවලිය සඳහා භූමිකාවක් පිළිබඳ සංකල්පය හඳුන්වා දෙයි. භූමිකාවන් යනු සංවර්ධකයෙකුට ලිවීමේ කේතය කෙරෙහි අවධානය යොමු කිරීමට ඉඩ සලසන සංකල්පයකි. ව්යාපෘතියේ ඇති සියලුම භූමිකාවන් එක් Tarantool අවස්ථාවක් මත ධාවනය කළ හැකි අතර, මෙය පරීක්ෂණ සඳහා ප්රමාණවත් වේ.
ටැරන්ටූල් කාට්රිජ්හි ප්රධාන ලක්ෂණ:
- ස්වයංක්රීය පොකුරු වාද්ය වෘන්දය;
- නව භූමිකාවන් භාවිතා කරමින් යෙදුමේ ක්රියාකාරිත්වය පුළුල් කිරීම;
- සංවර්ධනය සහ යෙදවීම සඳහා යෙදුම් ආකෘතිය;
- බිල්ට් ස්වයංක්රීය ෂර්ඩිං;
- Luatest පරීක්ෂණ රාමුව සමඟ ඒකාබද්ධ වීම;
- WebUI සහ API භාවිතා කරන පොකුරු කළමනාකරණය;
- ඇසුරුම් සහ යෙදවුම් මෙවලම්.
හෙලෝ වර්ල්ඩ්!
රාමුව පෙන්වීමට මට බලා සිටිය නොහැක, එබැවින් අපි ගෘහ නිර්මාණ ශිල්පය පිළිබඳ කතාව පසුව තබා සරල දෙයකින් ආරම්භ කරමු. ටැරන්ටූල් දැනටමත් ස්ථාපනය කර ඇතැයි අපි උපකල්පනය කරන්නේ නම්, ඉතිරිව ඇත්තේ කිරීමට පමණි
$ tarantoolctl rocks install cartridge-cli
$ export PATH=$PWD/.rocks/bin/:$PATH
මෙම විධාන දෙක මඟින් විධාන රේඛා උපයෝගිතා ස්ථාපනය කර ඔබේ පළමු යෙදුම සැකිල්ලෙන් නිර්මාණය කිරීමට ඔබට ඉඩ සලසයි:
$ cartridge create --name myapp
තවද අපට ලැබෙන්නේ මෙයයි:
myapp/
├── .git/
├── .gitignore
├── app/roles/custom.lua
├── deps.sh
├── init.lua
├── myapp-scm-1.rockspec
├── test
│ ├── helper
│ │ ├── integration.lua
│ │ └── unit.lua
│ ├── helper.lua
│ ├── integration/api_test.lua
│ └── unit/sample_test.lua
└── tmp/
මෙය සූදානම් කළ "Hello, World!" සහිත git ගබඩාවකි. අයදුම්පත. කලින් පරායත්තතා ස්ථාපනය කර ඇති (රාමුව ද ඇතුළුව) එය වහාම ක්රියාත්මක කිරීමට උත්සාහ කරමු:
$ tarantoolctl rocks make
$ ./init.lua --http-port 8080
එබැවින්, අනාගත බෙදාගත් යෙදුම සඳහා අපට එක් නෝඩයක් ක්රියාත්මක වේ. විමසිලිමත් ගිහියෙකුට වහාම වෙබ් අතුරු මුහුණත විවෘත කර, මූසිකය සමඟ එක් නෝඩයක පොකුරක් වින්යාස කර ප්රතිඵලය භුක්ති විඳිය හැක, නමුත් ප්රීති වීමට කල් වැඩිය. මෙතෙක්, යෙදුමට ප්රයෝජනවත් කිසිවක් කළ නොහැක, එබැවින් මම පසුව යෙදවීම ගැන ඔබට කියමි, නමුත් දැන් කේතය ලිවීමට කාලයයි.
යෙදුම් සංවර්ධනය
නිකමට හිතන්න, අපි දත්ත ලබා ගත යුතු, එය සුරැකිය යුතු සහ දිනකට වරක් වාර්තාවක් ගොඩනගා ගත යුතු ව්යාපෘතියක් සැලසුම් කරමින් සිටිමු.
අපි රූප සටහනක් ඇඳීමට පටන් ගෙන එය මත සංරචක තුනක් තබමු: ද්වාරය, ගබඩා කිරීම සහ උපලේඛනය. අපි තවදුරටත් ගෘහ නිර්මාණ ශිල්පය මත වැඩ කරමින් සිටිමු. අපි ගබඩාව ලෙස vshard භාවිතා කරන බැවින්, අපි යෝජනා ක්රමයට vshard-router සහ vshard-storage එකතු කරමු. ද්වාරය හෝ උපලේඛනය සෘජුවම ගබඩාවට ප්රවේශ නොවනු ඇත; රවුටරය කුමක් සඳහාද, ඒ සඳහා එය නිර්මාණය කර ඇත.
සංරචක වියුක්ත ලෙස පෙනෙන නිසා මෙම රූප සටහන තවමත් ව්යාපෘතිය තුළ අප ගොඩනඟන දේ හරියටම නියෝජනය නොකරයි. මෙය සැබෑ Tarantool වෙත ප්රක්ෂේපණය කරන්නේ කෙසේදැයි අපට තවමත් දැකීමට අවශ්යයි - ක්රියාවලිය අනුව අපගේ සංරචක කාණ්ඩ කරමු.
vshard-router සහ gateway වෙන වෙනම අවස්ථා වල තබාගැනීමේ තේරුමක් නැත. මෙය දැනටමත් රවුටරයේ වගකීම නම් අපි නැවත වරක් ජාලයේ සැරිසැරීමට අවශ්ය වන්නේ ඇයි? ඒවා එකම ක්රියාවලියක් තුළ ක්රියාත්මක කළ යුතුය. එනම්, gateway සහ vshard.router.cfg යන දෙකම එක් ක්රියාවලියකින් ආරම්භ කර ඇති අතර, ඒවාට ප්රාදේශීය වශයෙන් අන්තර් ක්රියා කිරීමට ඉඩ සලසයි.
සැලසුම් අවධියේදී, සංරචක තුනක් සමඟ වැඩ කිරීම පහසු විය, නමුත් සංවර්ධකයෙකු ලෙස, කේතය ලියන අතරතුර, ටර්නාටූල් අවස්ථා තුනක් දියත් කිරීම ගැන සිතීමට මට අවශ්ය නැත. මට පරීක්ෂණ පවත්වා මා ගේට්වේ ලිව්වේ නිවැරදිව දැයි පරීක්ෂා කිරීමට අවශ්යයි. නැතහොත් සමහර විට මට මගේ සගයන්ට විශේෂාංගයක් පෙන්වීමට අවශ්ය විය හැකිය. පිටපත් තුනක් යෙදවීමේ කරදරයෙන් මා යා යුත්තේ ඇයි? භූමිකා සංකල්පය බිහිවුණේ එහෙමයි. භූමිකාවක් යනු කාට්රිජ් මගින් ජීවන චක්රය කළමනාකරණය කරන නිත්ය luash මොඩියුලයකි. මෙම උදාහරණයේ ඒවායින් හතරක් ඇත - ද්වාරය, රවුටරය, ගබඩා කිරීම, උපලේඛනය. තවත් ව්යාපෘතියක තවත් තිබිය හැක. සියලුම භූමිකාවන් එක් ක්රියාවලියක් තුළ ක්රියාත්මක කළ හැකි අතර, මෙය ප්රමාණවත් වනු ඇත.
වේදිකාගත කිරීම හෝ නිෂ්පාදනය සඳහා යෙදවීම සම්බන්ධයෙන් ගත් කල, අපි දෘඩාංග හැකියාවන් මත පදනම්ව එක් එක් ටැරන්ටූල් ක්රියාවලියට තමන්ගේම භූමිකාවන් පවරන්නෙමු:
ස්ථල විද්යාව කළමනාකරණය
කුමන භූමිකාවන් ක්රියාත්මක වන්නේද යන්න පිළිබඳ තොරතුරු කොතැනක හෝ ගබඩා කළ යුතුය. තවද මෙය "කොහේ හරි" බෙදා හරින ලද වින්යාසය, මම දැනටමත් ඉහත සඳහන් කර ඇත. එහි වැදගත්ම දෙය වන්නේ පොකුරු ස්ථලකයයි. ටැරන්ටූල් ක්රියාවලි 3ක අනුකරණ කණ්ඩායම් 5ක් මෙන්න:
අපට දත්ත නැති කර ගැනීමට අවශ්ය නැත, එබැවින් අපි ක්රියාවලි ක්රියාත්මක කිරීම පිළිබඳ තොරතුරු ප්රවේශමෙන් සලකමු. කාට්රිජ් ද්වි-අදියර කැපවීමක් භාවිතා කරමින් වින්යාසය නිරීක්ෂණය කරයි. අපට වින්යාසය යාවත්කාලීන කිරීමට අවශ්ය වූ පසු, එය ප්රථමයෙන් සියලුම අවස්ථාවන් තිබේද සහ නව වින්යාසය පිළිගැනීමට සූදානම්දැයි පරීක්ෂා කරයි. මෙයින් පසු, දෙවන අදියර වින්යාසය අදාළ වේ. මේ අනුව, එක් පිටපතක් තාවකාලිකව ලබා ගත නොහැකි වුවද, නරක කිසිවක් සිදු නොවේ. වින්යාසය සරලව යෙදෙන්නේ නැති අතර ඔබට කලින් දෝෂයක් පෙනෙනු ඇත.
ස්ථල විද්යාව අංශයේ, එක් එක් අනුකරණ කාණ්ඩයේ නායකයා වැනි වැදගත් පරාමිතියක් දක්වා ඇත. සාමාන්යයෙන් මෙය පටිගත කරන පිටපතයි. ව්යතිරේක තිබිය හැකි වුවද ඉතිරිය බොහෝ විට කියවීමට පමණි. සමහර විට නිර්භීත සංවර්ධකයින් ගැටුම් වලට බිය නොවන අතර සමාන්තරව අනුරූ කිහිපයකට දත්ත ලිවිය හැකිය, නමුත් සමහර මෙහෙයුම් තිබේ, කුමක් වුවත්, දෙවරක් සිදු නොකළ යුතුය. මේ සඳහා නායකයෙකුගේ ලකුණක් තිබේ.
භූමිකාවන්ගේ ජීවිතය
එවැනි ගෘහ නිර්මාණ ශිල්පයක වියුක්ත භූමිකාවක් පැවතීමට නම්, රාමුව ඒවා කෙසේ හෝ කළමනාකරණය කළ යුතුය. ස්වභාවිකවම, ටැරන්ටූල් ක්රියාවලිය නැවත ආරම්භ කිරීමකින් තොරව පාලනය සිදු වේ. භූමිකාවන් කළමනාකරණය කිරීමට ආපසු ඇමතුම් 4ක් ඇත. කාට්රිජ් විසින්ම එහි බෙදා හරින ලද වින්යාසයේ ලියා ඇති දේ මත පදනම්ව ඒවා කැඳවනු ඇත, එමඟින් වින්යාසය නිශ්චිත භූමිකාවන්ට අදාළ වේ.
function init()
function validate_config()
function apply_config()
function stop()
සෑම භූමිකාවකටම කාර්යයක් ඇත init
. භූමිකාව සක්රීය කර ඇති විට හෝ Tarantool නැවත ආරම්භ කරන විට එය වරක් කැඳවනු ලැබේ. උදාහරණයක් ලෙස, box.space.create ආරම්භ කිරීම එහිදී පහසු වේ, නැතහොත් උපලේඛකයාට යම් යම් කාල පරාසයන් තුළ වැඩ කරන පසුබිම් තන්තු කිහිපයක් දියත් කළ හැක.
එක් කාර්යයක් init
ප්රමාණවත් නොවිය හැක. ස්ථලකය ගබඩා කිරීම සඳහා භාවිතා කරන බෙදා හරින ලද වින්යාසයෙන් ප්රයෝජන ගැනීමට කාට්රිජ් ඉඩ දෙයි. අපට එම වින්යාසය තුළම නව අංශයක් ප්රකාශ කර එහි ව්යාපාර වින්යාසයේ කොටසක් ගබඩා කළ හැකිය. මගේ උදාහරණයේ, මෙය උපලේඛන භූමිකාව සඳහා දත්ත සැලැස්මක් හෝ කාලසටහන් සැකසීම් විය හැකිය.
පොකුරු ඇමතුම් validate_config
и apply_config
බෙදා හරින ලද වින්යාසය වෙනස් වන සෑම අවස්ථාවකම. අදියර දෙකක කැපවීමකින් වින්යාසයක් යොදන විට, මෙම නව වින්යාසය පිළිගැනීමට සෑම භූමිකාවක්ම සූදානම් දැයි පොකුර පරීක්ෂා කරන අතර, අවශ්ය නම්, පරිශීලකයාට දෝෂයක් වාර්තා කරයි. වින්යාසය සාමාන්ය බව සියලු දෙනා එකඟ වන විට, එවිට apply_config
.
භූමිකාවන්ට ද ක්රමයක් ඇත stop
, භූමිකාවේ ප්රතිදානය පිරිසිදු කිරීමට අවශ්ය වේ. මෙම සේවාදායකයේ උපලේඛනය තවදුරටත් අවශ්ය නොවන බව අපි පැවසුවහොත්, එය ආරම්භ කළ එම තන්තු නැවැත්විය හැකිය init
.
භූමිකාවන් එකිනෙකා සමඟ අන්තර් ක්රියා කළ හැකිය. අපි Lua හි ශ්රිත ඇමතුම් ලිවීමට පුරුදු වී සිටිමු, නමුත් දී ඇති ක්රියාවලියකට අපට අවශ්ය කාර්යභාරය නොමැති වීම සිදුවිය හැකිය. ජාලය හරහා ඇමතුම් පහසු කිරීම සඳහා, අපි Tarantool තුළ ගොඩනගා ඇති සම්මත netbox පදනම මත ගොඩනගා ඇති rpc (දුරස්ථ ක්රියාපටිපාටිය ඇමතුම) සහායක මොඩියුලය භාවිතා කරමු. නිදසුනක් වශයෙන්, ඔබේ ද්වාරය දිනක් බලා සිටිනවාට වඩා, දැන්ම කාර්යය කිරීමට උපලේඛකයාගෙන් සෘජුව ඉල්ලා සිටීමට අවශ්ය නම්, මෙය ප්රයෝජනවත් විය හැක.
තවත් වැදගත් කරුණක් වන්නේ වැරදි ඉවසීම සහතික කිරීමයි. කාට්රිජ් සෞඛ්යය නිරීක්ෂණය කිරීම සඳහා SWIM ප්රොටෝකෝලය භාවිතා කරයි
මෙම ප්රොටෝකෝලය මත පදනම්ව, කාට්රිජ් ස්වයංක්රීය අසාර්ථක සැකසුම් සංවිධානය කරයි. සෑම ක්රියාවලියක්ම එහි පරිසරය නිරීක්ෂණය කරන අතර, නායකයා හදිසියේම ප්රතිචාර දැක්වීම නතර කළහොත්, අනුරුවට එහි භූමිකාව භාර ගත හැකි අතර, කාට්රිජ් ඒ අනුව ධාවන භූමිකාවන් වින්යාස කරයි.
මෙහිදී ඔබ ප්රවේශම් විය යුතුය, මන්ද නිතර නිතර එහා මෙහා මාරු වීම ප්රතිනිර්මාණය කිරීමේදී දත්ත ගැටුම් ඇති විය හැක. ඇත්ත වශයෙන්ම, ඔබ අහඹු ලෙස ස්වයංක්රීය අසමත් වීම සක්රිය නොකළ යුතුය. සිදුවන්නේ කුමක්ද යන්න අප පැහැදිලිව වටහා ගත යුතු අතර නායකයා යථා තත්ත්වයට පත් කර ඔටුන්න ඔහු වෙත ආපසු ලබා දීමෙන් පසු අනුකරණය කැඩී නොයන බවට සහතික විය යුතුය.
මේ සියල්ලෙන්, භූමිකාවන් ක්ෂුද්ර සේවාවලට සමාන යැයි ඔබට හැඟෙන්නට පුළුවන. එක් අර්ථයකින්, ඒවා හුදෙක් ටැරන්ටූල් ක්රියාවලි තුළ ඇති මොඩියුල ලෙස පමණි. නමුත් මූලික වෙනස්කම් ගණනාවක් ද තිබේ. පළමුව, සියලුම ව්යාපෘති භූමිකාවන් එකම කේත පදනමක ජීවත් විය යුතුය. තවද සියලුම Tarantool ක්රියාවලි එකම කේත පදනමකින් දියත් කළ යුතුය, එවිට අපි උපලේඛනය ආරම්භ කිරීමට උත්සාහ කරන විට එවැනි විස්මයන් නොමැත, නමුත් එය සරලව නොපවතී. එසේම, ඔබ කේත අනුවාදවල වෙනස්කම් වලට ඉඩ නොදිය යුතුය, මන්ද එවැනි තත්වයක් තුළ පද්ධතියේ හැසිරීම අනාවැකි සහ දෝෂහරණය කිරීම ඉතා අපහසු වේ.
Docker වගේ අපිට නිකන් රෝල් "ඉමේජ්" එකක් අරන් වෙන මැෂින් එකකට අරන් එතන දුවන්න බෑ. අපගේ භූමිකාවන් ඩොකර් බහාලුම් තරම් හුදකලා නොවේ. එසේම, අපට එක් අවස්ථාවක සමාන භූමිකාවන් දෙකක් ධාවනය කළ නොහැක. භූමිකාවක් පවතී හෝ නැත; එක් අර්ථයකින් එය තනි පුද්ගලයෙකි. තෙවනුව, සමස්ත අනුරූකරණ කණ්ඩායම තුළ භූමිකාවන් සමාන විය යුතුය, එසේ නොමැතිනම් එය විකාරයක් වනු ඇත - දත්ත සමාන වේ, නමුත් වින්යාසය වෙනස් වේ.
යෙදවීමේ මෙවලම්
යෙදුම් යෙදවීමට Cartridge උපකාර වන ආකාරය පෙන්වීමට මම පොරොන්දු විය. අන් අයට ජීවිතය පහසු කිරීම සඳහා, රාමුව RPM පැකේජ ඇසුරුම් කරයි:
$ cartridge pack rpm myapp -- упакует для нас ./myapp-0.1.0-1.rpm
$ sudo yum install ./myapp-0.1.0-1.rpm
ස්ථාපිත පැකේජයේ ඔබට අවශ්ය සියල්ල පාහේ අඩංගු වේ: යෙදුම සහ ස්ථාපිත පරායත්තතා යන දෙකම. RPM පැකේජයේ පරායත්තතාවයක් ලෙස Tarantool ද සේවාදායකයට පැමිණෙනු ඇති අතර අපගේ සේවාව දියත් කිරීමට සූදානම්ය. මෙය systemd හරහා සිදු කෙරේ, නමුත් පළමුව ඔබ කුඩා වින්යාසයක් ලිවිය යුතුය. අවම වශයෙන්, එක් එක් ක්රියාවලියේ URI සඳහන් කරන්න. උදාහරණයක් ලෙස තුනක් ප්රමාණවත්ය.
$ sudo tee /etc/tarantool/conf.d/demo.yml <<CONFIG
myapp.router: {"advertise_uri": "localhost:3301", "http_port": 8080}
myapp.storage_A: {"advertise_uri": "localhost:3302", "http_enabled": False}
myapp.storage_B: {"advertise_uri": "localhost:3303", "http_enabled": False}
CONFIG
මෙහි රසවත් සූක්ෂ්මතාවයක් තිබේ. ද්විමය ප්රොටෝකෝල වරාය පමණක් සඳහන් කරනවා වෙනුවට, අපි සත්කාරක නාමය ඇතුළු ක්රියාවලියේ සම්පූර්ණ පොදු ලිපිනය සඳහන් කරන්නෙමු. පොකුරු නෝඩ් එකිනෙක සම්බන්ධ වන්නේ කෙසේදැයි දැන ගැනීමට මෙය අවශ්ය වේ. advertise_uri ලිපිනය ලෙස 0.0.0.0 භාවිතා කිරීම නරක අදහසකි; එය සොකට් බැඳීමක් නොව බාහිර IP ලිපිනයක් විය යුතුය. එය නොමැතිව, කිසිවක් ක්රියා නොකරනු ඇත, එබැවින් කාට්රිජ් ඔබට වැරදි advertise_uri සමඟ නෝඩයක් දියත් කිරීමට ඉඩ නොදේ.
දැන් වින්යාසය සූදානම් බැවින්, ඔබට ක්රියාවලි ආරම්භ කළ හැකිය. නිතිපතා systemd ඒකකයක් එක් ක්රියාවලියකට වඩා ආරම්භ කිරීමට ඉඩ නොදෙන බැවින්, කාට්රිජ් මත යෙදුම් ඊනියා විසින් ස්ථාපනය කර ඇත. මේ ආකාරයට ක්රියා කරන ක්ෂණික ඒකක:
$ sudo systemctl start myapp@router
$ sudo systemctl start myapp@storage_A
$ sudo systemctl start myapp@storage_B
වින්යාසයේදී, අපි කාට්රිජ් වෙබ් අතුරු මුහුණත සපයන HTTP වරාය සඳහන් කළෙමු - 8080. අපි එයට ගොස් බලමු:
ක්රියාවලි ක්රියාත්මක වුවද ඒවා තවම වින්යාස කර නොමැති බව අපට පෙනේ. කාට්රිජ් තවමත් කවුරුන් සමඟ අනුකරණය කළ යුතුද යන්න නොදන්නා අතර එය තනිවම තීරණයක් ගත නොහැක, එබැවින් එය අපගේ ක්රියාවන් බලා සිටියි. නමුත් අපට බොහෝ තේරීමක් නැත: නව පොකුරේ ජීවිතය ආරම්භ වන්නේ පළමු නෝඩයේ වින්යාසයෙනි. ඉන්පසුව අපි අනෙක් ඒවා පොකුරට එකතු කරන්නෙමු, ඔවුන්ට භූමිකාවන් පවරන්නෙමු, මෙම අවස්ථාවේදී යෙදවීම සාර්ථකව නිම කළ බව සැලකිය හැකිය.
අපි ඔබේ ප්රියතම බීම වීදුරුවක් වත් කර දිගු වැඩ සතියකට පසු විවේක ගනිමු. යෙදුම භාවිතා කළ හැක.
ප්රතිඵල
ප්රතිඵල මොනවාද? එය උත්සාහ කරන්න, එය භාවිතා කරන්න, ප්රතිපෝෂණ තබන්න, Github මත ටිකට් සාදන්න.
යොමු
[1]
මූලාශ්රය: www.habr.com