RoadRunner: PHP ha e etselitsoe ho shoa, kapa Golang ho pholosa

RoadRunner: PHP ha e etselitsoe ho shoa, kapa Golang ho pholosa

Lumela, Habr! Re mafolofolo Badoo ho sebetsa ho PHP tshebetsong, kaha re na le tsamaiso e kholo haholo ka puo ena ‘me taba ea performance ke taba ea ho boloka chelete. Lilemong tse fetang leshome tse fetileng, re thehile PHP-FPM bakeng sa sena, eo qalong e neng e le sete ea li-patches tsa PHP, 'me hamorao ea fetoha karolo ea kabo ea molao.

Lilemong tsa morao tjena, PHP e entse tsoelo-pele e kholo: moqokeleli oa lithōle o ntlafetse, boemo ba botsitso bo eketsehile - kajeno u ka ngola li-daemone le litokomane tsa nako e telele ho PHP ntle le mathata. Sena se ile sa lumella Spiral Scout hore e tsoele pele: RoadRunner, ho fapana le PHP-FPM, ha e hloekise mohopolo pakeng tsa likopo, tse fanang ka melemo e eketsehileng ea ts'ebetso (le hoja mokhoa ona o thatafatsa ts'ebetso ea nts'etsopele). Ha joale re ntse re leka sesebelisoa sena, empa ha re na liphetho tseo re ka li arolelanang. Ho etsa hore ho be monate ho ba emela, Re phatlalatsa phetolelo ea phatlalatso ea RoadRunner ho tsoa ho Spiral Scout.

Mokhoa o tsoang ho sengoloa o haufi le rona: ha re rarolla mathata a rona, hangata re sebelisa motsoako oa PHP le Go, re fumana melemo ea lipuo ka bobeli mme re sa tele e 'ngoe molemong oa e' ngoe.

Thabela!

Lilemong tse leshome tse fetileng, re thehile likopo tsa lik'hamphani ho tsoa lenaneng Fortune 500, le bakeng sa likhoebo tse nang le bamameli ba sa feteng 500 basebelisi. Ka nako ena kaofela, baenjiniere ba rona ba ntlafalitse backend haholo-holo ho PHP. Empa lilemong tse peli tse fetileng, ho na le ntho e ileng ea ama haholo ts'ebetsong ea lihlahisoa tsa rona feela, empa hape le ho scalability ea tsona - re ile ra hlahisa Golang (Go) ho stack ea rona ea theknoloji.

Hoo e ka bang hang hang, re ile ra fumana hore Go e re lumelletse ho aha lits'ebetso tse kholoanyane tse nang le ts'ebetso e fihlang ho 40x ka potlako. Ka eona, re ile ra khona ho atolosa lihlahisoa tse seng li ntse li ngotsoe PHP, re li ntlafatsa ka ho kopanya melemo ea lipuo ka bobeli.

Re tla u bolella kamoo motsoako oa Go le PHP o thusang ho rarolla mathata a sebele a nts'etsopele le hore na e fetohile sesebelisoa ho rona se ka felisang mathata a mang a amanang le PHP e shwang mohlala.

Tikoloho ea hau ea letsatsi le letsatsi ea ntlafatso ea PHP

Pele re bua ka hore na u ka sebelisa Go ho hlasimolla mofuta o shoang oa PHP, ha re shebeng tikoloho ea hau e tloaelehileng ea ntlafatso ea PHP.

Maemong a mangata, o tsamaisa kopo o sebelisa motsoako oa seva sa websaete sa nginx le PHP-FPM seva. Ea pele e sebeletsa lifaele tse tsitsitseng mme e khutlisetsa likopo tse khethehileng ho PHP-FPM, 'me PHP-FPM ka boeona e phethahatsa khoutu ea PHP. Mohlomong u sebelisa motsoako o sa tsejoeng haholo ho tsoa ho Apache le mod_php. Empa leha e sebetsa ka tsela e fapaneng hanyane, melao-motheo ea ts'oana.

Ha re shebeng hore na PHP-FPM e sebelisa khoutu ea kopo joang. Ha kopo e fihla, PHP-FPM e qala tšebetso ea PHP ea ngoana ebe e fetisa lintlha tsa kopo e le karolo ea boemo ba eona (_GET, _POST, _SERVER, joalo-joalo).

Naha e ke ke ea fetoha nakong ea ts'ebetso ea sengoloa sa PHP, ka hona ho na le tsela e le 'ngoe feela ea ho fumana sete e ncha ea data ea ho kenya: ka ho hlakola mohopolo oa ts'ebetso le ho e qala hape.

Mokhoa ona oa ts'ebetso o na le melemo e mengata. Ha ua tlameha ho tšoenyeha haholo ka tšebeliso ea memori, lits'ebetso tsohle li arohane ka botlalo, 'me haeba e' ngoe ea tsona e ka shoa, e tla nchafatsoa ka bo eona ntle le ho ama lits'ebetso tse ling. Empa mokhoa ona o boetse o na le mefokolo e hlahang ha o leka ho eketsa ts'ebeliso.

Mefokolo le ho se sebetse hantle ha tikoloho e tloaelehileng ea PHP

Haeba u ikakhetse ka setotsoana ntlafatsong ea profeshenale ho PHP, joale u tseba moo u ka qalang projeke e ncha - ka ho khetha moralo. E na le lilaebrari tsa ente ea ho itšetleha, li-ORM, liphetolelo le lithempleite. Ehlile, lintlha tsohle tsa mosebelisi li ka kenngoa nthong e le 'ngoe (Symfony/HttpFoundation kapa PSR-7). Li-framework li ntle!

Empa ntho e 'ngoe le e 'ngoe e na le theko ea eona. Ka moralo ofe kapa ofe oa boemo ba khoebo, ho sebetsa kopo e bonolo ea mosebelisi kapa ho fihlella database, o tla tlameha ho kenya lifaele tse ngata, ho theha lihlopha tse ngata le ho hlophisa litlhophiso tse 'maloa. Empa ntho e mpe ka ho fetisisa ke hore ka mor'a ho qeta mosebetsi o mong le o mong o tla hloka ho tsosolosa ntho e 'ngoe le e' ngoe 'me u qale hape: khoutu eohle eo u sa tsoa e qala e fetoha e se nang thuso, ka thuso ea eona u ke ke ua hlola u sebetsa kopo e' ngoe. Bolella sena ho moetsi ofe kapa ofe oa mananeo ea ngolang ka puo efe kapa efe, 'me u tla bona ho tsieleha sefahlehong sa hae.

Baenjiniere ba PHP ba qetile lilemo ba ntse ba batla litsela tsa ho rarolla bothata bona, ba sebelisa mekhoa e bohlale ea botsoa ea ho kenya, li-microframeworks, lilaebrari tse ntlafalitsoeng, li-cache, joalo-joalo. (Tlhokomeliso ea Mofetoleli: bothata bona bo tla rarolloa ka mokhoa o itseng ha ho fihla pele ho PHP 7.4)

Na PHP e nang le Go e ka pholoha kopo e fetang e le 'ngoe?

Hoa khoneha ho ngola mangolo a PHP a tla tšoarella nako e telele ho feta metsotso e seng mekae (ho fihlela lihora kapa matsatsi): mohlala, mesebetsi ea cron, li-parser tsa CSV, li-buster tsa queue. Kaofela ba sebetsa ho latela boemo bo tšoanang: ba khutlisa mosebetsi, ba o phetha, ebe ba emela o latelang. Khoutu e lula mohopolong, e boloka li-milliseconds tsa bohlokoa kaha ho hlokahala mehato e mengata e eketsehileng ho kenya moralo le ts'ebeliso.

Empa ho etsa mongolo oa nako e telele ha ho bonolo hakaalo. Phoso efe kapa efe e bolaea ts'ebetso ka botlalo, ho hlahloba ho lutla ha memori hoa u hlanya, 'me ha u sa khona ho sebelisa F5 debugging.

Boemo bo ntlafetse ka ho lokolloa ha PHP 7: moqosi oa litšila o ka tšeptjoang o hlahile, ho se ho le bonolo ho sebetsana le liphoso, 'me li-extensions tsa kernel li se li sirelelitsoe ho tsoa. Ke 'nete, baenjiniere ba ntse ba hloka ho ba hlokolosi ka mohopolo le ho hlokomela litaba tsa naha ka khoutu (na ho na le puo eo ho eona re sa lokelang ho tšoenyeha ka lintho tsee?). Leha ho le joalo, ho PHP 7, re letetsoe ke limakatso tse fokolang.

Na hoa khoneha ho nka mohlala oa ho sebetsa ka lingoloa tsa PHP tsa nako e telele, ho o fetola mesebetsing e sa reng letho joalo ka ho sebetsana le likopo tsa HTTP, 'me ka hona ho felisa tlhoko ea ho kenya ntho e ngoe le e ngoe ho tloha qalong bakeng sa kopo e' ngoe le e 'ngoe?

Ho rarolla bothata bona, pele re ne re hloka ho kenya ts'ebetsong ts'ebeliso ea seva e ka amohelang likopo tsa HTTP le ho li fetisetsa ka bonngoe ho mosebeletsi oa PHP ntle le ho e bolaea nako le nako.

Re ne re tseba hore re ka ngola seva sa marang-rang ka PHP e hloekileng (PHP-PM) kapa ka ho sebelisa C extension (Swoole). 'Me le hoja mokhoa o mong le o mong o na le melemo ea oona, likhetho tseo ka bobeli li ne li sa re tšoanele - re ne re batla ho hong. Re ne re hloka ho fetang seva sa marang-rang feela - re ne re tšepile ho fumana tharollo e ka re pholosang mathateng a amanang le "qalo e thata" ho PHP, eo ka nako e ts'oanang e neng e ka fetoloa habonolo le ho atolosoa bakeng sa lits'ebetso tse itseng. Ke hore, re ne re hloka seva sa kopo.

O ka thusa ka see? Re ne re tseba hore e ka khona hobane puo e bokella likopo ho li-binaries tse le 'ngoe; ke cross-platform; e sebelisa mokhoa oa eona, o motle haholo, o ts'oanang oa ts'ebetso (concurrency) le laebrari bakeng sa ho sebetsa le HTTP; 'me qetellong, likete tsa lilaebrari tsa mohloli o bulehileng le likhokahano li tla fumaneha ho rona.

Mathata a ho kopanya lipuo tse peli tsa lenaneo

Mohato oa pele e ne e le ho fumana hore na likopo tse peli kapa ho feta li ne li tla buisana joang.

Ka mohlala, ho sebelisa laeborari e ntle Alex Palaestras e ne e ka kenya tšebetsong ho arolelana mohopolo lipakeng tsa PHP le Go lits'ebetso (tse ts'oanang le mod_php ho Apache). Empa laebrari ena e na le likarolo tse fokotsang tšebeliso ea eona bakeng sa ho rarolla bothata ba rona.

Re ile ra etsa qeto ea ho sebelisa mokhoa o mong, o tloaelehileng haholoanyane: ho haha ​​​​tšebelisano pakeng tsa lits'ebetso ka li-sockets / liphaephe. Mokhoa ona o ipakile ho tšepahala lilemong tse mashome tse fetileng mme o ntlafalitsoe hantle maemong a sistimi e sebetsang.

Ho qala, re thehile protocol e bonolo ea binary bakeng sa ho fapanyetsana data lipakeng tsa lits'ebetso le ho sebetsana le liphoso tsa phetisetso. Ka mokhoa o bonolo ka ho fetisisa, mofuta ona oa protocol o tšoana le letlooa с Sehlooho sa pakete ea boholo bo tsitsitseng (tabeng ea rona 17 bytes), e nang le tlhahisoleseding e mabapi le mofuta oa pakete, boholo ba eona le mask a binary ho hlahloba botšepehi ba data.

Ka lehlakoreng la PHP re ne re sebelisa mosebetsi oa pakete, le ka lehlakoreng la Go - laeborari khouto/ binary.

Ho rona ho ne ho bonahala eka protocol e le 'ngoe e ne e sa lekana - kahoo re ile ra eketsa bokhoni ba ho letsetsa E-ea litšebeletso net/rpc ka kotloloho ho tsoa PHP. Hamorao sena se ile sa re thusa haholo nts'etsopele, kaha re ne re ka kopanya lilaebrari tsa Go habonolo lits'ebetsong tsa PHP. Sephetho sa mosebetsi ona se ka bonoa, ka mohlala, sehlahisoa sa rona se seng se bulehileng Goridge.

Ho tsamaisa mesebetsi ho basebetsi ba bangata ba PHP

Ka mor'a ho kenya ts'ebetsong mokhoa oa ho sebelisana, re ile ra qala ho nahana ka mokhoa oa ho fetisetsa mesebetsi ka katleho ho mekhoa ea PHP. Ha mosebetsi o fihla, seva sa kopo se tlameha ho khetha mosebeletsi oa mahala hore a se phethe. Haeba mosebeletsi / ts'ebetso e fela ka phoso kapa "ea shoa," rea e tlosa ebe re theha e ncha ho e nkela sebaka. 'Me haeba mosebeletsi / ts'ebetso e phethiloe ka katleho, re e khutlisetsa letamong la basebetsi ba teng ho etsa mesebetsi.

RoadRunner: PHP ha e etselitsoe ho shoa, kapa Golang ho pholosa

Ho boloka letamo la basebetsi ba mafolofolo re ne re sebelisa kanale e buffered, ho tlosa basebetsi ba sa lebelloang "ba shoeleng" letamong, re kentse mokhoa oa ho latela liphoso le linaha tsa basebetsi.

Ka lebaka leo, re fumane seva e sebetsang ea PHP e khonang ho sebetsana le likōpo leha e le life tse hlahisoang ka mokhoa oa binary.

E le hore kopo ea rona e sebetse joalo ka seva sa marang-rang, re ile ra tlameha ho khetha maemo a tšepahalang a PHP ho emela likopo life kapa life tse tlang tsa HTTP. Boemong ba rona re mpa feela fetola net/http kopo ho tloha Go to format PSR-7e le hore e tsamaellane le meralo e mengata ea PHP e fumanehang kajeno.

Hobane PSR-7 e nkuoa e le ntho e sa fetoheng (ba bang ba ka re ka botekgeniki ha e joalo), bahlahisi ba tlameha ho ngola lits'ebetso tse sa nkeng kopo joalo ka setheo sa lefats'e. Sena se lumellana hantle le mohopolo oa mekhoa ea nako e telele ea PHP. Ts'ebetsong ea rona ea ho qetela, e neng e e-so ka e boleloa ka mabitso, e ne e shebahala tjena:

RoadRunner: PHP ha e etselitsoe ho shoa, kapa Golang ho pholosa

Re hlahisa RoadRunner - Seva ea kopo ea PHP e sebetsang hantle haholo

Mosebetsi oa rona oa pele oa teko e ne e le API backend, eo nako le nako e neng e ba le ho phatloha ho sa lebelloang ha likopo (hangata ho feta tloaelo). Le hoja nginx e ne e lekane maemong a mangata, re ne re atisa ho kopana le liphoso tsa 502 hobane re ne re sitoa ho leka-lekanya tsamaiso ka potlako bakeng sa keketseho e lebeletsoeng ea mojaro.

Ho nkela tharollo ena sebaka, re kentse seva ea rona ea pele ea kopo ea PHP/Go mathoasong a 2018. 'Me hang-hang re ile ra fumana phello e makatsang! Ha rea ​​​​ka ra tlosa ka ho feletseng phoso ea 502, empa re ile ra boela ra khona ho fokotsa palo ea lisebelisoa ka likarolo tse peli ho tse tharo, ho boloka chelete e ngata le hlooho ea hlooho bakeng sa baenjiniere le batsamaisi ba lihlahisoa.

Bohareng ba selemo, re ne re ntlafalitse tharollo ea rona, ra e phatlalatsa ho GitHub tlasa laesense ea MIT, mme ra e bitsa. RoadRunner, ka hona e totobatsa lebelo la eona le ts'ebetso e makatsang.

Kamoo RoadRunner e ka Ntlafatsang Stack ea hau ea nts'etsopele

Kopo RoadRunner e re lumelletse ho sebelisa Middleware net/http ka lehlakoreng la Go ho etsa netefatso ea JWT pele kopo e fihla ho PHP, hammoho le ho sebetsana le WebSockets le ho bokellana ha boemo ba lefatše ho Prometheus.

Ka lebaka la RPC e hahelletsoeng, o ka bula API ea lilaebrari life kapa life tsa Go bakeng sa PHP ntle le ho ngola li-wrappers tse atolositsoeng. Habohlokoa le ho feta, RoadRunner e ka sebelisoa ho tsamaisa li-server tse ncha tseo e seng tsa HTTP. Mehlala e kenyelletsa ho qala li-handers ho PHP AWS Lambda, ho theha li-buster tse tšepahalang tsa mela esita le ho eketsa GRPC ho likopo tsa rona.

Ka thuso ea sechaba sa PHP le Go, re ekelitse botsitso ba tharollo, re ekelitse ts'ebetso ea kopo ka makhetlo a 40 litekong tse ling, lisebelisoa tse ntlafetseng tsa ho lokisa liphoso, ho kenngoa ts'ebetsong le moralo oa Symfony, le tšehetso e eketsehileng bakeng sa HTTPS, HTTP/ 2, li-plugins, le PSR-17.

fihlela qeto e

Batho ba bang ba ntse ba tšoeroe ke pono ea khale ea PHP e le puo e liehang, e boima e ntle feela bakeng sa ho ngola li-plugins tsa WordPress. Batho bana ba ka 'na ba re PHP e na le moeli: ha kopo e ntse e hōla ka ho lekaneng, u tlameha ho khetha puo e "hōtseng tsebong" le ho ngola bocha motheo oa khoutu o bokeletseng ka lilemo tse ngata.

Ho tsena tsohle ke batla ho araba: nahana hape. Re lumela hore ke uena feela ea ka behang lithibelo tsa PHP. U ka qeta bophelo bohle ba hau u tlola ho tloha puong e 'ngoe ho ea ho e' ngoe, u leka ho fumana papali e loketseng litlhoko tsa hau, kapa u ka qala ho nahana ka lipuo e le lisebelisoa. Ho nahanoa hore mefokolo ea puo e kang PHP e kanna ea ba mabaka a katleho ea eona. Mme ha o e kopanya le puo e nngwe e kang Go, o ka etsa dihlahiswa tse matla ho feta ha o ne o lekanyeditswe puong e le nngwe feela.

Ha re sebelitse ka motsoako oa Go le PHP, re ka re rea ba rata. Ha rea ​​rera ho tela e 'ngoe molemong oa e mong, empa ho e-na le hoo re batla litsela tsa ho fumana boleng bo bongata ho tsoa ho stack ena e habeli.

UPD: Re amohela moetsi oa RoadRunner le sengoli-'moho sa sengoloa sa mantlha - Lachesis

Source: www.habr.com

Eketsa ka tlhaloso