RoadRunner: Níl PHP tógtha chun bás, nó Golang chun an tarrthála

RoadRunner: Níl PHP tógtha chun bás, nó Golang chun an tarrthála

Hey Habr! Táimid gníomhach ag Badoo ag obair ar fheidhmíocht PHP, toisc go bhfuil córas sách mór againn sa teanga seo agus gur ceist choigilte airgid í ceist na feidhmíochta. Níos mó ná deich mbliana ó shin, chruthaigh muid PHP-FPM le haghaidh seo, a bhí ar dtús ina sraith paistí do PHP, agus níos déanaí chuaigh sé isteach sa dáileadh oifigiúil.

Le blianta beaga anuas, tá dul chun cinn mór déanta ag PHP: tá feabhas tagtha ar an mbailitheoir truflais, tá méadú tagtha ar an leibhéal cobhsaíochta - inniu is féidir leat deamhan agus scripteanna fada saoil a scríobh i PHP gan aon fhadhbanna. Cheadaigh sé seo Spiral Scout dul níos faide: ní ghlanann RoadRunner, murab ionann agus PHP-FPM, cuimhne idir iarratais, rud a thugann gnóthachan feidhmíochta breise (cé go gcuireann an cur chuige seo casta ar an bpróiseas forbartha). Táimid ag tástáil leis an uirlis seo faoi láthair, ach níl aon torthaí fós le roinnt againn. Chun fanacht níos mó spraoi dóibh, foilsímid aistriúchán ar fhógra RoadRunner ó Spiral Scout.

Tá an cur chuige ón alt gar dúinn: nuair a bhíonn ár gcuid fadhbanna á réiteach againn, is minic a bhainimid úsáid as bunch de PHP agus Go, ag fáil buntáistí an dá theanga agus gan ceann amháin a thréigean i bhfabhar an chinn eile.

Bain sult as!

Le deich mbliana anuas, tá iarratais cruthaithe againn do chuideachtaí ón liosta Fortune 500, agus do ghnólachtaí le lucht féachana nach mó ná 500 úsáideoir. An t-am seo ar fad, tá ár n-innealtóirí ag forbairt an inneall go príomha i PHP. Ach dhá bhliain ó shin, bhí tionchar mór ag rud éigin ní hamháin ar fheidhmíocht ár dtáirgí, ach freisin ar a n-scalability - thugamar Golang (Go) isteach inár stack teicneolaíochta.

Beagnach láithreach, fuair muid amach gur cheadaigh Go dúinn feidhmchláir níos mó a thógáil le suas le feabhsuithe feidhmíochta 40x. Leis, bhíomar in ann ár gcuid táirgí PHP reatha a leathnú, iad a fheabhsú trí bhuntáistí an dá theanga a chomhcheangal.

Inseoimid duit conas a chuidíonn an teaglaim de Go agus PHP le fíorfhadhbanna forbartha a réiteach agus conas a d’iompaigh sé ina uirlis dúinn ar féidir fáil réidh le cuid de na fadhbanna a bhaineann le Múnla php ag fáil bháis.

Do thimpeallacht forbartha PHP laethúil

Sula labhairt linn faoi conas is féidir leat é a úsáid Téigh go dtí an tsamhail PHP ag fáil bháis a athbheochan, déanaimis féachaint ar do thimpeallacht forbartha PHP réamhshocraithe.

I bhformhór na gcásanna, ritheann tú d'iarratas ag baint úsáide as meascán de fhreastalaí gréasáin nginx agus freastalaí PHP-FPM. Freastalaíonn an chéad cheann ar chomhaid statacha agus athsheolaíonn sé iarratais shonracha chuig PHP-FPM, agus déanann PHP-FPM féin cód PHP a fhorghníomhú. Seans go bhfuil tú ag baint úsáide as an meascán de Apache agus mod_php nach bhfuil chomh coitianta. Ach cé go n-oibríonn sé beagán difriúil, tá na prionsabail mar an gcéanna.

Breathnaímid ar an gcaoi a ndéanann PHP-FPM cód iarratais a fhorghníomhú. Nuair a thagann iarratas isteach, cuireann PHP-FPM tús le próiseas linbh PHP agus cuireann sé sonraí an iarratais ar aghaidh mar chuid dá stát (_GET, _POST, _SERVER, etc.).

Ní féidir leis an stát athrú le linn script PHP a chur i gcrích, mar sin is é an t-aon bhealach chun sraith nua sonraí ionchuir a fháil ná cuimhne an phróisis a ghlanadh agus é a thosú arís.

Tá go leor buntáistí ag an múnla forghníomhaithe seo. Ní gá duit a bheith buartha faoi thomhaltas cuimhne, tá na próisis go léir scoite amach go hiomlán, agus má "bíonn ceann acu", déanfar é a athchruthú go huathoibríoch agus ní dhéanfaidh sé difear don chuid eile de na próisis. Ach tá míbhuntáistí ag baint leis an gcur chuige seo freisin a fheictear nuair a dhéantar iarracht an t-iarratas a scála.

Míbhuntáistí agus Neamhéifeachtúlachtaí Timpeallachta PHP Rialta

Más forbróir PHP gairmiúil tú, ansin tá a fhios agat cá háit le tionscadal nua a thosú - leis an rogha creata. Tá sé comhdhéanta de leabharlanna insteallta spleáchais, ORManna, aistriúcháin agus teimpléid. Agus, ar ndóigh, is féidir gach ionchur úsáideora a chur go caothúil in aon rud amháin (Symfony/HttpFoundation nó PSR-7). Tá creataí fionnuar!

Ach tá a phraghas ag gach rud. In aon chreat leibhéal fiontair, chun iarratas úsáideora simplí nó rochtain ar bhunachar sonraí a phróiseáil, beidh ort ar a laghad mórán comhad a luchtú, go leor ranganna a chruthú agus roinnt cumraíochtaí a pharsáil. Ach is é an rud is measa ná tar éis duit gach tasc a chríochnú, beidh ort gach rud a athshocrú agus tosú arís: éiríonn an cód ar fad a thionscnaigh tú gan úsáid, agus lena chabhair ní dhéanfaidh tú iarratas eile a phróiseáil a thuilleadh. Inis é seo d’aon ríomhchláraitheoir a scríobhann i dteanga éigin eile, agus feicfidh tú bewilderment ar a aghaidh.

Tá innealtóirí PHP ag lorg bealaí chun an fhadhb seo a réiteach ar feadh na mblianta, ag baint úsáide as teicnící luchtaithe leisciúla cliste, microframeworks, leabharlanna optamaithe, taisce, etc. Ach sa deireadh, caithfidh tú fós an t-iarratas iomlán a athshocrú agus tosú arís agus arís eile. (Nóta an aistritheora: déanfar an fhadhb seo a réiteach go páirteach le teacht réamhlódáil in PHP 7.4)

An féidir le PHP le Go maireachtáil níos mó ná iarratas amháin?

Is féidir scripteanna PHP a scríobh a mhaireann níos faide ná cúpla nóiméad (suas le huaireanta nó laethanta): mar shampla, tascanna cron, parsálaithe CSV, scoradáin scuaine. Oibríonn siad go léir de réir an scéil chéanna: aisghabhann siad tasc, déanann siad é, agus fanann siad leis an gcéad cheann eile. Tá cuimhne ag an gcód an t-am ar fad, rud a shábhálann milleasoicindí lómhara mar go bhfuil go leor céimeanna breise ag teastáil chun an creat agus an cur i bhfeidhm a luchtú.

Ach níl sé éasca scripteanna fadsaoil a fhorbairt. Maraíonn aon earráid an próiseas go hiomlán, cuireann sé infuriating má dhéantar sceitheadh ​​​​cuimhne, agus ní féidir dífhabhtú F5 a thuilleadh.

Tháinig feabhas ar an scéal nuair a scaoileadh PHP 7: tá bailitheoir truflais iontaofa le feiceáil, tá sé níos éasca earráidí a láimhseáil, agus tá síntí eithne anois gan sceitheadh. Fíor, ní mór d'innealtóirí fós a bheith cúramach le cuimhne agus a bheith feasach ar shaincheisteanna stáit i gcód (an bhfuil teanga ann ar féidir neamhaird a dhéanamh ar na rudaí seo?). Fós féin, tá níos lú iontas ar PHP 7 dúinn.

An féidir an tsamhail oibriú le scripteanna PHP fadsaoil a ghlacadh, é a oiriúnú do thascanna níos fánach cosúil le próiseáil iarratais HTTP, agus ar an mbealach sin fáil réidh leis an ngá atá le gach rud a luchtú ón tús le gach iarratas?

Chun an fhadhb seo a réiteach, b'éigean dúinn ar dtús feidhmchlár freastalaí a chur i bhfeidhm a d'fhéadfadh glacadh le hiarratais HTTP agus iad a atreorú ceann ar cheann don oibrí PHP gan é a mharú gach uair.

Bhí a fhios againn go bhféadfaimis freastalaí gréasáin a scríobh i PHP íon (PHP-PM) nó ag baint úsáide as síneadh C (Swoole). Agus cé go bhfuil a fhiúntais féin ag gach modh, ní raibh an dá rogha oiriúnach dúinn - theastaigh rud éigin níos mó uainn. Bhí níos mó ná freastalaí gréasáin de dhíth orainn - bhíomar ag súil le réiteach a fháil a d'fhéadfadh muid a shábháil ó na fadhbanna a bhaineann le "tús crua" i PHP, a d'fhéadfaí a oiriúnú agus a leathnú go héasca ag an am céanna d'fheidhmchláir shonracha. Is é sin, bhí freastalaí feidhmchláir ag teastáil uainn.

An féidir le Téigh cabhrú leis seo? Bhí a fhios againn go bhféadfadh sé toisc go ndéanann an teanga feidhmchláir a thiomsú i dénártha amháin; tá sé tras-ardán; úsáideann sé a samhail próiseála comhthreomhar féin, an-galánta (concurrency) agus leabharlann chun oibriú le HTTP; agus ar deireadh, beidh na mílte leabharlann foinse oscailte agus comhtháthú ar fáil dúinn.

Na Deacrachtaí a bhaineann le Dhá Theangacha Ríomhchlárúcháin a Chomhcheangail

Ar an gcéad dul síos, bhí sé riachtanach a chinneadh conas a dhéanfaidh dhá iarratas nó níos mó cumarsáid lena chéile.

Mar shampla, ag baint úsáide as leabharlann den scoth Alex Palaestras, bhíothas in ann cuimhne a roinnt idir próisis PHP agus Go (cosúil le mod_php in Apache). Ach tá gnéithe sa leabharlann seo a chuireann srian lena húsáid chun ár bhfadhb a réiteach.

Shocraigh muid cur chuige difriúil, níos coitianta a úsáid: chun idirghníomhaíocht a thógáil idir próisis trí soicéid / píblínte. Tá an cur chuige seo iontaofa le scór bliain anuas agus tá sé optamaithe go maith ag leibhéal an chórais oibriúcháin.

Ar an gcéad dul síos, chruthaigh muid prótacal dénártha simplí chun sonraí a mhalartú idir próisis agus láimhseáil earráidí tarchurtha. Ina fhoirm is simplí, tá an cineál prótacal seo cosúil le sreangán с ceanntásc paicéad méid seasta (inár gcás 17 beart), ina bhfuil faisnéis faoin gcineál paicéad, a mhéid agus masc dénártha chun sláine na sonraí a sheiceáil.

Ar thaobh PHP úsáideamar feidhm pacáiste, agus ar an taobh Téigh, an leabharlann ionchódú/dénártha.

Dhealraigh sé dúinn nach raibh prótacal amháin go leor - agus chuir muid an cumas chun glaoch net/rpc go seirbhísí go díreach ó PHP. Níos déanaí, chabhraigh sé seo go mór linn i bhforbairt, toisc go bhféadfaimis leabharlanna Go a chomhtháthú go héasca i bhfeidhmchláir PHP. Tá toradh na hoibre seo le feiceáil, mar shampla, inár dtáirge foinse oscailte eile Goridge.

Tascanna a dháileadh ar il-oibrithe PHP

Tar éis an mheicníocht idirghníomhaíochta a chur i bhfeidhm, thosaigh muid ag smaoineamh ar an mbealach is éifeachtaí chun tascanna a aistriú chuig próisis PHP. Nuair a thagann tasc, ní mór don fhreastalaí feidhmchláir oibrí saor in aisce a roghnú chun é a fhorghníomhú. Má théann oibrí/próiseas amach le hearráid nó má “fhaigheann sé bás”, bainimid réidh leis agus cruthaímid ceann nua le cur ina áit. Agus má tá an t-oibrí/próiseas críochnaithe go rathúil, cuirimid ar ais é chuig an linn oibrithe atá ar fáil chun tascanna a dhéanamh.

RoadRunner: Níl PHP tógtha chun bás, nó Golang chun an tarrthála

Chun an linn d'oibrithe gníomhacha a stóráil, d'úsáideamar cainéal maolánach, chun oibrithe “marbh” gan choinne a bhaint den linn, chuireamar meicníocht leis chun earráidí agus staid oibrithe a rianú.

Mar thoradh air sin, fuaireamar freastalaí PHP oibre a bhí in ann aon iarratais a chuirtear i láthair i bhfoirm dhénártha a phróiseáil.

Chun gur féidir lenár n-iarratas tosú ag obair mar fhreastalaí gréasáin, bhí orainn caighdeán PHP iontaofa a roghnú chun aon iarratais HTTP a tháinig isteach a léiriú. In ár gcás, táimid díreach claochlú iarratas glan/http ó Téigh go formáid PSR-7ionas go mbeidh sé ag luí leis an chuid is mó de na creataí PHP atá ar fáil inniu.

Toisc go meastar PSR-7 a bheith neamh-inmharthana (déarfadh cuid acu nach bhfuil sé go teicniúil), caithfidh forbróirí feidhmchláir a scríobh nach ndéileálann leis an iarratas mar aonán domhanda i bprionsabal. Luíonn sé seo go deas le coincheap na bpróiseas PHP fadsaoil. Bhí cuma mar seo ar ár gcur i bhfeidhm deiridh, atá fós le hainmniú:

RoadRunner: Níl PHP tógtha chun bás, nó Golang chun an tarrthála

RoadRunner á thabhairt isteach - freastalaí iarratais PHP ardfheidhmíochta

Ba é an chéad tasc tástála a bhí againn ná inneall API, a phléascann go tréimhsiúil gan choinne (i bhfad níos minice ná mar is gnách). Cé gur leor nginx i bhformhór na gcásanna, thángamar ar 502 earráid go rialta mar níorbh fhéidir linn an córas a chothromú tapa go leor don mhéadú ualach a rabhthas ag súil leis.

Chun an réiteach seo a athsholáthar, rinneamar ár gcéad fhreastalaí iarratais PHP/Go a imscaradh go luath in 2018. Agus fuair láithreach éifeacht dochreidte! Ní hamháin go bhfuaireamar réidh leis an earráid 502 go hiomlán, ach bhíomar in ann líon na bhfreastalaithe a laghdú dhá thrian, rud a shábháil go leor airgid agus pills tinneas cinn d'innealtóirí agus do bhainisteoirí táirgí.

Faoi lár na bliana, bhí ár réiteach feabhsaithe againn, d'fhoilsíomar é ar GitHub faoi cheadúnas MIT agus d'ainmnigh muid é Roadrunner, rud a chuireann béim ar a luas agus a éifeachtúlacht dochreidte.

Conas is féidir le RoadRunner do chairn forbartha a fheabhsú

Iarratas Roadrunner cheadaigh sé dúinn úsáid a bhaint as Middleware net/http on the Go chun fíorú JWT a dhéanamh sula sroicheann an t-iarratas PHP, chomh maith le WebSockets agus an stát comhiomlán a láimhseáil go domhanda i Prometheus.

A bhuíochas leis an RPC ionsuite, is féidir leat API aon leabharlanna Téigh a oscailt le haghaidh PHP gan fillteáin síntí a scríobh. Níos tábhachtaí fós, le RoadRunner is féidir leat freastalaithe nua neamh-HTTP a imscaradh. I measc na samplaí tá láimhseálaithe reáchtáil i PHP AWS Lambda, ag cruthú scoradáin scuaine iontaofa, agus fiú ag cur gRPC dár n-iarratas.

Le cabhair ó na pobail PHP agus Go, chuireamar feabhas ar chobhsaíocht an réitigh, mhéadaigh muid feidhmíocht iarratais suas le 40 uair i roinnt tástálacha, chuireamar feabhas ar uirlisí dífhabhtaithe, chuireamar comhtháthú le creat Symfony i bhfeidhm, agus chuireamar tacaíocht bhreise do HTTPS, HTTP/2, forlíontáin, agus PSR-17.

Conclúid

Tá roinnt daoine gafa go fóill sa choincheap as dáta de PHP mar theanga mhall, dothuigthe ach atá go maith chun forlíontáin a scríobh do WordPress. D’fhéadfadh na daoine seo a rá fiú go bhfuil teorainn den sórt sin ag PHP: nuair a éiríonn an feidhmchlár mór go leor, caithfidh tú teanga níos “aibí” a roghnú agus an bonn cóid a carntar thar na blianta fada a athscríobh.

Chun seo go léir ba mhaith liom a fhreagairt: smaoineamh arís. Creidimid go bhfuil tú amháin a leagtar aon srianta ar PHP. Is féidir leat do shaol ar fad a chaitheamh ag aistriú ó theanga amháin go teanga eile, ag iarraidh teacht ar an meaitseáil foirfe do do chuid riachtanas, nó is féidir leat tosú ag smaoineamh ar theangacha mar uirlisí. Seans gurb iad na lochtanna ceaptha a bhaineann le teanga mar PHP an chúis le rathúlacht na teanga. Agus má chomhcheanglaíonn tú é le teanga eile cosúil le Téigh, cruthóidh tú táirgí i bhfad níos cumhachtaí ná mar a bheadh ​​​​tú teoranta d'aon teanga amháin a úsáid.

Tar éis oibriú le dornán de Go agus PHP, is féidir linn a rá go bhfuil grá againn dóibh. Níl sé beartaithe againn ceann amháin a íobairt don duine eile - ar a mhalairt, lorgóimid bealaí chun luach níos mó fós a fháil ón dé-stack seo.

UPD: cuirimid fáilte roimh chruthaitheoir RoadRunner agus comh-údar an ailt bhunaidh - Lachesis

Foinse: will.com

Add a comment