RoadRunner: PHP ko kọ lati ku, tabi Golang si igbala

RoadRunner: PHP ko kọ lati ku, tabi Golang si igbala

Hey Habr! A ni o wa lọwọ ni Badoo ṣiṣẹ lori iṣẹ PHP, niwọn bi a ti ni eto ti o tobi pupọ ni ede yii ati ọran iṣẹ jẹ ọrọ fifipamọ owo. Die e sii ju ọdun mẹwa sẹhin, a ṣẹda PHP-FPM fun eyi, eyiti o jẹ akọkọ ti awọn abulẹ fun PHP, ati lẹhinna wọ pinpin osise.

Ni awọn ọdun aipẹ, PHP ti ni ilọsiwaju nla: agbasọ idoti ti ni ilọsiwaju, ipele iduroṣinṣin ti pọ si - loni o le kọ awọn daemons ati awọn iwe afọwọkọ gigun ni PHP laisi awọn iṣoro eyikeyi. Eyi gba laaye Spiral Scout lati lọ siwaju: RoadRunner, ko dabi PHP-FPM, ko sọ iranti di mimọ laarin awọn ibeere, eyiti o funni ni ere iṣẹ afikun (botilẹjẹpe ọna yii ṣe idiju ilana idagbasoke). A n ṣe idanwo lọwọlọwọ pẹlu ọpa yii, ṣugbọn a ko ni awọn abajade eyikeyi sibẹsibẹ lati pin. Lati jẹ ki nduro fun wọn ni igbadun diẹ sii, a ṣe atẹjade itumọ ti ikede RoadRunner lati Spiral Scout.

Ọna lati inu nkan naa sunmọ wa: nigbati a ba yanju awọn iṣoro wa, a tun lo ọpọlọpọ igba ti PHP ati Go, gbigba awọn anfani ti awọn ede mejeeji ati pe ko kọ ọkan silẹ ni ojurere ti ekeji.

Gbadun!

Ni ọdun mẹwa to koja, a ti ṣẹda awọn ohun elo fun awọn ile-iṣẹ lati inu akojọ Fortune 500, ati fun awọn iṣowo pẹlu olugbo ti ko ju awọn olumulo 500 lọ. Ni gbogbo akoko yii, awọn onimọ-ẹrọ wa ti n ṣe idagbasoke ẹhin ni pataki ni PHP. Ṣugbọn ni ọdun meji sẹyin, nkan kan ni ipa nla kii ṣe lori iṣẹ awọn ọja wa nikan, ṣugbọn tun lori iwọn wọn - a ṣafihan Golang (Go) sinu akopọ imọ-ẹrọ wa.

Fere lẹsẹkẹsẹ, a ṣe awari pe Go gba wa laaye lati kọ awọn ohun elo nla pẹlu awọn ilọsiwaju iṣẹ ṣiṣe 40x. Pẹlu rẹ, a ni anfani lati faagun awọn ọja PHP ti o wa tẹlẹ, ni ilọsiwaju wọn nipa apapọ awọn anfani ti awọn ede mejeeji.

A yoo sọ fun ọ bi apapọ Go ati PHP ṣe iranlọwọ lati yanju awọn iṣoro idagbasoke gidi ati bii o ti yipada si ohun elo fun wa ti o le yọ diẹ ninu awọn iṣoro ti o ni nkan ṣe pẹlu PHP ku awoṣe.

Ayika idagbasoke PHP ojoojumọ rẹ

Ṣaaju ki a to sọrọ nipa bii o ṣe le lo Go lati sọji awoṣe ti o ku PHP, jẹ ki a wo agbegbe idagbasoke PHP aiyipada rẹ.

Ni ọpọlọpọ igba, o nṣiṣẹ ohun elo rẹ nipa lilo apapo olupin wẹẹbu nginx ati olupin PHP-FPM. Ogbologbo naa n ṣe iranṣẹ awọn faili aimi ati ṣe atunṣe awọn ibeere kan pato si PHP-FPM, lakoko ti PHP-FPM funrararẹ ṣe koodu PHP. O le jẹ lilo apapọ olokiki ti Apache ati mod_php. Ṣugbọn biotilejepe o ṣiṣẹ ni iyatọ diẹ, awọn ilana jẹ kanna.

Jẹ ki a wo bii PHP-FPM ṣe nṣiṣẹ koodu ohun elo. Nigbati ibeere kan ba wọle, PHP-FPM bẹrẹ ilana ọmọ PHP kan ati pe o kọja awọn alaye ti ibeere naa gẹgẹbi apakan ti ipinlẹ rẹ (_GET, _POST, _SERVER, ati bẹbẹ lọ).

Ipinle ko le yipada lakoko ipaniyan ti iwe afọwọkọ PHP kan, nitorinaa ọna kan ṣoṣo lati gba eto tuntun ti data igbewọle ni nipa imukuro iranti ilana ati ipilẹṣẹ lẹẹkansii.

Awoṣe ipaniyan yii ni ọpọlọpọ awọn anfani. O ko ni lati ṣe aibalẹ pupọ nipa lilo iranti, gbogbo awọn ilana ti ya sọtọ patapata, ati pe ti ọkan ninu wọn ba “ku”, yoo ṣe atunṣe laifọwọyi ati pe kii yoo ni ipa lori awọn ilana iyokù. Ṣugbọn ọna yii tun ni awọn alailanfani ti o han nigbati o n gbiyanju lati ṣe iwọn ohun elo naa.

Awọn alailanfani ati ailagbara ti Ayika PHP deede

Ti o ba jẹ olupilẹṣẹ PHP ọjọgbọn, lẹhinna o mọ ibiti o le bẹrẹ iṣẹ akanṣe tuntun - pẹlu yiyan ilana kan. O ni awọn ile ikawe abẹrẹ ti o gbẹkẹle, Awọn ORM, awọn itumọ ati awọn awoṣe. Ati pe, dajudaju, gbogbo igbewọle olumulo le ni irọrun fi sinu ohun kan (Symfony/HttpFoundation tabi PSR-7). Frameworks ni itura!

Ṣugbọn ohun gbogbo ni idiyele rẹ. Ni eyikeyi ilana-ipele ti ile-iṣẹ, lati ṣe ilana ibeere olumulo ti o rọrun tabi iraye si ibi ipamọ data, iwọ yoo ni lati kojọpọ o kere ju awọn dosinni ti awọn faili, ṣẹda awọn kilasi lọpọlọpọ ki o sọ awọn atunto pupọ. Ṣugbọn ohun ti o buru julọ ni pe lẹhin ipari iṣẹ-ṣiṣe kọọkan, iwọ yoo nilo lati tunto ohun gbogbo ki o bẹrẹ lẹẹkansi: gbogbo koodu ti o ṣẹṣẹ bẹrẹ di asan, pẹlu iranlọwọ rẹ iwọ kii yoo ṣe ilana ibeere miiran mọ. Sọ eyi fun eyikeyi pirogirama ti o kọ ni diẹ ninu awọn ede miiran, ati awọn ti o yoo ri bewildered lori oju rẹ.

Awọn onimọ-ẹrọ PHP ti n wa awọn ọna lati yanju iṣoro yii fun awọn ọdun, ni lilo awọn ilana ikojọpọ ọlẹ ti o ni oye, microframeworks, awọn ile-ikawe iṣapeye, kaṣe, bbl Ṣugbọn ni ipari, o tun ni lati tun gbogbo ohun elo naa pada ki o bẹrẹ lẹẹkansi, lẹẹkansi ati lẹẹkansi. (Akiyesi onitumọ: iṣoro yii yoo yanju ni apakan pẹlu dide ti ṣaja ninu PHP 7.4)

Njẹ PHP pẹlu Go le ye diẹ sii ju ibeere kan lọ?

O ṣee ṣe lati kọ awọn iwe afọwọkọ PHP ti o gun ju iṣẹju diẹ (to awọn wakati tabi awọn ọjọ): fun apẹẹrẹ, awọn iṣẹ-ṣiṣe cron, awọn parsers CSV, awọn fifọ isinyi. Gbogbo wọn ṣiṣẹ ni ibamu si oju iṣẹlẹ kanna: wọn gba iṣẹ kan pada, ṣe e, ati duro de ọkan ti n bọ. Koodu naa wa ni iranti ni gbogbo igba, fifipamọ awọn milliseconds iyebiye bi ọpọlọpọ awọn igbesẹ afikun wa ti o nilo lati fifuye ilana ati ohun elo.

Ṣugbọn idagbasoke awọn iwe afọwọkọ gigun ko rọrun. Eyikeyi aṣiṣe pa ilana naa patapata, ṣiṣe ayẹwo awọn n jo iranti jẹ ibinu, ati aṣiṣe F5 ko ṣee ṣe mọ.

Ipo naa ti ni ilọsiwaju pẹlu itusilẹ ti PHP 7: agbasọ idoti ti o gbẹkẹle ti han, o ti rọrun lati mu awọn aṣiṣe mu, ati awọn amugbooro kernel jẹ ẹri jijo bayi. Otitọ, awọn onise-ẹrọ tun nilo lati ṣọra pẹlu iranti ati ki o ṣe akiyesi awọn oran ipinle ni koodu (ede kan wa ti o le foju awọn nkan wọnyi?). Sibẹsibẹ, PHP 7 ni awọn iyanilẹnu diẹ ninu itaja fun wa.

Ṣe o ṣee ṣe lati mu awoṣe ti ṣiṣẹ pẹlu awọn iwe afọwọkọ PHP ti o gun pipẹ, ṣe deede si awọn iṣẹ ṣiṣe bintin diẹ sii bii ṣiṣe awọn ibeere HTTP, ati nitorinaa yọkuro iwulo lati fifuye ohun gbogbo lati ibere pẹlu ibeere kọọkan?

Lati yanju iṣoro yii, a nilo akọkọ lati ṣe imuse ohun elo olupin ti o le gba awọn ibeere HTTP ati tun-dari wọn lọkọọkan si oṣiṣẹ PHP laisi pipa ni gbogbo igba.

A mọ pe a le kọ olupin wẹẹbu kan ni PHP mimọ (PHP-PM) tabi lilo itẹsiwaju C (Swoole). Ati pe botilẹjẹpe ọna kọọkan ni awọn iteriba tirẹ, awọn aṣayan mejeeji ko baamu wa - a fẹ nkankan diẹ sii. A nilo diẹ sii ju olupin wẹẹbu kan lọ - a nireti lati gba ojutu kan ti o le gba wa lọwọ awọn iṣoro ti o nii ṣe pẹlu “ibẹrẹ lile” ni PHP, eyiti o le ni irọrun ni irọrun ati faagun fun awọn ohun elo kan pato. Iyẹn ni, a nilo olupin ohun elo kan.

Le Lọ iranlọwọ pẹlu yi? A mọ pe o le nitori ede ṣe akopọ awọn ohun elo sinu awọn alakomeji ẹyọkan; o jẹ agbelebu-Syeed; nlo awọn oniwe-ara, gan yangan, ni afiwe processing awoṣe (concurrency) ati ki o kan ìkàwé fun ṣiṣẹ pẹlu HTTP; ati nikẹhin, ẹgbẹẹgbẹrun awọn ile-ikawe ṣiṣi-orisun ati awọn iṣọpọ yoo wa fun wa.

Awọn iṣoro ti Apapọ Awọn ede siseto Meji

Ni akọkọ, o jẹ dandan lati pinnu bi awọn ohun elo meji tabi diẹ sii yoo ṣe ibasọrọ pẹlu ara wọn.

Fun apẹẹrẹ, lilo o tayọ ìkàwé Alex Palaestras, o ṣee ṣe lati pin iranti laarin awọn ilana PHP ati Go (bii mod_php ni Apache). Ṣugbọn ile-ikawe yii ni awọn ẹya ti o fi opin si lilo rẹ lati yanju iṣoro wa.

A pinnu lati lo ọna ti o yatọ, ti o wọpọ julọ: lati kọ ibaraenisepo laarin awọn ilana nipasẹ awọn sockets / pipelines. Ọna yii ti fihan lati jẹ igbẹkẹle ni awọn ewadun to kọja ati pe o ti ni iṣapeye daradara ni ipele eto iṣẹ.

Lati bẹrẹ pẹlu, a ṣẹda ilana alakomeji ti o rọrun fun paṣipaarọ data laarin awọn ilana ati mimu awọn aṣiṣe gbigbe. Ni ọna ti o rọrun julọ, iru ilana yii jẹ iru si okun nẹtiwọki с ti o wa titi iwọn soso akọsori (ninu ọran wa 17 awọn baiti), eyiti o ni alaye nipa iru apo, iwọn rẹ ati iboju-boju alakomeji lati ṣayẹwo iduroṣinṣin data naa.

Ni ẹgbẹ PHP ti a lo pack iṣẹ, ati lori Go ẹgbẹ, awọn ìkàwé fifi koodu / alakomeji.

O dabi fun wa pe ilana kan ko to - ati pe a ṣafikun agbara lati pe net/rpc lọ awọn iṣẹ taara lati PHP. Nigbamii, eyi ṣe iranlọwọ fun wa pupọ ni idagbasoke, niwọn igba ti a le ni irọrun ṣepọ awọn ile-ikawe Go sinu awọn ohun elo PHP. Abajade iṣẹ yii ni a le rii, fun apẹẹrẹ, ninu ọja orisun-ìmọ wa miiran Goridge.

Pinpin awọn iṣẹ-ṣiṣe kọja ọpọ awọn oṣiṣẹ PHP

Lẹhin imuse ẹrọ ibaraenisepo, a bẹrẹ lati ronu nipa ọna ti o munadoko julọ lati gbe awọn iṣẹ ṣiṣe si awọn ilana PHP. Nigbati iṣẹ kan ba de, olupin ohun elo gbọdọ yan oṣiṣẹ ọfẹ lati ṣiṣẹ. Ti oṣiṣẹ / ilana ba jade pẹlu aṣiṣe kan tabi “ku”, a yọkuro kuro ki a ṣẹda tuntun lati rọpo rẹ. Ati pe ti oṣiṣẹ / ilana ti pari ni aṣeyọri, a da pada si adagun ti awọn oṣiṣẹ ti o wa lati ṣe awọn iṣẹ ṣiṣe.

RoadRunner: PHP ko kọ lati ku, tabi Golang si igbala

Lati tọju adagun ti awọn oṣiṣẹ ti nṣiṣe lọwọ, a lo buffered ikanni, Lati yọ awọn oṣiṣẹ “oku” lairotẹlẹ kuro ninu adagun, a ṣafikun ẹrọ kan fun awọn aṣiṣe ipasẹ ati awọn ipinlẹ ti awọn oṣiṣẹ.

Bi abajade, a ni olupin PHP ti n ṣiṣẹ ti o lagbara lati ṣiṣẹ eyikeyi awọn ibeere ti a gbekalẹ ni fọọmu alakomeji.

Ni ibere fun ohun elo wa lati bẹrẹ ṣiṣẹ bi olupin wẹẹbu, a ni lati yan boṣewa PHP ti o gbẹkẹle lati ṣe aṣoju eyikeyi awọn ibeere HTTP ti nwọle. Ninu ọran wa, a kan yipada net/http ìbéèrè lati Lọ si ọna kika PSR-7ki o jẹ ibamu pẹlu pupọ julọ awọn ilana PHP ti o wa loni.

Nitoripe PSR-7 ni a gba pe a ko yipada (diẹ ninu awọn yoo sọ ni imọ-ẹrọ kii ṣe bẹ), awọn olupilẹṣẹ ni lati kọ awọn ohun elo ti ko tọju ibeere naa bi nkan agbaye ni ipilẹ. Eyi ni ibamu daradara pẹlu imọran ti awọn ilana PHP gigun. Iṣe ikẹhin wa, eyiti ko tii darukọ rẹ, dabi eyi:

RoadRunner: PHP ko kọ lati ku, tabi Golang si igbala

Iṣafihan RoadRunner - iṣẹ giga olupin ohun elo PHP

Iṣẹ-ṣiṣe idanwo akọkọ wa jẹ ẹhin API kan, eyiti o nwaye lorekore ni awọn ibeere airotẹlẹ (pupọ nigbagbogbo ju igbagbogbo lọ). Botilẹjẹpe nginx to ni ọpọlọpọ awọn ọran, a pade nigbagbogbo awọn aṣiṣe 502 nitori a ko le dọgbadọgba eto ni iyara to fun ilosoke ti a nireti ni fifuye.

Lati rọpo ojutu yii, a gbe olupin ohun elo PHP/Go akọkọ wa ni ibẹrẹ ọdun 2018. Ati lẹsẹkẹsẹ ni ipa iyalẹnu! Kii ṣe nikan ni a yọkuro aṣiṣe 502 patapata, ṣugbọn a ni anfani lati dinku nọmba awọn olupin nipasẹ idamẹta meji, fifipamọ ọpọlọpọ owo ati awọn oogun orififo fun awọn onimọ-ẹrọ ati awọn alakoso ọja.

Ni aarin ọdun, a ti ni ilọsiwaju ojutu wa, ṣe atẹjade lori GitHub labẹ iwe-aṣẹ MIT a fun lorukọ rẹ Rinner opopona, bayi emphasizing awọn oniwe-alaragbayida iyara ati ṣiṣe.

Bawo ni RoadRunner le ṣe ilọsiwaju akopọ idagbasoke rẹ

ohun elo Rinner opopona gba wa laaye lati lo Middleware net/http lori Go ẹgbẹ lati ṣe ijẹrisi JWT ṣaaju ki ibeere naa de PHP, bakannaa mu WebSockets ati ipinlẹ apapọ ni agbaye ni Prometheus.

Ṣeun si RPC ti a ṣe sinu rẹ, o le ṣii API ti awọn ile-ikawe Go eyikeyi fun PHP laisi kikọ awọn murasilẹ itẹsiwaju. Ni pataki julọ, pẹlu RoadRunner o le ran awọn olupin tuntun ti kii ṣe HTTP ṣiṣẹ. Awọn apẹẹrẹ pẹlu awọn olutọju nṣiṣẹ ni PHP AWS Lambda, ṣiṣẹda gbẹkẹle isinyi breakers, ati paapa fifi gRPC si awọn ohun elo wa.

Pẹlu iranlọwọ ti awọn agbegbe PHP ati Go, a ṣe ilọsiwaju iduroṣinṣin ti ojutu, iṣẹ ṣiṣe ohun elo ti o pọ si awọn akoko 40 ni diẹ ninu awọn idanwo, ilọsiwaju awọn irinṣẹ n ṣatunṣe aṣiṣe, imuse imuse pẹlu ilana Symfony, ati atilẹyin afikun fun HTTPS, HTTP / 2, afikun, ati PSR-17.

ipari

Diẹ ninu awọn eniyan ti wa ni ṣi mu ninu awọn outmoded iro ti PHP bi a lọra, unwieldy ede nikan dara fun kikọ afikun fun WordPress. Awọn eniyan wọnyi le paapaa sọ pe PHP ni iru aropin kan: nigbati ohun elo ba tobi to, o ni lati yan ede “ogbo” diẹ sii ki o tun kọ ipilẹ koodu ti a kojọpọ ni ọpọlọpọ ọdun.

Si gbogbo eyi Mo fẹ lati dahun: ro lẹẹkansi. A gbagbọ pe iwọ nikan ṣeto awọn ihamọ eyikeyi fun PHP. O le lo gbogbo igbesi aye rẹ lati yipada lati ede kan si ekeji, gbiyanju lati wa ibaamu pipe fun awọn iwulo rẹ, tabi o le bẹrẹ lati ronu awọn ede bi awọn irinṣẹ. Awọn abawọn ti o yẹ fun ede bi PHP le jẹ idi fun aṣeyọri rẹ. Ati pe ti o ba darapọ mọ ede miiran bii Go, lẹhinna o yoo ṣẹda awọn ọja ti o lagbara pupọ ju ti o ba ni opin si lilo eyikeyi ede kan.

Lehin ti o ti ṣiṣẹ pẹlu opo Go ati PHP, a le sọ pe a nifẹ wọn. A ko gbero lati rubọ ọkan fun ekeji - ni ilodi si, a yoo wa awọn ọna lati ni iye diẹ sii paapaa lati akopọ meji yii.

UPD: a ṣe itẹwọgba ẹlẹda ti RoadRunner ati alakọwe-iwe ti nkan atilẹba - Lachesis

orisun: www.habr.com

Fi ọrọìwòye kun