RoadRunner: ፒኤችፒ ለመሞት አልተገነባም, ወይም Golang ለማዳን

RoadRunner: ፒኤችፒ ለመሞት አልተገነባም, ወይም Golang ለማዳን

ሃይ ሀብር! እኛ Badoo ላይ ንቁ ነን በ PHP አፈፃፀም ላይ በመስራት ላይበዚህ ቋንቋ ውስጥ ፍትሃዊ ትልቅ ስርዓት ስላለን እና የአፈፃፀም ጉዳይ የገንዘብ ቁጠባ ጉዳይ ነው። ከአስር አመታት በፊት ለዚህ ፒኤችፒ-ኤፍፒኤም ፈጠርን፤ እሱም መጀመሪያ ላይ ለPHP የጥበቃ ስብስብ ነበር እና በኋላ ወደ ይፋዊ ስርጭቱ ገባ።

በቅርብ ዓመታት ውስጥ ፒኤችፒ ትልቅ እድገት አድርጓል: ቆሻሻ ሰብሳቢው ተሻሽሏል, የመረጋጋት ደረጃ ጨምሯል - ዛሬ ያለ ምንም ችግር በ PHP ውስጥ ዲሞኖች እና ረጅም ዕድሜ ያላቸው ስክሪፕቶችን መጻፍ ይችላሉ. ይህ Spiral Scout የበለጠ እንዲሄድ አስችሎታል፡ RoadRunner ከ PHP-FPM በተቃራኒ በጥያቄዎች መካከል ማህደረ ትውስታን አያጸዳውም ይህም ተጨማሪ የአፈፃፀም ትርፍ ይሰጣል (ምንም እንኳን ይህ አካሄድ የእድገት ሂደቱን የሚያወሳስበው ቢሆንም)። በአሁኑ ጊዜ በዚህ መሣሪያ እየሞከርን ነው፣ ነገር ግን እስካሁን የምናጋራው ምንም ውጤት የለንም። እነሱን መጠበቅ የበለጠ አስደሳች ለማድረግ ፣ ከ Spiral Scout የRoadRunner ማስታወቂያን ትርጉም እናተምታለን።

የአንቀጹ አቀራረብ ለእኛ ቅርብ ነው-ችግሮቻችንን በምንፈታበት ጊዜ እኛ ደግሞ ብዙውን ጊዜ የ PHP እና Go ስብስብ እንጠቀማለን ፣ የሁለቱም ቋንቋዎች ጥቅሞችን በማግኘት እና አንዱን ለሌላው እንተወዋለን።

ይደሰቱ!

ባለፉት አሥር ዓመታት ውስጥ ከዝርዝሩ ውስጥ ለኩባንያዎች ማመልከቻዎችን ፈጥረናል ሀብት 500፣ እና ከ500 የማይበልጡ ተጠቃሚዎች ታዳሚ ላላቸው ንግዶች። በዚህ ጊዜ ሁሉ፣ የእኛ መሐንዲሶች በዋናነት በPHP ውስጥ የኋላ ሽፋኑን እየገነቡ ነው። ነገር ግን ከሁለት አመት በፊት አንድ ነገር በምርቶቻችን አፈፃፀም ላይ ብቻ ሳይሆን በመጠን መጠናቸው ላይ ትልቅ ተጽእኖ ነበረው - ጎላንግ (ጎ) በቴክኖሎጂ ቁልል ውስጥ አስተዋውቀናል።

ወዲያውኑ ማለት ይቻላል፣ እስከ 40x የአፈጻጸም ማሻሻያ ያላቸውን ትላልቅ መተግበሪያዎች እንድንገነባ Go እንደፈቀደልን ደርሰንበታል። በእሱ አማካኝነት የሁለቱንም ቋንቋዎች ጥቅሞች በማጣመር በማሻሻል በ PHP ውስጥ የተፃፉ ነባር ምርቶችን ማራዘም ችለናል.

የጎ እና ፒኤችፒ ጥምረት እውነተኛ የልማት ችግሮችን ለመፍታት እንዴት እንደሚረዳ እና አንዳንድ ችግሮችን ለማስወገድ ወደ መሳሪያነት እንዴት እንደተለወጠ እንነግርዎታለን ። ፒኤችፒ የሚሞት ሞዴል.

የእርስዎ ዕለታዊ ፒኤችፒ ልማት አካባቢ

የ PHP ሟች ሞዴልን ለማደስ Goን እንዴት መጠቀም እንደሚችሉ ከመናገራችን በፊት፣ የእርስዎን ነባሪ የPHP ልማት አካባቢን እንይ።

በአብዛኛዎቹ አጋጣሚዎች መተግበሪያዎን የ nginx የድር አገልጋይ እና የPHP-FPM አገልጋይን በመጠቀም ነው የሚያሄዱት። የቀድሞው የማይንቀሳቀሱ ፋይሎችን ያገለግላል እና የተወሰኑ ጥያቄዎችን ወደ ፒኤችፒ-ኤፍፒኤም ያዞራል፣ ፒኤችፒ-ኤፍፒኤም ራሱ ፒኤችፒ ኮድን ይሰራል። በጣም ታዋቂ የሆነውን Apache እና mod_php ጥምረት እየተጠቀሙ ሊሆን ይችላል። ነገር ግን ትንሽ ለየት ባለ መልኩ ቢሰራም, መርሆቹ ተመሳሳይ ናቸው.

PHP-FPM እንዴት የመተግበሪያ ኮድ እንደሚፈጽም እንመልከት። ጥያቄ ሲመጣ፣ ፒኤችፒ-ኤፍፒኤም ፒኤችፒ የልጅ ሂደትን ይጀምራል እና የጥያቄውን ዝርዝር እንደ የግዛቱ አካል (_GET፣ _POST፣ _SERVER፣ ወዘተ) ያስተላልፋል።

በ PHP ስክሪፕት አፈፃፀም ወቅት ስቴቱ ሊለወጥ አይችልም ፣ ስለዚህ አዲስ የግቤት ውሂብ ለማግኘት አንድ መንገድ ብቻ ነው-የሂደቱን ማህደረ ትውስታ በማጽዳት እና እንደገና በማስጀመር።

ይህ የማስፈጸሚያ ሞዴል ብዙ ጥቅሞች አሉት. ስለ ማህደረ ትውስታ ፍጆታ ብዙ መጨነቅ አይኖርብዎትም, ሁሉም ሂደቶች ሙሉ ለሙሉ የተገለሉ ናቸው, እና ከመካከላቸው አንዱ "ከሞተ", በራስ-ሰር እንደገና ይፈጠራል እና የተቀሩትን ሂደቶች አይጎዳውም. ነገር ግን ይህ አቀራረብ አፕሊኬሽኑን ለመመዘን በሚሞከርበት ጊዜ የሚታዩ ጉዳቶችም አሉት።

የመደበኛ ፒኤችፒ አካባቢ ጉዳቶች እና ድክመቶች

ፕሮፌሽናል ፒኤችፒ ገንቢ ከሆኑ ታዲያ አዲስ ፕሮጀክት የት እንደሚጀመር ያውቃሉ - በማዕቀፍ ምርጫ። ጥገኝነት መርፌ ቤተመጻሕፍትን፣ ORMsን፣ ትርጉሞችን እና አብነቶችን ያካትታል። እና በእርግጥ ሁሉም የተጠቃሚ ግብአት በአንድ ነገር ውስጥ (Symfony/HttpFoundation ወይም PSR-7) ውስጥ ሊገባ ይችላል። ማዕቀፎች አሪፍ ናቸው!

ግን ሁሉም ነገር የራሱ ዋጋ አለው. በማንኛውም የድርጅት ደረጃ ማዕቀፍ ውስጥ ቀላል የተጠቃሚ ጥያቄን ለማስኬድ ወይም የውሂብ ጎታ ለመድረስ ቢያንስ በደርዘን የሚቆጠሩ ፋይሎችን መጫን፣ ብዙ ክፍሎችን መፍጠር እና በርካታ አወቃቀሮችን መተንተን ይኖርብዎታል። ግን በጣም መጥፎው ነገር እያንዳንዱን ተግባር ከጨረሱ በኋላ ሁሉንም ነገር እንደገና ማቀናበር እና እንደገና መጀመር ያስፈልግዎታል-የጀመሩት ኮድ ሁሉ ከንቱ ይሆናል ፣ በእሱ እርዳታ ሌላ ጥያቄን አያስኬዱም። በሌላ ቋንቋ ለሚጽፍ ለማንኛውም ፕሮግራመር ይንገሩ እና ፊቱ ላይ ግራ መጋባትን ታያላችሁ።

ፒኤችፒ መሐንዲሶች ብልህ ሰነፍ የመጫኛ ቴክኒኮችን ፣ ማይክሮ ፎርሞችን ፣ የተመቻቹ ቤተ-መጽሐፍትን ፣ መሸጎጫዎችን ፣ ወዘተ በመጠቀም ይህንን ችግር ለመፍታት ለዓመታት ሲፈልጉ ቆይተዋል ። ግን በመጨረሻ ፣ አሁንም መላውን መተግበሪያ እንደገና ማስጀመር እና እንደገና እና እንደገና መጀመር አለብዎት። (የአስተርጓሚ ማስታወሻ፡- ይህ ችግር ከመምጣቱ ጋር በከፊል መፍትሄ ያገኛል ጫን በ PHP 7.4)

ፒኤችፒ ከ Go ጋር ከአንድ በላይ ጥያቄዎችን ማዳን ይችላል?

ከጥቂት ደቂቃዎች በላይ የሚኖሩ (እስከ ሰአታት ወይም ቀናት) ያሉ የPHP ስክሪፕቶችን መፃፍ ይቻላል፡- ለምሳሌ ክሮን ተግባራት፣ CSV parsers፣ queue breakers። ሁሉም በተመሳሳይ ሁኔታ ይሰራሉ ​​​​አንድን ተግባር ሰርስረው ያወጡታል, ያከናውናሉ እና ቀጣዩን ይጠብቁ. ክፈፉ እና አፕሊኬሽኑን ለመጫን ብዙ ተጨማሪ እርምጃዎች ስለሚያስፈልጉ ኮዱ ሁል ጊዜ በማህደረ ትውስታ ውስጥ ይኖራል ፣ ውድ ሚሊሰከንዶችን ይቆጥባል።

ነገር ግን ረጅም ዕድሜ ያላቸው ስክሪፕቶችን ማዘጋጀት ቀላል አይደለም. ማንኛውም ስህተት ሂደቱን ሙሉ በሙሉ ይገድለዋል, የማህደረ ትውስታ ፍሳሾችን መመርመር በጣም ያበሳጫል, እና F5 ማረም ከአሁን በኋላ አይቻልም.

ፒኤችፒ 7 ሲለቀቅ ሁኔታው ​​ተሻሽሏል፡ አስተማማኝ የቆሻሻ አሰባሳቢ ታየ፣ ስሕተቶችን ለማስተናገድ ቀላል ሆኗል፣ እና የከርነል ማራዘሚያዎች አሁን መፍሰስ የማይቻሉ ናቸው። እውነት ነው, መሐንዲሶች አሁንም በማስታወስ መጠንቀቅ እና በኮድ ውስጥ ያሉ የስቴት ጉዳዮችን ማወቅ አለባቸው (እነዚህን ነገሮች ችላ ማለት የሚችል ቋንቋ አለ?). አሁንም፣ ፒኤችፒ 7 በኛ መደብር ያነሱ አስገራሚ ነገሮች አሉት።

ከረጅም ጊዜ የፒኤችፒ ስክሪፕቶች ጋር የመስራትን ሞዴል መውሰድ ፣ እንደ HTTP ጥያቄዎችን ማቀናበር ካሉ ቀላል ተግባራት ጋር ማስማማት እና በእያንዳንዱ ጥያቄ ሁሉንም ነገር ከባዶ የመጫን አስፈላጊነትን ማስወገድ ይቻላል?

ይህንን ችግር ለመፍታት በመጀመሪያ የኤችቲቲፒ ጥያቄዎችን የሚቀበል የአገልጋይ አፕሊኬሽን መተግበር እና በየጊዜው ሳይገድሉት አንድ በአንድ ወደ ፒኤችፒ ሰራተኛ ማዞር አለብን።

የድር አገልጋይን በንጹህ ፒኤችፒ (PHP-PM) ወይም በ C ቅጥያ (ስዎል) መፃፍ እንደምንችል እናውቅ ነበር። እና እያንዳንዱ ዘዴ የራሱ ጥቅሞች ቢኖረውም, ሁለቱም አማራጮች እኛን አይስማሙም - የበለጠ ነገር እንፈልጋለን. ከድር አገልጋይ የበለጠ እንፈልጋለን - በ PHP ውስጥ "ከጠንካራ ጅምር" ጋር ተያይዘው ከሚከሰቱ ችግሮች ሊያድነን የሚችል መፍትሄ እናገኛለን ብለን ጠብቀን ነበር ፣ ይህም በተመሳሳይ ጊዜ ለተወሰኑ መተግበሪያዎች በቀላሉ ሊስተካከል እና ሊራዘም ይችላል። ማለትም የመተግበሪያ አገልጋይ እንፈልጋለን።

በዚህ ላይ ሂድ ሊረዳህ ይችላል? ቋንቋው አፕሊኬሽኖችን ወደ ነጠላ ሁለትዮሽ ስለሚያጠናቅቅ ሊሆን እንደሚችል አውቀናል፤ መስቀል-መድረክ ነው; የራሱን፣ በጣም የሚያምር፣ ትይዩ የማስኬጃ ሞዴል (ተመሳሳይ) እና ከኤችቲቲፒ ጋር ለመስራት ቤተመፃህፍት ይጠቀማል። እና በመጨረሻም በሺዎች የሚቆጠሩ ክፍት ምንጭ ቤተ-መጻሕፍት እና ውህደቶች ለእኛ ይገኛሉ።

ሁለት የፕሮግራሚንግ ቋንቋዎችን የማጣመር ችግሮች

በመጀመሪያ ደረጃ, ሁለት ወይም ከዚያ በላይ መተግበሪያዎች እንዴት እርስ በርስ እንደሚገናኙ መወሰን አስፈላጊ ነበር.

ለምሳሌ በመጠቀም በጣም ጥሩ ቤተ-መጽሐፍት አሌክስ ፓሌስትራስ፣ በPHP እና Go ሂደቶች መካከል ማህደረ ትውስታን ማጋራት ተችሏል (በ Apache ውስጥ ካለው mod_php ጋር ተመሳሳይ)። ነገር ግን ይህ ቤተ መፃህፍት ለችግራችን መፍትሄ አጠቃቀሙን የሚገድቡ ባህሪያት አሉት።

እኛ የተለየ, ይበልጥ የተለመደ አቀራረብ ለመጠቀም ወሰንን: ሶኬቶች / ቧንቧዎች በኩል ሂደቶች መካከል መስተጋብር ለመገንባት. ይህ አቀራረብ ባለፉት አሥርተ ዓመታት ውስጥ አስተማማኝ ሆኖ የተገኘ ሲሆን በስርዓተ ክወናው ደረጃ በጥሩ ሁኔታ የተሻሻለ ነው.

ለመጀመር፣ በሂደቶች መካከል ውሂብ ለመለዋወጥ እና የማስተላለፊያ ስህተቶችን ለማስተናገድ ቀላል የሁለትዮሽ ፕሮቶኮልን ፈጠርን። በጣም ቀላል በሆነ መልኩ, የዚህ አይነት ፕሮቶኮል ተመሳሳይ ነው መረቡ с ቋሚ መጠን ፓኬት ራስጌ (በእኛ ሁኔታ 17 ባይት) ፣ ስለ ፓኬት አይነት ፣ መጠኑ እና የመረጃውን ትክክለኛነት ለመፈተሽ የሁለትዮሽ ጭንብል መረጃ ይይዛል።

በተጠቀምንበት ፒኤችፒ በኩል ጥቅል ተግባር፣ እና በጉዞ ላይ ፣ ቤተ-መጽሐፍት። ኢንኮዲንግ / ሁለትዮሽ.

አንድ ፕሮቶኮል በቂ ያልሆነ መስሎን ነበር - እና የመደወል ችሎታን ጨምረናል። net/rpc በቀጥታ ከ ፒኤችፒ አገልግሎቶች ይሂዱ. በኋላ፣ Go ቤተ መጻሕፍትን ወደ ፒኤችፒ አፕሊኬሽኖች በቀላሉ ማዋሃድ ስለምንችል ይህ በእድገት ላይ ብዙ ረድቶናል። የዚህ ሥራ ውጤት ለምሳሌ በሌላኛው የክፍት ምንጭ ምርታችን ውስጥ ይታያል ጎሪጅ.

ተግባራትን በበርካታ ፒኤችፒ ሰራተኞች ማሰራጨት።

የመስተጋብር ዘዴን ከተጠቀምን በኋላ ስራዎችን ወደ ፒኤችፒ ሂደቶች ለማስተላለፍ በጣም ቀልጣፋ መንገድ ማሰብ ጀመርን. አንድ ተግባር ሲመጣ አፕሊኬሽኑ አገልጋይ እሱን ለማስፈጸም ነፃ ሠራተኛ መምረጥ አለበት። አንድ ሰራተኛ/ሂደት በስህተት ከወጣ ወይም "ከሞተ" እናስወግደዋለን እና የሚተካ አዲስ እንፈጥራለን። እና ሰራተኛው / ሂደቱ በተሳካ ሁኔታ ከተጠናቀቀ, ተግባሮችን ለማከናወን ወደሚገኘው የሰራተኞች ስብስብ እንመልሰዋለን.

RoadRunner: ፒኤችፒ ለመሞት አልተገነባም, ወይም Golang ለማዳን

የንቁ ሰራተኞችን ገንዳ ለማከማቸት, እንጠቀማለን የታሸገ ቻናል, ሳይታሰብ "የሞቱ" ሰራተኞችን ከመዋኛ ገንዳ ውስጥ ለማስወገድ, ስህተቶችን እና የሰራተኞችን ሁኔታ ለመከታተል ዘዴን ጨምረናል.

በውጤቱም፣ በሁለትዮሽ መልክ የሚቀርቡትን ማንኛውንም ጥያቄዎች ማስተናገድ የሚችል የሚሰራ ፒኤችፒ አገልጋይ አግኝተናል።

መተግበሪያችን እንደ ድር አገልጋይ መስራት እንዲጀምር፣ ማንኛውንም ገቢ HTTP ጥያቄዎችን ለመወከል አስተማማኝ የPHP መስፈርት መምረጥ ነበረብን። በእኛ ሁኔታ, እኛ ብቻ መለወጥ net/http ጥያቄ ከ Go to format PSR-7ዛሬ ካሉት አብዛኞቹ የPHP ማዕቀፎች ጋር እንዲስማማ።

PSR-7 የማይለዋወጥ ነው ተብሎ ስለሚታሰብ (አንዳንዶች በቴክኒካል አይደለም ይላሉ)፣ ገንቢዎች ጥያቄውን በመርህ ደረጃ እንደ ዓለምአቀፋዊ አካል የማይመለከቱ መተግበሪያዎችን መጻፍ አለባቸው። ይህ ከረጅም ጊዜ የ PHP ሂደቶች ጽንሰ-ሀሳብ ጋር በጥሩ ሁኔታ ይጣጣማል። እስካሁን ስሙ ያልተጠቀሰው የመጨረሻ አፈጻጸማችን ይህን ይመስላል።

RoadRunner: ፒኤችፒ ለመሞት አልተገነባም, ወይም Golang ለማዳን

RoadRunnerን በማስተዋወቅ ላይ - ከፍተኛ አፈጻጸም PHP መተግበሪያ አገልጋይ

የመጀመሪያው የሙከራ ስራችን የኤፒአይ ጀርባ ነበር፣ እሱም በየጊዜው በማይታወቅ ሁኔታ የሚፈነዳ (ከተለመደው በጣም ብዙ ጊዜ)። ምንም እንኳን nginx በአብዛኛዎቹ ሁኔታዎች በቂ ቢሆንም, ለሚጠበቀው ጭነት መጨመር ስርዓቱን በፍጥነት ማመጣጠን ስላልቻልን 502 ስህተቶችን በመደበኛነት አጋጥሞናል.

ይህንን መፍትሄ ለመተካት በ2018 መጀመሪያ ላይ የመጀመሪያውን PHP/Go መተግበሪያ ሰርቨር አሰማርተናል። እና ወዲያውኑ አስደናቂ ውጤት አገኘ! የ502 ስህተቱን ሙሉ በሙሉ ማጥፋት ብቻ ሳይሆን የአገልጋዮቹን ቁጥር በሁለት ሶስተኛ መቀነስ ችለናል፤ ብዙ ገንዘብ በመቆጠብ ለኢንጅነሮች እና የምርት አስተዳዳሪዎች የራስ ምታት ኪኒን።

በዓመቱ አጋማሽ ላይ መፍትሄችንን አሻሽለነዋል፣ በ MIT ፍቃድ በ GitHub ላይ አሳትመን ሰይመን አውቀነዋል። ሮድ ሩነር, ስለዚህ በሚያስደንቅ ፍጥነት እና ቅልጥፍና ላይ አፅንዖት ይሰጣል.

RoadRunner እንዴት የእርስዎን የእድገት ቁልል ማሻሻል ይችላል።

ትግበራ ሮድ ሩነር ጥያቄው PHP ከመድረሱ በፊት JWT ማረጋገጫን ለመስራት በGo side ላይ ሚድዌር ኔት/httpን እንድንጠቀም እንዲሁም WebSockets እና aggregate stateን በአለምአቀፍ ደረጃ በፕሮሜቲየስ ውስጥ እንድንይዝ ፈቅዶልናል።

አብሮ በተሰራው RPC ምስጋና ይግባውና የኤክስቴንሽን መጠቅለያዎችን ሳይጽፉ የማንኛውንም የ Go ቤተ-መጽሐፍት ለPHP መክፈት ይችላሉ። ከሁሉም በላይ፣ በRoadRunner አዲስ ኤችቲቲፒ ያልሆኑ አገልጋዮችን ማሰማራት ይችላሉ። ምሳሌዎች በ PHP ውስጥ ተቆጣጣሪዎችን ማሄድን ያካትታሉ ኤስኤስኤስ ላምዳ, አስተማማኝ ወረፋ ሰሪዎችን መፍጠር እና እንዲያውም መጨመር ጂአርፒሲ ወደ ማመልከቻዎቻችን.

በPHP እና Go ማህበረሰቦች እገዛ የመፍትሄውን መረጋጋት አሻሽለናል፣ በአንዳንድ ሙከራዎች የመተግበሪያ አፈጻጸምን እስከ 40 ጊዜ ጨምረናል፣ የተሻሻሉ የማረሚያ መሳሪያዎችን፣ ከሲምፎኒ ማዕቀፍ ጋር መቀላቀልን እና ለ HTTPS፣ HTTP/2 ድጋፍ ጨምረናል። ተሰኪዎች እና PSR-17.

መደምደሚያ

አንዳንድ ሰዎች አሁንም እንደ ዘገምተኛ እና የማይጠቅም ቋንቋ ለዎርድፕረስ ፕለጊን ለመፃፍ ብቻ ጥሩ እንደሆነ በወጣበት የ PHP አስተሳሰብ ውስጥ ተይዘዋል። እነዚህ ሰዎች ፒኤችፒ ገደብ አለው ሊሉ ይችላሉ፡ አፕሊኬሽኑ በበቂ ሁኔታ ሲጨምር፣ የበለጠ “በሳል” ቋንቋ መምረጥ እና ለብዙ አመታት የተጠራቀመውን የኮድ መሰረት እንደገና መፃፍ አለቦት።

ለዚህ ሁሉ መልስ መስጠት እፈልጋለሁ: እንደገና አስብ. ለ PHP ምንም ገደቦችን ያዘጋጀኸው አንተ ብቻ እንደሆነ እናምናለን። ለፍላጎቶችዎ ተስማሚ የሆነውን ለማግኘት በመሞከር ከአንዱ ቋንቋ ወደ ሌላ በመሸጋገር መላ ህይወትዎን ማሳለፍ ይችላሉ ወይም ቋንቋዎችን እንደ መሳሪያ ማሰብ መጀመር ይችላሉ። እንደ ፒኤችፒ ያሉ የሚታሰቡት የቋንቋ ጉድለቶች ለስኬቱ ምክንያት ሊሆኑ ይችላሉ። እና እንደ Go ካሉ ቋንቋዎች ጋር ካዋህዱት፣ ማንኛውንም ቋንቋ ለመጠቀም ከተገደቡ የበለጠ ኃይለኛ ምርቶችን ይፈጥራሉ።

ከጎ እና ፒኤችፒ ስብስብ ጋር ከሰራን፣ እንወዳቸዋለን ማለት እንችላለን። አንዱን ለሌላው መስዋዕት ለማድረግ አላሰብንም - በተቃራኒው ፣ ከዚህ ድርብ ቁልል የበለጠ ዋጋ ለማግኘት መንገዶችን እንፈልጋለን።

UPD: የRoadRunner ፈጣሪን እና የዋናውን መጣጥፍ ተባባሪ ደራሲ እንኳን ደህና መጡ - ላኬሲስ

ምንጭ: hab.com

አስተያየት ያክሉ