RoadRunner: PHP sinamangidwe kuti ife, kapena Golang kuti ipulumutse

RoadRunner: PHP sinamangidwe kuti ife, kapena Golang kuti ipulumutse

Moni, Habr! Tikugwira ntchito ku Badoo kugwira ntchito pa PHP, popeza tili ndi dongosolo lalikulu kwambiri m'chinenerochi ndipo nkhani ya machitidwe ndi nkhani yopulumutsa ndalama. Zaka zoposa khumi zapitazo, tidapanga PHP-FPM pa izi, zomwe poyamba zinali zigamba za PHP, ndipo pambuyo pake zidakhala gawo logawa.

M'zaka zaposachedwa, PHP yapita patsogolo kwambiri: wotolera zinyalala wakula, kuchuluka kwa bata kwakula - lero mutha kulemba ma daemoni ndi zolemba zakale mu PHP popanda mavuto. Izi zinapangitsa kuti Spiral Scout ipite patsogolo: RoadRunner, mosiyana ndi PHP-FPM, sichiyeretsa kukumbukira pakati pa zopempha, zomwe zimapereka zowonjezera zowonjezera (ngakhale njira iyi imapangitsa kuti chitukuko chikhale chovuta). Pano tikuyesa chida ichi, koma tilibe zotsatira zogawana pano. Kuti zikhale zosangalatsa kuwadikirira, Tikusindikiza kumasulira kwa chilengezo cha RoadRunner kuchokera ku Spiral Scout.

Njira yochokera m'nkhaniyi ili pafupi ndi ife: tikamathetsa mavuto athu, timagwiritsanso ntchito kuphatikiza kwa PHP ndi Go, kupeza mapindu a zilankhulo zonse ndikusasiya chimodzi mokomera chimzake.

Sangalalani!

Pazaka khumi zapitazi, tapanga zofunsira makampani pamndandanda Fortune 500, ndi mabizinesi omwe ali ndi ogwiritsa ntchito osapitilira 500. Nthawi yonseyi, mainjiniya athu adapanga backend makamaka mu PHP. Koma zaka ziwiri zapitazo, china chake chidakhudza kwambiri magwiridwe antchito azinthu zathu, komanso pakukula kwawo - tidayambitsa Golang (Pitani) pagulu lathu laukadaulo.

Pafupifupi nthawi yomweyo, tidazindikira kuti Go idatilola kupanga mapulogalamu akulu ndikuchita mwachangu mpaka 40x. Ndi izo, tinatha kukulitsa zinthu zomwe zilipo kale zolembedwa mu PHP, kuwongolera mwa kuphatikiza ubwino wa zilankhulo zonsezi.

Tidzakuuzani momwe kuphatikiza kwa Go ndi PHP kumathandizira kuthetsa mavuto enieni achitukuko komanso momwe zasinthira kukhala chida kwa ife chomwe chingathetse mavuto ena okhudzana ndi PHP kufa mtundu.

Malo Anu a Tsiku ndi Tsiku a PHP Development

Tisanalankhule za momwe mungagwiritsire ntchito Go kuti mutsitsimutse mtundu wa PHP womwe watsala pang'ono kufa, tiyeni tiwone malo anu otukuka a PHP.

Nthawi zambiri, mumayendetsa pulogalamuyi pogwiritsa ntchito kuphatikiza kwa seva ya nginx ndi seva ya PHP-FPM. Yoyamba imagwiritsa ntchito mafayilo osasunthika ndikulozeranso zopempha zina ku PHP-FPM, ndipo PHP-FPM yokha imagwiritsa ntchito PHP code. Mwina mukugwiritsa ntchito kuphatikiza kocheperako kuchokera ku Apache ndi mod_php. Koma ngakhale zimagwira ntchito mosiyana pang'ono, mfundo zake ndi zofanana.

Tiyeni tiwone momwe PHP-FPM imagwiritsira ntchito code code. Pempho likafika, PHP-FPM imayambitsa ndondomeko ya PHP ya mwana ndikupereka zopemphazo monga gawo lake (_GET, _POST, _SERVER, etc.).

Boma silingasinthe panthawi ya PHP script, kotero pali njira imodzi yokha yopezera deta yatsopano yolowera: mwa kuchotsa kukumbukira ndondomeko ndikuyiyambitsanso.

Chitsanzo chophachi chili ndi ubwino wambiri. Simuyenera kuda nkhawa kwambiri ndikugwiritsa ntchito kukumbukira, njira zonse zimakhala zolekanitsidwa, ndipo ngati imodzi ikafa, imangopangidwanso popanda kukhudza zina zonse. Koma njirayi ilinso ndi zovuta zomwe zimawonekera poyesa kukulitsa pulogalamuyo.

Zoyipa ndi kusakwanira kwa malo okhazikika a PHP

Ngati mukuchita nawo chitukuko chaukadaulo mu PHP, ndiye kuti mukudziwa komwe mungayambire ntchito yatsopano - posankha chimango. Zili ndi malaibulale operekera kudalira, ma ORM, zomasulira ndi ma tempuleti. Ndipo zowona, zoyika zonse za ogwiritsa ntchito zitha kuyikidwa mu chinthu chimodzi (Symfony/HttpFoundation kapena PSR-7). Frameworks ndi zabwino!

Koma chilichonse chili ndi mtengo wake. Muzochita zilizonse zamabizinesi, kuti mugwiritse ntchito pempho losavuta la ogwiritsa ntchito kapena kupeza nkhokwe, muyenera kutsitsa mafayilo angapo, kupanga makalasi angapo ndikuyika masinthidwe angapo. Koma choyipa kwambiri ndichakuti mukamaliza ntchito iliyonse muyenera kukonzanso zonse ndikuyambanso: ma code onse omwe mwangoyambitsa amakhala opanda ntchito, ndi chithandizo chake simudzakonzanso pempho lina. Uzani izi kwa wopanga mapulogalamu aliyense yemwe amalemba chilankhulo china chilichonse, ndipo mudzawona kudodometsedwa pankhope yake.

Akatswiri a PHP akhala zaka zambiri kufunafuna njira zothetsera vutoli, pogwiritsa ntchito njira zanzeru zaulesi zotsegula, microframeworks, malaibulale okonzedwa bwino, cache, ndi zina zotero. (Chidziwitso cha womasulira: vutoli lithetsedwa pang'ono pobwera kutsitsatu mu PHP 7.4)

Kodi PHP yokhala ndi Go ingapulumuke zopempha zingapo?

Ndizotheka kulemba zolemba za PHP zomwe zitha kupitilira mphindi zingapo (mpaka maola kapena masiku): mwachitsanzo, ntchito za cron, ma CSV parsers, mabasi amzere. Onse amagwira ntchito molingana ndi zochitika zomwezo: amatenga ntchito, kuichita, ndikudikirira ina. Khodiyo imakhala m'chikumbukiro, kupulumutsa ma milliseconds amtengo wapatali momwe masitepe owonjezera amafunikira kuti akweze chimango ndi kugwiritsa ntchito.

Koma kupanga zolemba zakale sikophweka. Cholakwika chilichonse chimaphatu ndondomekoyi, kuzindikira kutayikira kwa kukumbukira kumakupangitsani misala, ndipo simungathe kugwiritsa ntchito F5 debugging.

Zinthu zakhala zikuyenda bwino ndi kutulutsidwa kwa PHP 7: wotolera zinyalala wodalirika wawonekera, zakhala zosavuta kuthana ndi zolakwika, ndipo zowonjezera za kernel tsopano zatetezedwa ku kutuluka. Zowona, mainjiniya amafunikabe kusamala ndi kukumbukira ndikuzindikira nkhani za boma mu code (kodi pali chilankhulo chomwe sitiyenera kuda nkhawa ndi zinthu izi?). Ndipo komabe, mu PHP 7, zodabwitsa zochepa zikutiyembekezera.

Kodi ndizotheka kutenga chitsanzo chogwira ntchito ndi zolemba zakale za PHP, kuzisintha kuti zigwirizane ndi ntchito zazing'ono ngati kukonza zopempha za HTTP, ndikuchotsa kufunikira kokweza chilichonse kuyambira pachiwopsezo chilichonse?

Kuti tithane ndi vutoli, tidafunikira kaye kukhazikitsa pulogalamu ya seva yomwe ingavomereze zopempha za HTTP ndikuzitumiza mmodzimmodzi kwa wogwira ntchito wa PHP osapha nthawi iliyonse.

Tinkadziwa kuti titha kulemba seva yapaintaneti mu PHP yoyera (PHP-PM) kapena kugwiritsa ntchito C extension (Swoole). Ndipo ngakhale njira iliyonse ili ndi zabwino zake, zosankha zonse ziwirizi sizinagwirizane ndi ife - tinkafuna zina. Tinkafuna zambiri kuposa seva yapaintaneti - tinkayembekezera kupeza yankho lomwe lingatipulumutse ku zovuta zomwe zimagwirizanitsidwa ndi "kuyambira molimba" mu PHP, zomwe panthawi imodzimodziyo zikhoza kusinthidwa mosavuta ndikukulitsidwa kwa mapulogalamu apadera. Ndiye kuti, timafunikira seva yofunsira.

Kodi Mungapite kukathandiza ndi izi? Tinkadziwa kuti zingatheke chifukwa chinenerocho chimapanga mapulogalamu mu binaries imodzi; ndi mtanda nsanja; imagwiritsa ntchito yake, yokongola kwambiri, yofananira yosinthira (concurrency) ndi laibulale yogwira ntchito ndi HTTP; ndipo potsiriza, zikwi za malaibulale otsegula ndi zophatikiza zidzapezeka kwa ife.

Zovuta kuphatikiza zilankhulo ziwiri zamapulogalamu

Chinthu choyamba chinali kudziwa mmene anthu awiri kapena kuposa angalankhulire.

Mwachitsanzo, kugwiritsa ntchito laibulale yodabwitsa Alex Palaestras amatha kukhazikitsa kugawana kukumbukira pakati pa PHP ndi Go njira (zofanana ndi mod_php mu Apache). Koma laibulaleyi ili ndi zinthu zomwe zimalepheretsa kugwiritsa ntchito kwake kuthetsa vuto lathu.

Tinaganiza zogwiritsa ntchito njira ina, yowonjezereka, yowonjezereka: kupanga mgwirizano pakati pa ndondomeko kudzera m'mabotolo / mapaipi. Njirayi yatsimikizira kudalirika kwake pazaka makumi angapo zapitazi ndipo yakhala ikukonzedwa bwino pamakina ogwiritsira ntchito.

Poyamba, tinapanga ndondomeko yosavuta ya binary yosinthanitsa deta pakati pa ndondomeko ndi kusamalira zolakwika zofalitsa. Mwachidule chake, mtundu uwu wa protocol ndi wofanana ndi ukonde с mutu wokhazikika wa paketi (kwathu 17 bytes), yomwe ili ndi chidziwitso cha mtundu wa paketi, kukula kwake ndi chigoba cha binary kuti muwone kukhulupirika kwa deta.

Pa mbali ya PHP tidagwiritsa ntchito paketi ntchito, ndi mbali ya Pitani - laibulale encoding/binary.

Zinkawoneka kwa ife kuti ndondomeko imodzi sinali yokwanira - kotero tinawonjezera luso loyimba Pitani ku mautumiki net/rpc mwachindunji kuchokera ku PHP. Izi pambuyo pake zidatithandiza kwambiri pakukula, popeza titha kuphatikiza malaibulale a Go mu mapulogalamu a PHP. Zotsatira za ntchitoyi zitha kuwoneka, mwachitsanzo, muzinthu zathu zina zotseguka Goridge.

Kugawa ntchito kwa antchito angapo a PHP

Titakhazikitsa njira yolumikizirana, tinayamba kuganiza za momwe tingasamutsire bwino ntchito ku njira za PHP. Ntchito ikafika, seva yofunsira iyenera kusankha munthu waulere kuti amalize. Ngati wogwira ntchito / ndondomekoyo atha ndi cholakwika kapena "afa," timachichotsa ndikupanga china chatsopano kuti chilowe m'malo mwake. Ndipo ngati wogwira ntchito / ndondomekoyo yatha bwino, timayibwezera ku gulu la antchito omwe alipo kuti agwire ntchito.

RoadRunner: PHP sinamangidwe kuti ife, kapena Golang kuti ipulumutse

Kusunga dziwe la ogwira ntchito omwe tidagwiritsa ntchito buffered channel, kuchotsa antchito "akufa" mosayembekezereka padziwe, tinawonjezera njira yotsatirira zolakwika ndi mayiko ogwira ntchito.

Zotsatira zake, tidalandira seva yogwira ntchito ya PHP yomwe imatha kukonza zopempha zilizonse zomwe zaperekedwa munjira ya binary.

Kuti pulogalamu yathu igwire ntchito ngati seva yapaintaneti, tidayenera kusankha mulingo wodalirika wa PHP kuyimilira zopempha zilizonse za HTTP. Kwathu ife basi sintha net/http pempho kuchokera ku Go to format PSR-7kotero kuti igwirizane ndi ma PHP ambiri omwe alipo lero.

Chifukwa PSR-7 imatengedwa kuti ndi yosasinthika (ena anganene mwaukadaulo kuti sichoncho), Madivelopa amayenera kulemba mapulogalamu omwe samawona pempholi ngati gulu lapadziko lonse lapansi. Izi zikugwirizana bwino ndi lingaliro la moyo wautali wa PHP. Kukhazikitsa kwathu komaliza, komwe sikunatchulidwebe, kumawoneka motere:

RoadRunner: PHP sinamangidwe kuti ife, kapena Golang kuti ipulumutse

Kuyambitsa RoadRunner - seva yogwiritsira ntchito kwambiri PHP

Ntchito yathu yoyamba yoyesa inali API backend, yomwe nthawi ndi nthawi inkakumana ndi zopempha zosayembekezereka (nthawi zambiri kuposa masiku onse). Ngakhale nginx inali yokwanira nthawi zambiri, tinkakumana ndi zolakwika za 502 nthawi zonse chifukwa sitinathe kulinganiza dongosolo mwamsanga kuti tiwonjezere katundu.

Kuti tisinthe yankho ili, tidatumiza seva yathu yoyamba ya PHP/Go koyambirira kwa 2018. Ndipo nthawi yomweyo tinakhala ndi zotsatira zodabwitsa! Sikuti tinangochotseratu zolakwika za 502, koma tinathanso kuchepetsa chiwerengero cha ma seva ndi magawo awiri pa atatu, kupulumutsa ndalama zambiri ndi mutu kwa akatswiri ndi oyang'anira mankhwala.

Pofika pakati pa chaka, tinali titakwaniritsa yankho lathu, tidasindikiza pa GitHub pansi pa layisensi ya MIT, ndikuyitcha. woyendetsa msewu, potero kutsindika liwiro lake lodabwitsa komanso luso lake.

Momwe RoadRunner Ingasinthire Chitukuko Chanu Chotukuka

Ntchito woyendetsa msewu adatilola kugwiritsa ntchito Middleware net/http kumbali ya Go kuti tichite chitsimikiziro cha JWT pempholi lisanagunde PHP, komanso kuthana ndi WebSockets ndi kuphatikizika kwadziko lonse ku Prometheus.

Chifukwa cha RPC yomangidwa, mutha kutsegula API ya malaibulale aliwonse a Go a PHP osalemba zolemba zowonjezera. Chofunika kwambiri, RoadRunner itha kugwiritsidwa ntchito kuyika ma seva atsopano omwe si a HTTP. Zitsanzo zikuphatikiza kuyambitsa othandizira mu PHP AWS Lambda, kupanga mabasi odalirika a mzere komanso ngakhale kuwonjezera gRPC ku mapulogalamu athu.

Mothandizidwa ndi madera a PHP ndi Go, tawonjezera kukhazikika kwa yankho, kuchulukitsa magwiridwe antchito mpaka nthawi za 40 pamayesero ena, zida zowongolera bwino, kuphatikiza kuphatikiza ndi Symfony chimango, ndikuwonjezera thandizo la HTTPS, HTTP/ 2, mapulagini, ndi PSR-17.

Pomaliza

Anthu ena akadali ogwidwa ndi mawonekedwe achikale a PHP ngati chilankhulo chocheperako, chovuta chokha cholemba mapulagini a WordPress. Anthu awa amatha kunena kuti PHP ili ndi malire: ntchito ikafika kukula mokwanira, muyenera kusankha chilankhulo "chokhwima" ndikulembanso ma code omwe apeza zaka zambiri.

Kwa zonsezi ndikufuna kuyankha: ganiziraninso. Tikukhulupirira kuti inu nokha mungakhazikitse zoletsa zilizonse za PHP. Mutha kukhala moyo wanu wonse kudumpha kuchokera kuchilankhulo kupita ku china, kuyesa kupeza zomwe zikugwirizana ndi zosowa zanu, kapena mutha kuyamba kuganiza za zilankhulo ngati zida. Zolakwika zomwe zimaganiziridwa za chilankhulo ngati PHP zitha kukhala zifukwa zachipambano chake. Ndipo mukachiphatikiza ndi chilankhulo china monga Go, mutha kupanga zida zamphamvu kwambiri kuposa mutakhala chilankhulo chimodzi chokha.

Popeza tagwira ntchito ndi kuphatikiza kwa Go ndi PHP, titha kunena kuti timawakonda. Sitikukonzekera kudzipereka wina chifukwa cha mnzake, koma m'malo mwake timayang'ana njira zopezera phindu lochulukirapo pamilu iwiriyi.

UPD: Tikulandira mlengi wa RoadRunner komanso wolemba nawo nkhani yoyambirira - Lachesis

Source: www.habr.com

Kuwonjezera ndemanga