RoadRunner: PHP mhux mibni biex imut, jew Golang għas-salvataġġ

RoadRunner: PHP mhux mibni biex imut, jew Golang għas-salvataġġ

Hello, Habr! Aħna attivi f'Badoo taħdem fuq il-prestazzjoni tal-PHP, peress li għandna sistema pjuttost kbira f'din il-lingwa u l-kwistjoni tal-prestazzjoni hija kwistjoni ta 'ffrankar ta' flus. Aktar minn għaxar snin ilu, ħloqna PHP-FPM għal dan, li għall-ewwel kien sett ta 'garża għall-PHP, u aktar tard sar parti mid-distribuzzjoni uffiċjali.

F'dawn l-aħħar snin, PHP għamel progress kbir: il-kollettur taż-żibel tjieb, il-livell ta 'stabbiltà żdied - illum tista' tikteb daemons u skripts ta 'ħajja twila f'PHP mingħajr problemi. Dan ippermetta lil Spiral Scout imur lil hinn: RoadRunner, b'differenza mill-PHP-FPM, ma tnaddafx il-memorja bejn it-talbiet, li tipprovdi benefiċċji addizzjonali ta 'prestazzjoni (għalkemm dan l-approċċ jikkomplika l-proċess ta' żvilupp). Bħalissa qed nesperimentaw b'din l-għodda, iżda għad m'għandna l-ebda riżultat x'naqsmu. Biex tagħmilha aktar pjaċevoli li tistenniehom, Qed nippubblikaw traduzzjoni tal-avviż RoadRunner minn Spiral Scout.

L-approċċ mill-artiklu huwa qrib tagħna: meta nsolvu l-problemi tagħna, aħna wkoll ħafna drabi nużaw taħlita ta 'PHP u Go, billi niksbu l-benefiċċji taż-żewġ lingwi u ma naqtgħux waħda favur l-oħra.

Igawdu!

Matul l-aħħar għaxar snin, ħloqna applikazzjonijiet għal kumpaniji mil-lista Fortune 500, u għal negozji b'udjenza ta' mhux aktar minn 500 utent. Dan iż-żmien kollu, l-inġiniera tagħna żviluppaw il-backend prinċipalment fil-PHP. Iżda sentejn ilu, xi ħaġa għamlet impatt kbir mhux biss fuq il-prestazzjoni tal-prodotti tagħna, iżda wkoll fuq l-iskalabbiltà tagħhom - aħna daħħalna Golang (Mur) fil-munzell tat-teknoloġija tagħna.

Kważi immedjatament, skoprejna li Go ppermettietna nibnu applikazzjonijiet akbar b'rendiment sa 40x aktar mgħaġġel. Magħha, stajna nespandu l-prodotti eżistenti miktuba bil-PHP, titjibhom billi ngħaqqdu l-vantaġġi taż-żewġ lingwi.

Aħna ngħidulek kif taħlita ta’ Go u PHP tgħin issolvi problemi reali ta’ żvilupp u kif inbidel f’għodda għalina li tista’ telimina xi wħud mill-problemi assoċjati ma’ Mudell li jmut PHP.

L-Ambjent ta' Kuljum tiegħek għall-Iżvilupp tal-PHP

Qabel ma nitkellmu dwar kif tista 'tuża Mur biex terġa' terġa 'titqajjem il-mudell tal-mewt tal-PHP, ejja nagħtu ħarsa lejn l-ambjent standard ta' żvilupp PHP tiegħek.

Fil-biċċa l-kbira tal-każijiet, tmexxi l-applikazzjoni billi tuża taħlita ta 'server tal-web nginx u server PHP-FPM. L-ewwel iservi fajls statiċi u jidderieġi mill-ġdid talbiet speċifiċi lil PHP-FPM, u PHP-FPM innifsu jesegwixxi kodiċi PHP. Forsi qed tuża kombinazzjoni inqas popolari minn Apache u mod_php. Iżda għalkemm taħdem ftit differenti, il-prinċipji huma l-istess.

Ejja nħarsu lejn kif PHP-FPM tesegwixxi l-kodiċi tal-applikazzjoni. Meta tasal talba, PHP-FPM jinizjalizza l-proċess PHP tat-tfal u jgħaddi d-dettalji tat-talba bħala parti mill-istat tiegħu (_GET, _POST, _SERVER, eċċ.).

L-istat ma jistax jinbidel waqt l-eżekuzzjoni ta 'skript PHP, għalhekk hemm mod wieħed biss biex tikseb sett ġdid ta' dejta ta 'input: billi tneħħi l-memorja tal-proċess u terġa' tibda.

Dan il-mudell ta 'eżekuzzjoni għandu ħafna vantaġġi. M'għandekx għalfejn tinkwieta ħafna dwar il-konsum tal-memorja, il-proċessi kollha huma kompletament iżolati, u jekk wieħed minnhom imut, ikun awtomatikament rikrejat mingħajr ma jaffettwa l-bqija tal-proċessi. Iżda dan l-approċċ għandu wkoll żvantaġġi li jidhru meta tipprova tiskala l-applikazzjoni.

Żvantaġġi u ineffiċjenzi ta 'ambjent PHP regolari

Jekk inti involut fl-iżvilupp professjonali fil-PHP, allura taf fejn tibda proġett ġdid - billi tagħżel qafas. Tikkonsisti f'libreriji għal injezzjoni ta' dipendenza, ORMs, traduzzjonijiet u mudelli. U ovvjament, l-input kollu tal-utent jista 'jitqiegħed b'mod konvenjenti f'oġġett wieħed (Symfony/HttpFoundation jew PSR-7). L-oqfsa huma friski!

Imma kollox għandu l-prezz tiegħu. Fi kwalunkwe qafas ta 'livell ta' intrapriża, biex tipproċessa talba sempliċi ta 'utent jew taċċessa database, ser ikollok tagħbija mill-inqas għexieren ta' fajls, toħloq bosta klassijiet u teżamina diversi konfigurazzjonijiet. Iżda l-agħar ħaġa hija li wara li tlesti kull kompitu ser ikollok bżonn tirreset kollox u tibda mill-ġdid: il-kodiċi kollu li għadek kif bdejt isir inutli, bl-għajnuna tiegħu ma tibqax tipproċessa talba oħra. Għid dan lil kull programmatur li jikteb fi kwalunkwe lingwa oħra, u tara t-taħwid fuq wiċċu.

L-inġiniera PHP qattgħu snin ifittxu modi biex isolvu din il-problema, bl-użu ta 'tekniki għaqlija ta' tagħbija għażżien, microframeworks, libreriji ottimizzati, caches, eċċ Imma fl-aħħar, xorta trid tirrisettja l-applikazzjoni kollha u tibda mill-ġdid, għal darb'oħra u għal darb'oħra. (Nota tat-traduttur: din il-problema se tissolva parzjalment mal-miġja ta' preload f'PHP 7.4)

Jista' PHP ma' Go jgħix għal aktar minn talba waħda?

Huwa possibbli li tikteb skripts PHP li jdumu aktar minn ftit minuti (sa sigħat jew jiem): pereżempju, kompiti cron, parsers CSV, queue busters. Kollha jaħdmu skond l-istess xenarju: huma jirkupraw kompitu, jesegwixxuh, u jistennew dak li jmiss. Il-kodiċi jgħix fil-memorja, billi jiffranka millisekondi prezzjużi peress li huma meħtieġa ħafna passi addizzjonali biex jgħabbi l-qafas u l-applikazzjoni.

Iżda l-iżvilupp ta' skripts ta' ħajja twila mhuwiex daqshekk faċli. Kwalunkwe żball joqtol kompletament il-proċess, id-dijanjosi ta 'tnixxija tal-memorja tiġġennek, u ma tistax tuża aktar debugging F5.

Is-sitwazzjoni tjiebet bir-rilaxx ta 'PHP 7: deher kollettur affidabbli taż-żibel, sar aktar faċli biex jimmaniġġaw l-iżbalji, u l-estensjonijiet tal-qalba issa huma protetti minn tnixxijiet. Veru, l-inġiniera xorta jridu joqogħdu attenti mal-memorja u jkunu konxji tal-kwistjonijiet tal-istat fil-kodiċi (hemm lingwa fejn m'għandniex għalfejn ninkwieta dwar dawn l-affarijiet?). U madankollu, f'PHP 7, jistennewna inqas sorpriżi.

Huwa possibbli li tieħu l-mudell ta 'ħidma bi skripts PHP ta' ħajja twila, tadattah għal kompiti aktar trivjali bħall-ipproċessar ta 'talbiet HTTP, u b'hekk telimina l-ħtieġa li tagħbija kollox mill-bidu għal kull talba?

Biex insolvu din il-problema, l-ewwel kellna nimplimentaw applikazzjoni server li tista 'taċċetta talbiet HTTP u tibgħathom waħda waħda lill-ħaddiem PHP mingħajr ma noqtolha kull darba.

Konna nafu li nistgħu niktbu web server f'PHP pur (PHP-PM) jew bl-użu tal-estensjoni C (Swoole). U għalkemm kull metodu għandu l-merti tiegħu, iż-żewġ għażliet ma kinux adattati għalina - ridna xi ħaġa aktar. Kellna bżonn aktar minn sempliċi web server - nittamaw li niksbu soluzzjoni li tista 'tsalvana mill-problemi assoċjati mal-"bidu iebes" fil-PHP, li fl-istess ħin tista' tiġi adattata u estiża faċilment għal applikazzjonijiet speċifiċi. Jiġifieri kellna bżonn server tal-applikazzjoni.

Jista' Mur jgħin f'dan? Konna nafu li jista 'għaliex il-lingwa tiġbor l-applikazzjonijiet f'binarji singoli; huwa cross-platform; juża l-mudell tal-ipproċessar parallel (koncurrency) u l-librerija tiegħu stess, eleganti ħafna, biex jaħdem ma 'HTTP; u fl-aħħarnett, eluf ta’ libreriji u integrazzjonijiet open-source se jkunu disponibbli għalina.

Diffikultajiet biex tgħaqqad żewġ lingwi ta' programmar

L-ewwel pass kien li jiġi determinat kif żewġ applikazzjonijiet jew aktar se jikkomunikaw bejniethom.

Per eżempju, bl-użu librerija mill-isbaħ Alex Palaestras jista' jimplimenta l-kondiviżjoni tal-memorja bejn il-proċessi PHP u Go (simili għal mod_php f'Apache). Iżda din il-librerija għandha karatteristiċi li jillimitaw l-użu tagħha biex issolvi l-problema tagħna.

Iddeċidejna li nużaw approċċ ieħor, aktar komuni: li nibnu interazzjoni bejn il-proċessi permezz ta' sockets/pipelines. Dan l-approċċ wera l-affidabbiltà tiegħu matul l-aħħar deċennji u ġie ottimizzat sew fil-livell tas-sistema operattiva.

Biex tibda, ħloqna protokoll binarju sempliċi għall-iskambju tad-dejta bejn il-proċessi u l-immaniġġjar tal-iżbalji tat-trażmissjoni. Fl-aktar forma sempliċi tiegħu, dan it-tip ta 'protokoll huwa simili għal netstring с header tal-pakkett ta 'daqs fiss (fil-każ tagħna 17 bytes), li fih informazzjoni dwar it-tip ta 'pakkett, id-daqs tiegħu u maskra binarja biex tiċċekkja l-integrità tad-data.

Fuq in-naħa PHP użajna funzjoni tal-pakkett, u fuq in-naħa Go - librerija kodifikazzjoni/binarju.

Deher lilna li protokoll wieħed ma kienx biżżejjed - għalhekk żidna l-abbiltà li nċemplu Mur servizzi nett/rpc direttament minn PHP. Dan aktar tard għenna ħafna fl-iżvilupp, peress li stajna faċilment nintegraw il-libreriji Go fl-applikazzjonijiet PHP. Ir-riżultat ta 'dan ix-xogħol jista' jidher, pereżempju, fil-prodott open-source l-ieħor tagħna Goridge.

Tqassam il-kompiti fuq diversi ħaddiema PHP

Wara l-implimentazzjoni tal-mekkaniżmu ta 'interazzjoni, bdejna naħsbu dwar kif tittrasferixxi l-kompiti bl-aktar mod effiċjenti għall-proċessi PHP. Meta tasal kompitu, is-server tal-applikazzjoni jrid jagħżel ħaddiem b'xejn biex itemmha. Jekk ħaddiem/proċess jintemm bi żball jew "jmut," aħna neħilsu minnu u noħolqu waħda ġdida biex tissostitwiha. U jekk il-ħaddiem/proċess ikun tlesta b'suċċess, aħna nirritornaw lill-grupp ta 'ħaddiema disponibbli biex iwettqu l-kompiti.

RoadRunner: PHP mhux mibni biex imut, jew Golang għas-salvataġġ

Biex naħżnu ġabra ta’ ħaddiema attivi użajna kanal buffered, biex ineħħu ħaddiema "mejta" bla mistenni mill-pool, aħna żidna mekkaniżmu għat-traċċar ta 'żbalji u stati tal-ħaddiema.

Bħala riżultat, irċevejna server PHP li jaħdem kapaċi jipproċessa kwalunkwe talba ppreżentata f'forma binarja.

Sabiex l-applikazzjoni tagħna tiffunzjona bħala server tal-web, kellna nagħżlu standard PHP affidabbli biex jirrappreżenta kwalunkwe talba HTTP li tkun deħlin. Fil-każ tagħna aħna biss tittrasforma net/http talba minn Mur għall-format PSR-7sabiex ikun kompatibbli mal-biċċa l-kbira tal-oqfsa PHP disponibbli llum.

Minħabba li PSR-7 huwa meqjus bħala immutabbli (xi wħud jgħidu li teknikament mhuwiex), l-iżviluppaturi jridu jiktbu applikazzjonijiet li ma jittrattawx it-talba b'mod fundamentali bħala entità globali. Dan jaqbel sew mal-kunċett ta 'proċessi PHP ta' ħajja twila. L-implimentazzjoni finali tagħna, li kienet għadha ma ngħatatx ​​isem, dehret hekk:

RoadRunner: PHP mhux mibni biex imut, jew Golang għas-salvataġġ

Nintroduċu RoadRunner - server ta' applikazzjoni PHP ta' prestazzjoni għolja

L-ewwel kompitu tat-test tagħna kien il-backend tal-API, li perjodikament esperjenza fqigħ mhux mistennija ta 'talbiet (ħafna aktar spiss mis-soltu). Għalkemm nginx kien biżżejjed fil-biċċa l-kbira tal-każijiet, regolarment iltqajna ma '502 żbalji għaliex ma stajniex nibbilanċjaw is-sistema malajr biżżejjed għaż-żieda mistennija fit-tagħbija.

Biex tissostitwixxi din is-soluzzjoni, użajna l-ewwel server tal-applikazzjoni PHP/Go tagħna kmieni fl-2018. U immedjatament ksibna effett inkredibbli! Mhux biss neħlesna kompletament mill-iżball 502, imma stajna wkoll innaqqsu n-numru ta 'servers b'żewġ terzi, u b'hekk niffrankaw ħafna flus u uġigħ ta' ras għall-inġiniera u l-maniġers tal-prodott.

Sa nofs is-sena, konna pperfezzjonajna s-soluzzjoni tagħna, ippublikajnaha fuq GitHub taħt il-liċenzja MIT, u sejħitha Roadrunner, u b'hekk tenfasizza l-veloċità u l-effiċjenza inkredibbli tagħha.

Kif RoadRunner Jista 'jtejjeb il-Munzell ta' Żvilupp Tiegħek

Applikazzjoni Roadrunner ippermettewna nużaw Middleware net/http fuq in-naħa Go biex inwettqu verifika JWT qabel it-talba saħansitra tolqot PHP, kif ukoll biex nittrattaw WebSockets u aggregazzjoni tal-istat globali fi Prometheus.

Grazzi għall-RPC mibni, tista 'tiftaħ l-API ta' kwalunkwe librerija Go għal PHP mingħajr ma tikteb tgeżwir ta 'estensjoni. Aktar importanti minn hekk, RoadRunner jista 'jintuża biex juża servers ġodda mhux HTTP. Eżempji jinkludu tnedija ta 'handlers fil-PHP AWS Lambda, ħolqien ta 'kju ta' min joqgħod fuqhom u anke żżid gRPC għall-applikazzjonijiet tagħna.

Bl-għajnuna tal-komunitajiet PHP u Go, żidna l-istabbiltà tas-soluzzjoni, żidna l-prestazzjoni tal-applikazzjoni sa 40 darba f’xi testijiet, tjiebu għodod ta’ debugging, implimentajna integrazzjoni mal-qafas Symfony, u żiedna appoġġ għal HTTPS, HTTP/ 2, plugins, u PSR-17.

Konklużjoni

Xi nies għadhom maqbuda fil-fehma antikwata tal-PHP bħala lingwa bil-mod u ingombranti tajba biss għall-kitba ta 'plugins ta' WordPress. Dawn in-nies jistgħu saħansitra jgħidu li PHP għandu limitazzjoni: meta l-applikazzjoni ssir kbira biżżejjed, trid tagħżel lingwa aktar "matura" u tikteb mill-ġdid il-bażi tal-kodiċi li akkumulat matul ħafna snin.

Għal dan kollu rrid inwieġeb: aħseb mill-ġdid. Aħna nemmnu li inti biss tista 'tistabbilixxi kwalunkwe restrizzjoni għall-PHP. Tista' tqatta' ħajtek kollha taqbeż minn lingwa għal oħra, tipprova ssib il-perfettament għall-bżonnijiet tiegħek, jew tista' tibda taħseb fil-lingwi bħala għodda. In-nuqqasijiet perċepit ta 'lingwa bħal PHP jistgħu fil-fatt ikunu r-raġunijiet għas-suċċess tagħha. U jekk tgħaqqadha ma' lingwa oħra bħal Go, tista' toħloq prodotti ħafna aktar qawwija milli kieku kont limitat għal lingwa waħda biss.

Wara li ħdimna ma 'kombinazzjoni ta' Go u PHP, nistgħu ngħidu li nħobbuhom. Aħna ma nippjanawx li nissagrifikaw wieħed għall-ieħor, iżda pjuttost infittxu modi biex niksbu saħansitra aktar valur minn dan il-munzell doppju.

UPD: Aħna nilqgħu lill-kreatur ta' RoadRunner u ko-awtur tal-artiklu oriġinali - Lachesis

Sors: www.habr.com

Żid kumment