RoadRunner: PHP looma dhisin inuu dhinto, ama Golang si loo badbaadiyo

RoadRunner: PHP looma dhisin inuu dhinto, ama Golang si loo badbaadiyo

Hello, Habr! Waxaan ku firfircoon nahay Badoo ka shaqaynta waxqabadka PHP, mar haddii aynu leenahay nidaam si caddaalad ah u ballaaran oo luqaddan ah iyo arrinta waxqabadkeedu waa arrin lacag kaydsan. In ka badan toban sano ka hor, waxaan u abuurnay PHP-FPM tan, taas oo markii hore ahayd jaangooyooyin loogu talagalay PHP, ka dibna qayb ka noqday qaybinta rasmiga ah.

Sanadihii la soo dhaafay, PHP wuxuu sameeyay horumar weyn: qashin ururiyaha ayaa soo fiicnaaday, heerka xasilloonida ayaa kordhay - maanta waxaad ku qori kartaa daemons iyo qoraallada muddada dheer ee PHP iyada oo aan wax dhibaato ah dhicin. Tani waxay u ogolaatay Spiral Scout inuu sii socdo: RoadRunner, oo ka duwan PHP-FPM, ma nadiifiyo xusuusta inta u dhaxaysa codsiyada, taas oo siinaysa faa'iidooyin waxqabad oo dheeraad ah (in kasta oo habkani uu adkeynayo habka horumarinta). Waxaan hadda tijaabineynaa qalabkan, laakiin ma hayno wax natiijooyin ah oo aan la wadaagno weli. Si aad uga dhigto mid xiiso badan inaad sugto, Waxaan daabacnay tarjumaad ku saabsan ku dhawaaqista RoadRunner ee Spiral Scout.

Habka maqaalku waa nagu dhow yahay: marka aan xallineyno dhibaatooyinkeena, waxaan sidoo kale inta badan isticmaalnaa isku-darka PHP iyo Go, helitaanka faa'iidooyinka labada luqadood oo aan ka tanaasulin midba midka kale.

Ku raaxayso!

Tobankii sano ee la soo dhaafay, waxaan ka abuurnay liiska codsiyada shirkadaha Fortune 500, iyo ganacsiyo leh dhegaystayaal aan ka badnayn 500 isticmaale. Waqtigaan oo dhan, injineeradayadu waxay horumariyeen dhabarka inta badan PHP. Laakiin laba sano ka hor, wax saameyn weyn ku yeeshay ma aha oo kaliya waxqabadka alaabtayada, laakiin sidoo kale miisaankooda - waxaan ku soo bandhignay Golang (Go) xirmooyinka tignoolajiyada.

Isla markiiba, waxaanu ogaanay in Go ay noo ogolaatay inaan dhisno codsiyo waaweyn oo leh ilaa 40x waxqabad degdeg ah. Iyada, waxaan awoodnay inaan balaadhino alaabada hadda jirta ee ku qoran PHP, hagaajinta iyaga oo isku darka faa'iidooyinka labada luqadood.

Waxaan kuu sheegi doonaa sida isku-darka Go iyo PHP ay gacan uga geystaan ​​xallinta dhibaatooyinka horumarka dhabta ah iyo sida ay noogu noqotay qalab ka takhalusi kara qaar ka mid ah dhibaatooyinka la xiriira. Qaabka dhimanaya PHP.

Deegaankaaga Horumarineed ee PHP ee Maalinlaha ah

Kahor intaanan ku tusin sida aad u isticmaali karto Go si aad u soo nooleyso qaabka dhimanaya PHP, aan eegno heerkaaga horumarinta deegaankaaga PHP.

Inta badan, waxaad ku socodsiisaa arjiga adoo isticmaalaya isku-darka nginx server iyo server PHP-FPM. Midka ugu horreeya wuxuu u adeegaa faylal aan caadi ahayn wuxuuna u weeciyaa codsiyo gaar ah PHP-FPM, PHP-FPM lafteedu waxay fulisaa koodka PHP. Waxaa laga yaabaa inaad isticmaalayso isku dhafka aan caanka ahayn ee Apache iyo mod_php. Laakiin inkasta oo ay si ka duwan u shaqeyso, mabaadi'da waa isku mid.

Aynu eegno sida PHP-FPM u fuliyo koodka codsiga. Marka codsi yimaaddo, PHP-FPM waxa ay billowdaa habka PHP ee ilmaha oo waxa ay gudbisaa faahfaahinta codsiga iyada oo qayb ka ah gobolkeeda (_GET, _POST, _SERVER, iwm.).

Gobolku isma bedeli karo inta lagu guda jiro fulinta qoraalka PHP, markaa waxaa jirta hal dariiqo oo kaliya oo lagu heli karo xog cusub oo galinta: iyadoo la nadiifinayo xusuusta habka iyo dib u soo celinta.

Habkan fulinta wuxuu leeyahay faa'iidooyin badan. Uma baahnid inaad wax badan ka walwasho isticmaalka xusuusta, dhammaan hababka ayaa si buuxda u go'doonsan, iyo haddii mid ka mid ah uu dhinto, si toos ah ayaa loo abuuri doonaa iyada oo aan saameyn ku yeelan hababka intiisa kale. Laakiin habkani waxa kale oo uu leeyahay faa'iido darrooyin muuqda marka la isku dayayo in la cabbiro codsiga.

Khasaaraha iyo waxtar la'aanta deegaanka PHP ee caadiga ah

Haddii aad ku hawlan tahay horumarinta xirfadeed ee PHP, markaa waxaad taqaanaa meesha laga bilaabo mashruuc cusub - adoo dooranaya qaab-dhismeedka. Waxay ka kooban tahay maktabado loogu talagalay duritaanka ku-tiirsanaanta, ORM-yada, tarjumaadaha iyo qaababka. Dabcan, dhammaan talooyinka isticmaalaha waxaa si ku habboon loo gelin karaa hal shay (Symfony/HttpFoundation ama PSR-7). Qaab-dhismeedyadu waa fiican yihiin!

Laakiin wax walba waxay leeyihiin qiimahooda. Qaab dhismeed kasta oo heer-shirkadeed ah, si aad u socodsiiso codsi adeegsad fudud ama aad u gasho xog-ururin, waa inaad ku shubtaa ugu yaraan daraasiin faylal, abuurto fasallo badan oo aad kala saartaa dhawr habayn. Laakiin waxa ugu xun ayaa ah in ka dib marka la dhammeeyo hawl kasta waxaad u baahan doontaa inaad wax walba dib u dejiso oo aad dib u bilowdo: dhammaan koodka aad hadda bilowday waxay noqotaa mid aan faa'iido lahayn, iyada oo caawimadeeda aad mar dambe ka baaraandegayso codsi kale. Tan u sheeg barnaamij-yaqaan kasta oo wax ku qora luqad kale, waxaadna wajigiisa ka arki doontaa wareer.

Injineerada PHP ayaa sanado badan ku qaatay raadinta habab ay ku xalliyaan dhibaatadan, iyagoo isticmaalaya farsamooyin xariif ah oo la raray, microframeworks, maktabadaha la hagaajiyay, khasnado, iwm. Laakiin dhamaadka, wali waa inaad dib u dajinaysaa codsiga oo dhan oo aad dib u bilowdo, mar kale iyo mar kale. (Xusuusinka turjubaanka: dhibaatadan qayb ahaan waa la xalin doonaa marka ay timaado soo rar PHP 7.4)

PHP oo leh Go ma badbaadi karaa wax ka badan hal codsi?

Waa suurtagal in la qoro qoraallada PHP kuwaas oo socon doona wax ka badan dhowr daqiiqo (ilaa saacadood ama maalmo): tusaale ahaan, hawlaha cron, CSV parsers, busters safka. Dhammaantood waxay u shaqeeyaan si isku mid ah: waxay soo celiyaan hawl, oo ay fuliyaan, oo ay sugaan kan ku xiga. Koodhku wuxuu ku dhex jiraa xusuusta, isaga oo badbaadinaya millise seconds qaali ah maadaama tillaabooyin badan oo dheeri ah loo baahan yahay si loo buuxiyo qaabka iyo codsiga.

Laakin horumarinta qoraallada cimriga dheer maahan wax fudud. Qalad kasta ayaa si buuxda u dila nidaamka, ogaanshaha daadad xusuusta ayaa ku kaxaysa waali, oo ma sii isticmaali kartid qaladka F5.

Xaaladdu way fiicnaatay markii la sii daayay PHP 7: qashin ururin la isku halleyn karo ayaa soo muuqday, way fududahay in la xalliyo khaladaadka, kordhinta kernel-ka ayaa hadda laga ilaaliyaa qulqulka. Run, injineeradu wali waxay u baahan yihiin inay ka taxaddaraan xusuusta oo ay ka digtoonaadaan arrimaha gobolka ee koodhka (ma jiraan luqad aynaan ka welwelin arrimahan?). Haddana, gudaha PHP 7, yaabab yar ayaa na sugaya.

Suurtagal ma tahay in la qaato tusaalaha la shaqaynta qoraallada PHP ee cimriga dheer, lana waafajiyo hawlo badan oo fudud sida ka shaqaynta codsiyada HTTP, oo markaas meesha laga saaro baahida wax walba laga soo dejiyo codsi kasta?

Si loo xaliyo dhibaatadan, waxaan marka hore u baahnay inaan hirgalino codsi server ah oo aqbali kara codsiyada HTTP oo aan mid mid ugu gudbinay shaqaalaha PHP annagoo aan dilin mar kasta.

Waxaan ogaanay inaan ku qori karno server-ka shabakadda PHP saafi ah (PHP-PM) ama isticmaal kordhinta C (Swoole). In kasta oo hab kastaa uu leeyahay faa'iidooyin u gaar ah, labada ikhtiyaarba naguma habboona - waxaan rabnay wax dheeraad ah. Waxaan u baahneyn wax ka badan server-ka shabakadda - waxaan rajeyneynaa inaan helno xal naga badbaadin kara dhibaatooyinka la xiriira "bilawga adag" ee PHP, taas oo isla markaa si fudud loo habeyn karo loona ballaarin karo codsiyada gaarka ah. Taasi waa, waxaan u baahanay server-ka codsiga.

Ma aadi kartaa caawin tan? Waan garanaynay inay dhici karto sababtoo ah luqaddu waxay ururisaa codsiyada laba-geesoole; waa iskutallaab; adeegsada qaabkeeda, oo aad u qurux badan, isbarbar socda qaabka habaynta (concurrency) iyo maktabad si ay ula shaqeyso HTTP; iyo ugu dambeyntii, kumanaan maktabado il furan iyo isdhexgalka ayaa diyaar noo noqon doona.

Dhibaatooyinka isku-darka laba luuqadood ee barnaamijka

Talaabada ugu horeysa waxay ahayd in la go'aamiyo sida laba ama in ka badan oo codsi ah ay u wada xiriiraan midba midka kale.

Tusaale ahaan, isticmaalka maktabad cajiib ah Alex Palaestras waxa uu hirgelin karaa wadaagista xusuusta ee PHP iyo Go hababka (oo la mid ah mod_php gudaha Apache). Laakin maktabadani waxay leedahay astaamo xaddidaya isticmaalkeeda xalinta mushkiladayada.

Waxaan go'aansanay inaan isticmaalno hab kale, oo caadi ah, oo ah: si loo dhiso isdhexgalka ka dhexeeya hababka iyada oo loo marayo saldhigyada / dhuumaha. Habkani waxa uu caddeeyey isku halayntiisa tobannaankii sano ee la soo dhaafay waxaana si wanaagsan loo hagaajiyey heerka nidaamka hawlgalka.

Si aan ku bilowno, waxaanu abuurnay hab-maamuus fudud oo binary ah oo lagu kala beddelanayo xogta u dhaxaysa hababka iyo maaraynta khaladaadka gudbinta. Qaabka ugu fudud, borotokoolka noocaan ah wuxuu la mid yahay netstring с madax xirmo cabbir go'an (xaaladkeena 17 bytes), kaas oo ka kooban macluumaadka ku saabsan nooca xirmada, cabbirkiisa iyo maaskaro binary si loo hubiyo daacadnimada xogta.

Dhanka PHP-ga waxaan isticmaalnay function xirmo, iyo dhinaca Go - maktabad codayn/binary.

Waxay noo muuqatay in hal hab-maamuus aanu ku filnayn - markaa waxaanu ku darnay awoodda wicitaanka Si toos ah uga tag adeegyada net/rpc PHP. Tani waxay markii dambe wax badan naga caawisay horumarinta, maadaama aan si fudud u dhexgelin karno Go maktabadaha codsiyada PHP. Natiijada shaqadan waxaa lagu arki karaa, tusaale ahaan, alaabtayada kale ee furan Goridge.

U qaybinta hawlaha shaqaale badan oo PHP ah

Ka dib markii aan hirgelinno habka isdhexgalka, waxaan bilownay inaan ka fikirno sida ugu waxtarka badan ee loogu wareejinayo hawlaha PHP. Marka hawshu timaado, adeegaha codsigu waa inuu doortaa shaqaale xor ah si uu u dhamaystiro. Haddi shaqalaha/nidaamku ku dhamaado khalad ama "dhinto," waanu ka takhalusnaa oo abuurnaa mid cusub oo beddela. Oo haddii shaqaaluhu/hab-socodku uu si guul leh u dhammaystiray, waxaanu ku celinaynaa barkada shaqaalaha ee diyaar u ah inay qabtaan hawlaha.

RoadRunner: PHP looma dhisin inuu dhinto, ama Golang si loo badbaadiyo

Si loo kaydiyo barkad shaqaale firfircoon waxaan isticmaalnay kanaalka barafaysan, si looga saaro shaqaalaha si lama filaan ah "dhintay" barkadda, waxaan ku darnay hab lagu dabagalo khaladaadka iyo xaaladaha shaqaalaha.

Natiijo ahaan, waxaan helnay server PHP ah oo shaqeynaya oo awood u leh inuu socodsiiyo codsi kasta oo lagu soo bandhigo foomka binary.

Si codsigayagu u shaqeeyo sidii shabakad shabakad, waxay ahayd inaan doorano halbeeg la isku halayn karo oo PHP ah si aan u matalo codsi kasta oo HTTP ah oo imanaya. Xaaladeena waxaan kaliya isbedel net/http codsi ka yimid qaabka u tag PSR-7si ay ula jaanqaado badi qaab-dhismeedka PHP ee maanta jira.

Sababtoo ah PSR-7 waxaa loo arkaa mid aan isbedeli karin (qaar ayaa dhihi kara farsamo ahaan maahan), horumariyayaashu waa inay qoraan codsiyada aan asal ahaan ula dhaqmin codsiga sidii hay'ad caalami ah. Tani waxay si fiican ugu habboon tahay fikradda hababka PHP ee muddada dheer noolaa. Hirgelinteenii u dambaysay, oo aan weli la magacaabin, waxa ay u ekeyd sidan.

RoadRunner: PHP looma dhisin inuu dhinto, ama Golang si loo badbaadiyo

Soo bandhigida RoadRunner - Adeegga codsiga PHP ee waxqabadka sare leh

Hawsheenii ugu horeysay ee tijaabadu waxay ahayd dhabarka API-ga, kaas oo xilliyo kala kulmay codsiyo aan la filayn (in ka badan sidii caadiga ahayd). Inkasta oo nginx ay ku filan tahay kiisaska intooda badan, waxaan si joogto ah ula kulannay 502 khaladaad sababtoo ah ma dheelli karno nidaamka si degdeg ah oo ku filan kororka la filayo ee culeyska.

Si loo beddelo xalkan, waxaanu geynay adeegyagii ugu horreeyay ee PHP/Go server horraantii 2018. Isla markiiba waxaan helnay saameyn cajiib ah! Kaliya maahan inaan si buuxda uga takhalusno qaladka 502, laakiin sidoo kale waxaan awoodnay inaan hoos u dhigno tirada server-yada saddex-meelood laba, keydinta lacag badan iyo madax-xanuun loogu talagalay injineerada iyo maamulayaasha alaabada.

Badhtamihii sanadka, waxaanu dhamaystirnay xalkeena, ku daabacnay GitHub oo hoos yimaada shatiga MIT, oo aanu u yeedhnay Roadrunner, taas oo xoogga saaraysa xawligeeda iyo waxtarkeeda cajiibka ah.

Sidee RoadRunner u hagaajin karaa kaydkaaga horumarinta

Codsiga Roadrunner noo ogolaatay in aan isticmaalno Middleware net/http dhanka Go si aan u samayno xaqiijinta JWT ka hor inta codsigu xitaa ku dhicin PHP, iyo sidoo kale in aan wax ka qabano WebSockets iyo isugeynta gobolka caalamiga ah ee Prometheus.

Waad ku mahadsan tahay RPC-da ku dhex jirta, waxaad furi kartaa API-ga maktabadaha Go kasta ee PHP adiga oo aan qorin duubabka fidinta. Tan ka sii muhiimsan, RoadRunner waxaa loo isticmaali karaa in la geeyo adeegayaal cusub oo aan HTTP ahayn. Tusaalooyinka waxaa ka mid ah bilaabista hawlwadeenada PHP AWS Lambda, abuurista busters saf ah oo la isku halayn karo oo xitaa ku daray gRPC codsiyadayada.

Iyada oo la kaashanayo PHP iyo bulshooyinka Go, waxaan kordhinay xasilloonida xalka, kordhinta waxqabadka codsiga illaa 40 jeer imtixaanada qaarkood, hagaajinta aaladaha cilladaha, hirgelinta is dhexgalka qaabka Symfony, iyo ku daray taageerada HTTPS, HTTP / 2, plugins, iyo PSR-17.

gunaanad

Dadka qaar ayaa wali lagu qabtaa aragtida duugowday ee PHP sida tartiib tartiib ah, luqad dhib badan oo kaliya u wanaagsan qorista plugins WordPress. Dadkan ayaa laga yaabaa inay xitaa sheegaan in PHP uu leeyahay xaddidaad: marka codsigu uu weynaado, waa inaad doorataa luqad "qan" oo dheeraad ah oo dib u qor saldhigga koodka ee ururay sannado badan.

Waxaas oo dhan waxaan rabaa inaan ka jawaabo: mar kale ka fikir. Waxaan aaminsanahay in adiga kaliya aad u dejin karto xaddidaad kasta oo PHP ah. Waxaad ku qaadan kartaa noloshaada oo dhan inaad ka boodo hal luuqad una gudub mid kale, adoo isku dayaya inaad hesho ku habboon baahiyahaaga, ama waxaad bilaabi kartaa inaad luuqadaha uga fikirto qalab ahaan. Dhaliilaha la dareemayo ee luqadda sida PHP waxay dhab ahaantii noqon kartaa sababaha guusha. Oo haddii aad ku darto luqad kale sida Go, waxaad abuuri kartaa wax soo saarka ka xoog badan haddii aad ku koobnayn oo kaliya hal luqad.

Markaan la shaqeynay isku-darka Go iyo PHP, waxaan dhihi karnaa inaan jecelnahay iyaga. Ma qorsheynayno inaan midba midka kale u hurno, laakiin waxaan raadineynaa siyaabo aad xitaa qiimo badan uga soo saarno xirmadan laba geesoodka ah.

UPD: Waxaan soo dhaweyneynaa abuuraha RoadRunner iyo qoraaga maqaalka asalka ah - Lachesis

Source: www.habr.com

Add a comment