I-RoadRunner: I-PHP ayakhiwe ukuba ife, okanye i-Golang ukuhlangula

I-RoadRunner: I-PHP ayakhiwe ukuba ife, okanye i-Golang ukuhlangula

Molo, Habr! Sisebenza eBadoo ukusebenza ekusebenzeni kwe-PHP, ekubeni sinenkqubo enkulu ngokwaneleyo kolu lwimi kwaye umba wentsebenzo ngumbandela wokulondoloza imali. Ngaphezu kweminyaka elishumi edlulileyo, senze i-PHP-FPM kule nto, eyayiqala yayiyi-patches ye-PHP, kwaye kamva yaba yinxalenye yokusasazwa ngokusemthethweni.

Kwiminyaka yakutshanje, i-PHP yenze inkqubela phambili enkulu: umqokeleli wenkunkuma uye waphucula, izinga lokuzinza liye landa - namhlanje ungabhala iidaemon kunye nemibhalo ehlala ixesha elide kwi-PHP ngaphandle kweengxaki. Oku kwavumela i-Spiral Scout ukuba iqhube phambili: I-RoadRunner, ngokungafani ne-PHP-FPM, ayicoci imemori phakathi kwezicelo, enika izibonelelo zokusebenza ezongezelelweyo (nangona le ndlela idibanisa inkqubo yophuhliso). Ngoku senza umfuniselo ngesi sixhobo, kodwa asinazo iziphumo zokwabelana okwangoku. Ukwenza kube mnandi ukubalinda, Sipapasha inguqulelo yesaziso se-RoadRunner esivela kwi-Spiral Scout.

Indlela esuka kwinqaku isondele kuthi: xa sisombulula iingxaki zethu, sihlala sisebenzisa indibaniselwano ye-PHP kunye ne-Go, sifumana izibonelelo zazo zombini iilwimi kwaye singanikezeli enye ngenxa yolunye.

Konwabele!

Kule minyaka ilishumi idlulileyo, senze izicelo zeenkampani ezikolu luhlu Fortune 500, kunye namashishini anabaphulaphuli abangekho ngaphezulu kwama-500 abasebenzisi. Ngalo lonke eli xesha, iinjineli zethu zaphuhlisa i-backend ikakhulu kwi-PHP. Kodwa kwiminyaka emibini edlulileyo, kukho into eyenza impembelelo enkulu kungekuphela nje ekusebenzeni kweemveliso zethu, kodwa nakwi-scalability yazo - sazisa i-Golang (Hamba) kwisitaki sethu sobugcisa.

Phantse kwangoko, safumanisa ukuba iGo isivumele ukuba sakhe usetyenziso olukhulu oluya kuthi ga kwi-40x yokusebenza ngokukhawuleza. Ngayo, sakwazi ukwandisa iimveliso ezikhoyo ezibhalwe kwi-PHP, siziphucule ngokudibanisa iingenelo zeelwimi zombini.

Siza kukuxelela indlela indibaniselwano ye-Go kunye ne-PHP inceda ngayo ekusombululeni iingxaki zophuhliso lokwenyani kunye nendlela ethe yajika yaba sisixhobo sethu esinokususa ezinye zeengxaki ezinxulumene nazo. imodeli yokufa ye-PHP.

Imeko yakho yemihla ngemihla yoPhuhliso lwe-PHP

Phambi kokuba sithethe ngendlela onokuyisebenzisa ngayo i-Go ukuvuselela imodeli efayo ye-PHP, makhe sijonge kwindawo yakho esemgangathweni yophuhliso lwe-PHP.

Kwiimeko ezininzi, usebenzisa usetyenziso usebenzisa indibaniselwano ye-nginx iseva yewebhu kunye neseva ye-PHP-FPM. Eyokuqala ikhonza iifayile ezimileyo kwaye iphinda iqondise izicelo ezithile kwi-PHP-FPM, kwaye i-PHP-FPM ngokwayo yenza ikhowudi ye-PHP. Mhlawumbi usebenzisa indibaniselwano engaziwayo kakhulu esuka kwi-Apache kunye ne-mod_php. Kodwa nangona isebenza ngokwahlukileyo kancinci, imigaqo iyafana.

Makhe sijonge indlela i-PHP-FPM eyenza ngayo ikhowudi yesicelo. Xa isicelo sifika, i-PHP-FPM iqalisa inkqubo ye-PHP yomntwana ize igqithise iinkcukacha zesicelo njengenxalenye yemeko yayo (_GET, _POST, _SERVER, njl.).

Umbuso awukwazi ukutshintsha ngexesha lokwenziwa kweskripthi se-PHP, ngoko kukho indlela enye kuphela yokufumana isethi entsha yedatha yokufaka: ngokucima imemori yenkqubo kunye nokuphinda uyiqalise.

Le modeli yokuphumeza ineenzuzo ezininzi. Awunakukhathazeka kakhulu malunga nokusetyenziswa kwememori, zonke iinkqubo zizodwa ngokupheleleyo, kwaye ukuba enye yazo iyafa, iya kuphinda yenziwe ngokuzenzekelayo ngaphandle kokuchaphazela ezinye iinkqubo. Kodwa le ndlela ikwanazo nezingeloncedo ezivelayo xa uzama ukukala usetyenziso.

Ukungalungi kunye nokungasebenzi kakuhle kwendawo ye-PHP eqhelekileyo

Ukuba ubandakanyeka kuphuhliso lobuchwephesha kwi-PHP, ngoko uyazi ukuba ungaqala phi iprojekthi entsha - ngokukhetha isakhelo. Iqulathe amathala eencwadi okutofwa kokuxhomekeka, iiORM, iinguqulelo kunye neetemplates. Kwaye kunjalo, lonke igalelo lomsebenzisi linokufakwa ngokulula kwinto enye (Symfony/HttpFoundation okanye PSR-7). Izakhelo zipholile!

Kodwa yonke into inexabiso layo. Kuso nasiphi na isakhelo somgangatho weshishini, ukwenza isicelo esilula somsebenzisi okanye ukufikelela kwisiseko sedatha, kuya kufuneka ulayishe ubuncinci iifayile ezininzi, udale iiklasi ezininzi kwaye ucazulule ulungelelwaniso oluninzi. Kodwa eyona nto imbi kakhulu kukuba emva kokugqiba umsebenzi ngamnye uya kufuna ukuseta kwakhona yonke into kwaye uqale kwakhona: yonke ikhowudi osanda kuyiqala iba yinto engenamsebenzi, ngoncedo lwayo awusayi kuphinda usebenze esinye isicelo. Xelela oku nawuphi na umdwelisi obhala ngalo naluphi na olunye ulwimi, kwaye uya kubona ukudideka ebusweni bakhe.

Iinjineli ze-PHP zichithe iminyaka zikhangela iindlela zokusombulula le ngxaki, zisebenzisa ubuchule obukrelekrele bokulayisha ubuvila, ii-microframeworks, iilayibrari eziphuculweyo, ii-cache, njl. (Inqaku lomguquli: le ngxaki iya kusonjululwa ngokuyinxenye ngokufika kwe layisha kwangaphambili kwi-PHP 7.4)

Ngaba i-PHP ene-Go ingasinda ngaphezu kwesicelo esinye?

Kunokwenzeka ukuba ubhale izikripthi ze-PHP eziza kuhlala ixesha elide kunemizuzu embalwa (ukuya kwiiyure okanye iintsuku): umzekelo, imisebenzi ye-cron, i-CSV parsers, i-queue busters. Bonke basebenza ngokwemeko efanayo: bafumana umsebenzi, bawenze, kwaye balinde olandelayo. Ikhowudi ihlala kwimemori, igcina i-millisecond exabisekileyo njengoko kufuneka amanyathelo amaninzi ongezelelweyo ukulayisha isakhelo kunye nesicelo.

Kodwa ukuphuhlisa izikripthi ezihlala ixesha elide akulula kangako. Nayiphi na impazamo ibulala ngokupheleleyo inkqubo, ukufumanisa ukuvuza kwememori kuyakuphambana, kwaye awusakwazi ukusebenzisa i-F5 debugging.

Imeko iphuculwe ngokukhululwa kwe-PHP 7: umqokeleli wenkunkuma othembekileyo uvele, kube lula ukuphatha iimpazamo, kwaye ukwandiswa kwe-kernel ngoku kukhuselwe ekuvuzeni. Enyanisweni, iinjineli zisafuneka zilumke ngememori kwaye ziqaphele imiba yelizwe kwikhowudi (ngaba kukho ulwimi apho singenakukhathazeka ngezi zinto?). Kwaye okwangoku, kwi-PHP 7, silindelwe yimimangaliso embalwa.

Ngaba kuyenzeka ukuba uthathe imodeli yokusebenza ngemibhalo ye-PHP ehlala ixesha elide, uyilungelelanise kwimisebenzi engabalulekanga njengokuqhubekekisa izicelo ze-HTTP, kwaye ngokwenjenjalo uphelise isidingo sokulayisha yonke into ukusuka ekuqaleni kwisicelo ngasinye?

Ukusombulula le ngxaki, sidinga kuqala ukuphumeza usetyenziso lweseva olunokwamkela izicelo zeHTTP kwaye sizithumele nganye nganye kumsebenzi wePHP ngaphandle kokuyibulala ngalo lonke ixesha.

Sasisazi ukuba sinokubhala umncedisi wewebhu kwi-PHP ecocekileyo (PHP-PM) okanye usebenzisa i-C extension (Swoole). Kwaye nangona indlela nganye inokufaneleka kwayo, zombini iinketho azizange zisifanele - besifuna enye into. Sasifuna okungaphezulu nje komncedisi wewebhu - sasinethemba lokufumana isisombululo esinokusisindisa kwiingxaki ezinxulumene "nokuqala nzima" kwi-PHP, enokuthi kwangaxeshanye ilungiswe ngokulula kwaye yandiswe kwizicelo ezithile. Oko kukuthi, besidinga iseva yesicelo.

Ungaya kunceda ngale nto? Besiyazi ukuba inokwenzeka kuba ulwimi luqokelela izicelo zibe ngamaqela amabini; liqonga elinqamlezileyo; isebenzisa eyakhe, intle kakhulu, imodeli yokusetyenzwa ngokunxuseneyo (concurrency) kunye nethala leencwadi lokusebenza ngeHTTP; kwaye okokugqibela, amawaka ethala leencwadi elivulelekileyo kunye nodibaniso luya kufumaneka kuthi.

Ubunzima bokudibanisa iilwimi ezimbini zokucwangcisa

Inyathelo lokuqala yaba kukufumanisa indlela izicelo ezimbini okanye ngaphezulu ezaziya kunxibelelana ngayo.

Umzekelo, ukusebenzisa ithala leencwadi elimangalisayo U-Alex Palaestras unokuphumeza ukwabelana ngememori phakathi kwe-PHP kunye neenkqubo ze-Go (ezifana ne-mod_php kwi-Apache). Kodwa eli thala leencwadi lineempawu ezinciphisa ukusetyenziswa kwalo ekucombululeni ingxaki yethu.

Sagqiba ekubeni sisebenzise enye, indlela eqhelekileyo, indlela: ukwakha intsebenziswano phakathi kweenkqubo ngokusebenzisa iisokethi/imibhobho. Le ndlela ibonakalise ukuthembeka kwayo kumashumi eminyaka adlulileyo kwaye iphuculwe kakuhle kwinqanaba lenkqubo yokusebenza.

Ukuqala, senze iprotocol elula yokutshintshiselana ngedatha phakathi kweenkqubo kunye nokuphatha iimpazamo zothumelo. Ngeyona ndlela ilula, olu hlobo lweprotocol lufana ne umtya womnatha с Isihloko sepakethe yobungakanani obusisigxina (kwimeko yethu i-17 bytes), equlethe ulwazi malunga nohlobo lwepakethi, ubungakanani bayo kunye nemaski yebhinari ukujonga ingqibelelo yedatha.

Kwicala le-PHP sisebenzise umsebenzi wokupakisha, kwaye kwicala lokuhamba - ithala leencwadi i-encoding/binary.

Kwakubonakala ngathi iprotocol enye ayanelanga- ke songeze ukukwazi ukufowuna Yiya kwiinkonzo net/rpc ngqo kwi-PHP. Oku kwasinceda kakhulu kamva kuphuhliso, njengoko sinokudibanisa ngokulula iilayibrari zeGo kwizicelo ze-PHP. Isiphumo salo msebenzi sinokubonwa, umzekelo, kwenye imveliso yethu yomthombo ovulekileyo IGoriji.

Ukusasaza imisebenzi kubasebenzi abaninzi be-PHP

Emva kokuphumeza inkqubo yokunxibelelana, saqala ukucinga ngendlela yokudlulisela imisebenzi kwiinkqubo zePHP. Xa umsebenzi ufika, umncedisi wesicelo kufuneka akhethe umsebenzi okhululekileyo ukuwugqiba. Ukuba umsebenzi/inkqubo iphela ngempazamo okanye β€œuyafa,” siyayisusa kwaye senze entsha ukuyibuyisela endaweni yayo. Kwaye ukuba umsebenzi / inkqubo igqityiwe ngempumelelo, siyibuyisela kwiqela labasebenzi elikhoyo ukwenza imisebenzi.

I-RoadRunner: I-PHP ayakhiwe ukuba ife, okanye i-Golang ukuhlangula

Ukugcina ichibi labasebenzi abasebenzayo sasisebenzisa umjelo ogciniweyo, ukususa ngokungalindelekanga abasebenzi "abafileyo" echibini, songeze indlela yokulandelela iimpazamo kunye nabasebenzi.

Ngenxa yoko, sifumene iseva esebenzayo ye-PHP ekwaziyo ukuqhubekekisa naziphi na izicelo ezinikezelwe kwifomu yokubini.

Ukuze isicelo sethu sisebenze njengomncedisi wewebhu, kwafuneka sikhethe umgangatho othembekileyo we-PHP ukumela naziphi na izicelo ze-HTTP ezingenayo. Kwimeko yethu thina nje guqula isicelo se-net/http ukusuka kwi-Go ukuya kwifomati PSR-7ukuze ihambelane nezakhelo ezininzi ze-PHP ezikhoyo namhlanje.

Ngenxa yokuba i-PSR-7 ithathwa njengengaguqukiyo (abanye bangatsho ngokobuchwepheshe ayisiyiyo), abaphuhlisi kufuneka babhale izicelo ezingasiphathiyo isicelo njengeziko lehlabathi. Oku kuhambelana kakuhle nombono weenkqubo ze-PHP yexesha elide. Ukuphunyezwa kwethu kokugqibela, ebekungekabizwa ngegama, kujongeka ngolu hlobo:

I-RoadRunner: I-PHP ayakhiwe ukuba ife, okanye i-Golang ukuhlangula

Ukwazisa i-RoadRunner - umncedisi wesicelo ophezulu we-PHP

Umsebenzi wethu wokuqala wovavanyo yayiyi-API backend, eyayisoloko ifumana ukugqabhuka kwezicelo okungalindelekanga (kaninzi kaninzi kunesiqhelo). Nangona i-nginx yayanele kwiimeko ezininzi, sasihlala sidibana neempazamo ze-502 ngenxa yokuba asikwazanga ukulinganisa inkqubo ngokukhawuleza ngokwaneleyo ukunyuka okulindelwe komthwalo.

Ukutshintsha esi sisombululo, sisebenzise iseva yethu yokuqala ye-PHP/Go ekuqaleni kuka-2018. Kwaye ngoko nangoko safumana umphumo ongakholelekiyo! Asizange nje silahle ngokupheleleyo impazamo ye-502, kodwa sakwazi ukunciphisa inani lamaseva ngamabini kwisithathu, ukugcina imali eninzi kunye neentloko zeenjineli kunye nabaphathi beemveliso.

Phakathi enyakeni, sasigqibelele isisombululo sethu, sayipapasha kwi-GitHub phantsi kwelayisenisi ye-MIT, kwaye siyibiza. Indlela yendlela, ngaloo ndlela igxininisa isantya esimangalisayo kunye nokusebenza kakuhle.

Indlela i-RoadRunner inokuphucula ngayo isitaki sakho soPhuhliso

Isicelo Indlela yendlela Isivumele ukuba sisebenzise i-Middleware net/http kwicala lokuya ukwenza ungqinisiso lwe-JWT phambi kokuba isicelo sibethe i-PHP, kunye nokuphatha iiWebSockets kunye nokuhlanganiswa kwelizwe jikelele kwi-Prometheus.

Enkosi kwi-RPC eyakhelwe-ngaphakathi, unokuvula i-API yayo nayiphi na amathala eencwadi e-PHP ngaphandle kokubhala ii-wrappers ezongeziweyo. Okubaluleke ngakumbi, i-RoadRunner ingasetyenziselwa ukuhambisa iiseva ezintsha ezingezizo ze-HTTP. Imizekelo ibandakanya ukuqaliswa kweziphatho kwi-PHP I-AWS Lambda, ukudala iibhasi ezithembekileyo zomgca kunye nokongeza I-GRPC kwizicelo zethu.

Ngoncedo lwe-PHP kunye noluntu lwe-Go, siye sandisa ukuzinza kwesisombululo, ukwandisa ukusebenza kwesicelo ukuya kumaxesha e-40 kwezinye iimvavanyo, izixhobo eziphuculweyo zokuphucula izixhobo, ukudibanisa ukuphunyezwa kunye nesakhelo se-Symfony, kunye nenkxaso eyongeziweyo ye-HTTPS, i-HTTP / 2, iiplagi, kunye ne-PSR-17.

isiphelo

Abanye abantu basabanjwe kumbono wakudala we-PHP njengolwimi olucothayo, olunzima kuphela olulungele ukubhala iiplagi ze-WordPress. Aba bantu banokuthi i-PHP inomda: xa isicelo sikhula ngokwaneleyo, kufuneka ukhethe ulwimi "olukhulileyo" kwaye ubhale kwakhona isiseko sekhowudi eqokelelwe kwiminyaka emininzi.

Kuzo zonke ezi zinto ndifuna ukuphendula: cinga kwakhona. Sikholelwa ukuba nguwe kuphela onokumisela naziphi na izithintelo ze-PHP. Unokuchitha ubomi bakho bonke utsiba ukusuka kolunye ulwimi uye kolunye, uzama ukufumana umdlalo ofanelekileyo kwiimfuno zakho, okanye ungaqala ukucinga ngeelwimi njengezixhobo. Iintsilelo ezibonwayo zolwimi olufana ne-PHP isenokuba zizizathu zempumelelo yayo. Kwaye ukuba uyayidibanisa nolunye ulwimi olunje ngeGo, unokwenza iimveliso ezinamandla ngakumbi kunokuba ubunolwimi olunye kuphela.

Emva kokusebenza kunye nendibaniselwano ye-Go kunye ne-PHP, sinokuthi siyabathanda. Asicwangcisi ukuncama enye ngenxa yomnye, kodwa endaweni yoko sijonge iindlela zokufumana ixabiso elingakumbi kolu luhlu lubini.

UPD: Siyakwamkela umyili we-RoadRunner kunye nombhali-mbhali wenqaku lokuqala - ILachesis

umthombo: www.habr.com

Yongeza izimvo