RoadRunner: Chan eil PHP air a thogail gus bàsachadh, no Golang gu teasairginn

RoadRunner: Chan eil PHP air a thogail gus bàsachadh, no Golang gu teasairginn

Hi Habr! Tha sinn gnìomhach aig Badoo ag obair air coileanadh PHP, leis gu bheil siostam meadhanach mòr againn sa chànan seo agus tha cùis dèanadais na chùis sàbhalaidh airgid. O chionn còrr is deich bliadhna, chruthaich sinn PHP-FPM airson seo, a bha an toiseach na sheata de phìosan airson PHP, agus an dèidh sin chaidh sinn a-steach don sgaoileadh oifigeil.

Anns na bliadhnachan mu dheireadh, tha PHP air adhartas mòr a dhèanamh: tha an neach-cruinneachaidh sgudail air a thighinn air adhart, tha an ìre seasmhachd air a dhol suas - an-diugh faodaidh tu daemons agus sgriobtaichean fad-ùine a sgrìobhadh ann am PHP gun duilgheadas sam bith. Leig seo le Spiral Scout a dhol nas fhaide: chan eil RoadRunner, eu-coltach ri PHP-FPM, a’ glanadh cuimhne eadar iarrtasan, a bheir buannachd coileanaidh a bharrachd (ged a tha an dòigh-obrach seo a’ dèanamh duilgheadas leis a’ phròiseas leasachaidh). Tha sinn an-dràsta a’ feuchainn a-mach an inneal seo, ach chan eil toraidhean sam bith againn ri roinn fhathast. Gus am bi feitheamh orra nas spòrsail, bidh sinn a’ foillseachadh an eadar-theangachaidh air sanas RoadRunner bho Spiral Scout.

Tha an dòigh-obrach bhon artaigil faisg oirnn: nuair a bhios sinn a ’fuasgladh ar duilgheadasan, bidh sinn cuideachd a’ cleachdadh dòrlach de PHP agus Go, a ’faighinn buannachdan an dà chànan agus gun a bhith a’ trèigsinn aon airson an tè eile.

Enjoy!

Anns na deich bliadhna a dh’ fhalbh, tha sinn air tagraidhean a chruthachadh airson companaidhean bhon liosta Fortune 500, agus airson gnìomhachasan le luchd-èisteachd nach eil nas motha na 500 neach-cleachdaidh. Fad na h-ùine seo, tha na h-innleadairean againn air a bhith a’ leasachadh an backend sa mhòr-chuid ann am PHP. Ach dà bhliadhna air ais, bha buaidh mhòr aig rudeigin chan ann a-mhàin air coileanadh ar toraidhean, ach cuideachd air an scalability - thug sinn a-steach Golang (Go) a-steach don stac teicneòlais againn.

Cha mhòr sa bhad, fhuair sinn a-mach gun do leig Go leinn tagraidhean nas motha a thogail le suas ri leasachaidhean coileanaidh 40x. Leis, bha e comasach dhuinn na toraidhean PHP a th’ againn a leudachadh, gan leasachadh le bhith a’ cothlamadh buannachdan an dà chànan.

Innsidh sinn dhut mar a tha an cothlamadh de Go agus PHP a’ cuideachadh le fuasgladh fhaighinn air fìor dhuilgheadasan leasachaidh agus mar a tha e air tionndadh gu bhith na inneal dhuinn a gheibh cuidhteas cuid de na duilgheadasan co-cheangailte ri Modail php a 'bàsachadh.

An àrainneachd leasachaidh PHP làitheil agad

Mus bruidhinn sinn mu mar as urrainn dhut a chleachdadh Rach gus am modal bàsachadh PHP ath-bheothachadh, leig dhuinn sùil a thoirt air an àrainneachd leasachaidh PHP bunaiteach agad.

Anns a ’mhòr-chuid de chùisean, bidh thu a’ ruith an tagradh agad a ’cleachdadh measgachadh de fhrithealaiche lìn nginx agus frithealaiche PHP-FPM. Bidh a 'chiad fhear a' frithealadh fhaidhlichean statach agus ag ath-stiùireadh iarrtasan sònraichte gu PHP-FPM, fhad 'sa bhios PHP-FPM fhèin a' cur an gnìomh còd PHP. Is dòcha gu bheil thu a’ cleachdadh am measgachadh de Apache agus mod_php nach eil cho mòr-chòrdte. Ach ged a tha e ag obair beagan eadar-dhealaichte, tha na prionnsabalan mar an ceudna.

Bheir sinn sùil air mar a bhios PHP-FPM a’ cur an gnìomh còd tagraidh. Nuair a thig iarrtas a-steach, bidh PHP-FPM a’ tòiseachadh pròiseas cloinne PHP agus a’ dol seachad air mion-fhiosrachadh an iarrtais mar phàirt den stàit aige (_GET, _POST, _SERVER, msaa).

Chan urrainn don stàit atharrachadh nuair a thèid sgriobt PHP a chuir gu bàs, agus mar sin is e an aon dòigh air seata ùr de dhàta cuir a-steach fhaighinn le bhith a’ glanadh cuimhne pròiseas agus ga thòiseachadh a-rithist.

Tha mòran bhuannachdan aig a’ mhodail cur gu bàs seo. Cha leig thu leas cus dragh a bhith agad mu chaitheamh cuimhne, tha a h-uile pròiseas air leth iomallach, agus ma bhios aon dhiubh “a’ bàsachadh ”, thèid ath-chruthachadh gu fèin-ghluasadach agus cha toir e buaidh air a’ chòrr de na pròiseasan. Ach tha eas-bhuannachdan aig an dòigh-obrach seo cuideachd a nochdas nuair a thathar a’ feuchainn ris an tagradh a sgèile.

Eas-bhuannachdan agus neo-èifeachdas àrainneachd PHP cunbhalach

Ma tha thu nad leasaiche PHP proifeasanta, tha fios agad càite an tòisich thu air pròiseact ùr - leis an roghainn frèam. Tha e air a dhèanamh suas de leabharlannan stealladh eisimeileachd, ORM, eadar-theangachaidhean agus teamplaidean. Agus, gu dearbh, faodar a h-uile cuir a-steach neach-cleachdaidh a chuir ann an aon nì (Symfony / HttpFoundation no PSR-7). Tha frèamaichean sgoinneil!

Ach tha a phrìs aig a h-uile dad. Ann am frèam ìre iomairt sam bith, gus iarrtas cleachdaiche sìmplidh a phròiseasadh no faighinn gu stòr-dàta, feumaidh tu co-dhiù dusanan de fhaidhlichean a luchdachadh, grunn chlasaichean a chruthachadh agus grunn rèiteachaidhean a pharsadh. Ach is e an rud as miosa, às deidh dhut gach gnìomh a chrìochnachadh, gum feum thu a h-uile càil ath-shuidheachadh agus tòiseachadh a-rithist: bidh a h-uile còd a thòisich thu dìreach gun fheum, le a chuideachadh cha bhith thu a’ làimhseachadh iarrtas eile tuilleadh. Innsibh seo do phrogramaiche sam bith a bhios a’ sgrìobhadh ann an cànan air choireigin eile, agus chì thu fiamh-ghàire air aodann.

Tha innleadairean PHP air a bhith a’ coimhead airson dòighean air an duilgheadas seo fhuasgladh airson bhliadhnaichean, a’ cleachdadh dòighean luchdachadh leisg ciallach, microframeworks, leabharlannan làn-leasaichte, tasgadan, msaa. (Nòta bhon eadar-theangair: thèid an duilgheadas seo fhuasgladh gu ìre nuair a thig e gun ro-luchdaich ann am PHP 7.4)

Am faod PHP le Go a bhith beò barrachd air aon iarrtas?

Tha e comasach sgriobtaichean PHP a sgrìobhadh a bhios beò nas fhaide na beagan mhionaidean (suas ri uairean no làithean): mar eisimpleir, gnìomhan cron, parsers CSV, luchd-brisidh ciudha. Bidh iad uile ag obair a rèir an aon suidheachadh: bidh iad a’ faighinn air ais gnìomh, ga chur an gnìomh, agus a’ feitheamh ris an ath fhear. Bidh an còd a’ fuireach mar chuimhneachan fad na h-ùine, a’ sàbhaladh milliseconds luachmhor oir tha mòran cheumannan a bharrachd a dhìth gus am frèam agus an tagradh a luchdachadh.

Ach chan eil e furasta sgriobtaichean fad-ùine a leasachadh. Bidh mearachd sam bith a’ marbhadh a’ phròiseis gu tur, tha a bhith a’ lorg aoidion cuimhne na adhbhar dragh, agus chan eil e comasach tuilleadh debugging F5.

Tha an suidheachadh air a thighinn air adhart le sgaoileadh PHP 7: tha neach-cruinneachaidh sgudail earbsach air nochdadh, tha e air fàs nas fhasa mearachdan a làimhseachadh, agus tha leudachadh kernel a-nis dìon-aodion. Fìor, feumaidh innleadairean fhathast a bhith faiceallach le cuimhne agus a bhith mothachail air cùisean stàite ann an còd (a bheil cànan ann as urrainn na rudan sin a leigeil seachad?). Ach, tha nas lugha de rudan iongantach aig PHP 7 dhuinn.

A bheil e comasach am modail de bhith ag obair le sgriobtaichean PHP a tha air a bhith beò o chionn fhada, ga atharrachadh gu gnìomhan nas miosa mar a bhith a’ giullachd iarrtasan HTTP, agus mar sin faighinn cuidhteas an fheum air a h-uile càil a luchdachadh bhon fhìor thoiseach le gach iarrtas?

Gus an duilgheadas seo fhuasgladh, dh'fheumadh sinn an toiseach tagradh frithealaiche a chuir an gnìomh a ghabhadh ri iarrtasan HTTP agus an ath-stiùireadh aon às deidh aon chun neach-obrach PHP gun a bhith ga mharbhadh a h-uile turas.

Bha fios againn gum b ’urrainn dhuinn frithealaiche lìn a sgrìobhadh ann am PHP fìor (PHP-PM) no a’ cleachdadh leudachadh C (Swoole). Agus ged a tha na buannachdan fhèin aig gach dòigh, cha robh an dà roghainn a 'freagairt oirnn - bha sinn ag iarraidh rudeigin a bharrachd. Bha feum againn air barrachd air dìreach frithealaiche lìn - bha sinn an dùil fuasgladh fhaighinn a dh’ fhaodadh sinn a shàbhaladh bho na duilgheadasan co-cheangailte ri “tòiseachadh cruaidh” ann am PHP, a dh’ fhaodadh aig an aon àm atharrachadh agus leudachadh gu furasta airson tagraidhean sònraichte. Is e sin, bha feum againn air frithealaiche tagraidh.

Am faod Go cuideachadh le seo? Bha fios againn gum faodadh e oir tha an cànan a 'cur ri chèile iarrtasan ann an binaries singilte; tha e tar-àrd-ùrlar; a 'cleachdadh a mhodail giullachd co-shìnte fhèin, fìor eireachdail (concurrency) agus leabharlann airson a bhith ag obair le HTTP; agus mu dheireadh, bidh na mìltean de leabharlannan stòr fosgailte agus aonachadh rim faighinn dhuinn.

Duilgheadasan dà chànan prògramaidh a chur còmhla

An toiseach, bha e riatanach co-dhùnadh ciamar a bhios dà iarrtas no barrachd a 'conaltradh ri chèile.

Mar eisimpleir, a 'cleachdadh leabharlann sàr-mhath Alex Palaestras, bha e comasach cuimhne a roinn eadar pròiseasan PHP agus Go (coltach ri mod_php ann an Apache). Ach tha feartan aig an leabharlann seo a chuireas casg air a chleachdadh airson ar duilgheadas fhuasgladh.

Cho-dhùin sinn dòigh-obrach eadar-dhealaichte, nas cumanta a chleachdadh: gus eadar-obrachadh a thogail eadar pròiseasan tro socaidean / pìoban. Tha an dòigh-obrach seo air a bhith earbsach thar nan deicheadan mu dheireadh agus tha e air a dheagh leasachadh aig ìre an t-siostaim obrachaidh.

An toiseach, chruthaich sinn protocol binary sìmplidh airson iomlaid dàta eadar pròiseasan agus làimhseachadh mhearachdan tar-chuir. Anns an fhoirm as sìmplidhe, tha an seòrsa protocol seo coltach ri sreang-lìon с bann-cinn pacaid meud stèidhichte (anns a’ chùis againn 17 bytes), anns a bheil fiosrachadh mun t-seòrsa pacaid, a mheud agus masg binary gus sgrùdadh a dhèanamh air ionracas an dàta.

Air taobh PHP chleachd sinn gnìomh pacaid, agus air an taobh Go, an leabharlann còdachadh / binary.

Bha e coltach dhuinn nach robh aon phròtacal gu leòr - agus chuir sinn ris a’ chomas gairm net / rpc a 'dol gu seirbheisean gu dìreach bho PHP. Nas fhaide air adhart, chuidich seo sinn gu mòr ann an leasachadh, leis gum b’ urrainn dhuinn leabharlannan Go fhilleadh a-steach gu tagraidhean PHP gu furasta. Chithear toradh na h-obrach seo, mar eisimpleir, anns an toradh fosgailte eile againn Goridge.

A’ cuairteachadh ghnìomhan thar grunn luchd-obrach PHP

Às deidh dhuinn an uidheamachd eadar-obrachaidh a chuir an gnìomh, thòisich sinn a’ smaoineachadh air an dòigh as èifeachdaiche air gnìomhan a ghluasad gu pròiseasan PHP. Nuair a thig gnìomh, feumaidh frithealaiche an tagraidh neach-obrach an-asgaidh a thaghadh airson a chuir an gnìomh. Ma thig neach-obrach / pròiseas a-mach le mearachd no “bàs”, gheibh sinn cuidhteas e agus cruthaichidh sinn fear ùr na àite. Agus ma tha an neach-obrach / pròiseas air a chrìochnachadh gu soirbheachail, bidh sinn ga thilleadh chun bhuidheann de luchd-obrach a tha rim faighinn gus gnìomhan a choileanadh.

RoadRunner: Chan eil PHP air a thogail gus bàsachadh, no Golang gu teasairginn

Gus an cruinneachadh de luchd-obrach gnìomhach a stòradh, chleachd sinn sianal buffered, gus luchd-obrach “marbh” ris nach robh dùil a thoirt a-mach às an amar, chuir sinn ris dòigh airson sùil a chumail air mearachdan agus stàitean luchd-obrach.

Mar thoradh air an sin, fhuair sinn frithealaiche PHP ag obair a bha comasach air iarrtasan sam bith a tha air an taisbeanadh ann an cruth binary a ghiullachd.

Gus an tòisich an tagradh againn ag obair mar fhrithealaiche lìn, bha againn ri inbhe PHP earbsach a thaghadh gus iarrtasan HTTP sam bith a bha a’ tighinn a-steach a riochdachadh. Anns a 'chùis againn, tha sinn dìreach cruth-atharraich lìon/http iarrtas bho Rach gu cruth PSR-7gus am bi e co-chòrdail ris a’ mhòr-chuid de na frèaman PHP a tha rim faighinn an-diugh.

Leis gu bheilear den bheachd gu bheil PSR-7 neo-sheasmhach (bhiodh cuid ag ràdh gu teicnigeach nach eil), feumaidh luchd-leasachaidh tagraidhean a sgrìobhadh nach eil a’ dèiligeadh ris an iarrtas mar bhuidheann cruinneil ann am prionnsapal. Tha seo a’ freagairt gu math ris a’ bhun-bheachd air pròiseasan PHP fad-ùine. Bha coltas mar seo air ar buileachadh deireannach, nach deach ainmeachadh fhathast:

RoadRunner: Chan eil PHP air a thogail gus bàsachadh, no Golang gu teasairginn

A’ toirt a-steach RoadRunner - frithealaiche tagraidh PHP àrd-choileanadh

B’ e a’ chiad obair deuchainn againn cùl-taic API, a bhios bho àm gu àm a’ spreadhadh gun dùil (mòran nas trice na an àbhaist). Ged a bha nginx gu leòr anns a’ mhòr-chuid de chùisean, thachair sinn gu cunbhalach ri mearachdan 502 leis nach b’ urrainn dhuinn an siostam a chothromachadh luath gu leòr airson an àrdachadh eallach ris an robh dùil.

Gus am fuasgladh seo a chuir an àite, chleachd sinn a’ chiad fhrithealaiche tagraidh PHP/Go againn tràth ann an 2018. Agus sa bhad fhuair e buaidh iongantach! Chan e a-mhàin gun d ’fhuair sinn cuidhteas mearachd 502 gu tur, ach bha e comasach dhuinn an àireamh de luchd-frithealaidh a lughdachadh dà thrian, a’ sàbhaladh tòrr airgid agus pills ceann goirt dha innleadairean agus manaidsearan toraidh.

Ro mheadhan na bliadhna, bha sinn air ar fuasgladh a leasachadh, air fhoillseachadh air GitHub fo chead MIT agus air ainmeachadh Ruitheadair rathaid, mar sin a 'cur cuideam air a luaths agus èifeachdas iongantach.

Mar as urrainn do RoadRunner do stac leasachaidh a leasachadh

Iarrtas Ruitheadair rathaid leig leinn Middleware net/http air an taobh Go a chleachdadh gus dearbhadh JWT a dhèanamh mus ruig an t-iarrtas PHP, a bharrachd air a bhith a’ làimhseachadh WebSockets agus staid iomlan air feadh na cruinne ann am Prometheus.

Taing don RPC togte, faodaidh tu API leabharlannan Go sam bith fhosgladh airson PHP gun a bhith a’ sgrìobhadh pasgain leudachaidh. Nas cudromaiche, le RoadRunner faodaidh tu frithealaichean ùra neo-HTTP a chleachdadh. Tha eisimpleirean a’ toirt a-steach làimhseachadh làimhseachadh ann am PHP AWS Lambda, a 'cruthachadh luchd-brisidh ciudha earbsach, agus eadhon a' cur ris gRPC ris na tagraidhean againn.

Le cuideachadh bho na coimhearsnachdan PHP and Go, leasaich sinn seasmhachd an fhuasglaidh, àrdaich sinn coileanadh tagraidh suas gu 40 uair ann an cuid de dheuchainnean, leasaichte innealan deasbaid, chuir sinn an gnìomh amalachadh le frèam Symfony, agus chuir sinn taic ri HTTPS, HTTP / 2, plugins, agus PSR-17.

co-dhùnadh

Tha cuid de dhaoine fhathast air an glacadh ann am beachd seann-fhasanta PHP mar chànan slaodach, mì-ghoireasach a-mhàin math airson plugins a sgrìobhadh airson WordPress. Is dòcha gu bheil na daoine sin eadhon ag ràdh gu bheil a leithid de chuingealachadh aig PHP: nuair a dh’ fhàsas an tagradh mòr gu leòr, feumaidh tu cànan nas “aibidh” a thaghadh agus ath-sgrìobhadh a dhèanamh air bunait còd a chaidh a chruinneachadh thar grunn bhliadhnaichean.

Airson seo uile tha mi airson freagairt: smaoinich a-rithist. Tha sinn a’ creidsinn nach cuir thu ach bacadh sam bith air PHP. Faodaidh tu do bheatha gu lèir a chaitheamh a’ gluasad bho aon chànan gu cànan eile, a’ feuchainn ris a’ mhaidseadh foirfe a lorg airson na feumalachdan agad, no faodaidh tu tòiseachadh a’ smaoineachadh air cànanan mar innealan. Is dòcha gur e na lochdan a tha còir ann an cànan mar PHP an adhbhar airson a bhith soirbheachail. Agus ma chuireas tu còmhla e le cànan eile mar Go, cruthaichidh tu toraidhean tòrr nas cumhachdaiche na bhiodh tu cuingealaichte ri bhith a’ cleachdadh aon chànan sam bith.

Às deidh dhuinn a bhith ag obair le dòrlach de Go agus PHP, faodaidh sinn a ràdh gu bheil gaol againn orra. Chan eil sinn an dùil aon ìobairt a dhèanamh airson an tè eile - air an làimh eile, coimheadaidh sinn airson dòighean gus eadhon barrachd luach fhaighinn bhon chruach dhùbailte seo.

UPD: tha sinn a’ cur fàilte air neach-cruthachaidh RoadRunner agus co-ùghdar an artaigil thùsail - Lachesis

Source: www.habr.com

Cuir beachd ann