RoadRunner: Ba a gina PHP don mutu ba, ko Golang don ceto

RoadRunner: Ba a gina PHP don mutu ba, ko Golang don ceto

Hai Habr! Muna aiki a Badoo aiki akan aikin PHP, Tun da muna da babban tsari a cikin wannan harshe kuma batun aikin shine batun ceton kuɗi. Fiye da shekaru goma da suka wuce, mun ƙirƙiri PHP-FPM don wannan, wanda da farko saitin faci ne na PHP, kuma daga baya ya shiga rarraba a hukumance.

A cikin 'yan shekarun nan, PHP ya sami babban ci gaba: mai tattara shara ya inganta, matakin kwanciyar hankali ya karu - a yau za ku iya rubuta daemons da rubutun da aka dade a cikin PHP ba tare da matsala ba. Wannan ya ba da damar Spiral Scout don ci gaba: RoadRunner, ba kamar PHP-FPM ba, baya tsaftace ƙwaƙwalwar ajiya tsakanin buƙatun, wanda ke ba da ƙarin fa'idar aiki (ko da yake wannan tsarin yana rikitar da tsarin ci gaba). A halin yanzu muna gwaji da wannan kayan aikin, amma ba mu da wani sakamako har yanzu da za mu raba. Don sa jiransu ya fi daɗi, muna buga fassarar sanarwar RoadRunner daga Spiral Scout.

Hanyar da ke cikin labarin yana kusa da mu: lokacin da muke magance matsalolinmu, mu ma yawancin lokuta muna amfani da gungun PHP da Go, muna samun fa'idodin harsunan biyu kuma ba mu watsar da ɗayan don yarda da ɗayan ba.

Enjoy!

A cikin shekaru goma da suka gabata, mun ƙirƙiri aikace-aikacen kamfanoni daga jerin Fortune 500, da kuma kasuwancin da ba su wuce masu amfani da 500 masu sauraro ba. Duk tsawon wannan lokacin, injiniyoyinmu suna haɓaka ginshiƙan baya galibi a cikin PHP. Amma shekaru biyu da suka wuce, wani abu yana da babban tasiri ba kawai a kan aikin samfuranmu ba, har ma a kan girman su - mun gabatar da Golang (Go) a cikin tarin fasahar mu.

Kusan nan da nan, mun gano cewa Go ya ba mu damar gina manyan aikace-aikace tare da haɓaka ayyuka har zuwa 40x. Da shi, mun sami damar fadada samfuran da aka rubuta a cikin PHP, inganta su ta hanyar haɗa fa'idodin harsunan biyu.

Za mu gaya muku yadda haɗin Go da PHP ke taimakawa wajen magance matsalolin ci gaba na gaske da kuma yadda ya zama kayan aiki a gare mu wanda zai iya kawar da wasu matsalolin da ke tattare da su. PHP mutun model.

Yanayin ci gaban PHP na yau da kullun

Kafin mu yi magana game da yadda za ku iya amfani da Go don farfado da samfurin PHP na mutuwa, bari mu dubi yanayin ci gaban PHP ɗinku na asali.

A mafi yawan lokuta, kuna gudanar da aikace-aikacenku ta amfani da haɗin sabar gidan yanar gizo na nginx da sabar PHP-FPM. Tsohuwar tana ba da fayiloli a tsaye kuma tana tura takamaiman buƙatun zuwa PHP-FPM, yayin da PHP-FPM da kanta ke aiwatar da lambar PHP. Wataƙila kuna amfani da ƙarancin shaharar haɗin Apache da mod_php. Amma ko da yake yana aiki kadan daban, ka'idodin iri ɗaya ne.

Bari mu kalli yadda PHP-FPM ke aiwatar da lambar aikace-aikacen. Lokacin da buƙatu ya shigo, PHP-FPM yana fara aiwatar da tsarin yaran PHP kuma ya ba da cikakkun bayanai game da buƙatun a matsayin wani ɓangare na jiharsa (_GET, _POST, _SERVER, da sauransu).

Jihar ba za ta iya canzawa ba yayin aiwatar da rubutun PHP, don haka hanya ɗaya tilo don samun sabon saitin bayanan shigarwa ita ce ta share ƙwaƙwalwar tsari da sake farawa.

Wannan samfurin kisa yana da fa'idodi da yawa. Ba dole ba ne ka damu da yawa game da amfani da ƙwaƙwalwar ajiya, duk matakai sun ware gaba ɗaya, kuma idan ɗaya daga cikinsu ya "mutu", za a sake ƙirƙira ta atomatik kuma hakan ba zai shafi sauran hanyoyin ba. Amma wannan hanyar kuma tana da rashin lahani waɗanda ke bayyana yayin ƙoƙarin ƙima aikace-aikacen.

Lalacewa da rashin inganci na Muhalli na PHP na yau da kullun

Idan kun kasance ƙwararren mai haɓaka PHP, to kun san inda za ku fara sabon aikin - tare da zaɓin tsarin. Ya ƙunshi ɗakunan karatu na allura na dogaro, ORMs, fassarorin da samfuri. Kuma, ba shakka, duk shigarwar mai amfani za a iya sanya shi cikin dacewa cikin abu ɗaya (Symfony/HttpFoundation ko PSR-7). Tsarin yana da kyau!

Amma komai yana da farashin sa. A cikin kowane tsarin matakin kasuwanci, don aiwatar da buƙatun mai sauƙin sauƙi ko samun damar zuwa bayanan bayanai, dole ne ku loda aƙalla fayiloli da yawa, ƙirƙira azuzuwan da yawa da kuma rarraba jeri da yawa. Amma mafi munin abu shine bayan kammala kowane aiki, kuna buƙatar sake saita komai kuma ku sake farawa: duk lambar da kuka ƙaddamar ta zama mara amfani, tare da taimakonsa ba za ku sake aiwatar da wata buƙata ba. Gaya wa duk wani mai tsara shirye-shirye da ke yin rubutu da wani harshe, za ka ga ruɗi a fuskarsa.

Injiniyoyin PHP sun dau shekaru suna neman hanyoyin da za su magance wannan matsalar, ta yin amfani da dabarar ladabtarwa na kasala, microframeworks, ingantattun ɗakunan karatu, cache, da dai sauransu. Amma a ƙarshe, har yanzu kuna sake saita aikace-aikacen gabaɗaya kuma ku sake farawa akai-akai. . (Bayanin mai fassara: za a magance wannan matsala ta wani bangare tare da zuwan bugu da kari a cikin PHP 7.4)

PHP tare da Go na iya tsira fiye da buƙatu ɗaya?

Zai yiwu a rubuta rubutun PHP waɗanda ke rayuwa fiye da ƴan mintuna (har zuwa sa'o'i ko kwanaki): misali, ayyukan cron, CSV parsers, masu warware layi. Dukkansu suna aiki bisa ga yanayin yanayi ɗaya: suna dawo da aiki, aiwatar da shi, kuma suna jira na gaba. Lambar tana zaune a cikin ƙwaƙwalwar ajiya koyaushe, tana adana milise seconds saboda akwai ƙarin ƙarin matakai da yawa da ake buƙata don loda tsarin da aikace-aikacen.

Amma haɓaka rubutun da aka daɗe ba shi da sauƙi. Duk wani kuskure yana kashe tsarin gaba ɗaya, bincikar leaks na ƙwaƙwalwar ajiya yana fushi, kuma gyara kuskuren F5 ba zai yiwu ba.

Halin ya inganta tare da sakin PHP 7: abin dogara mai tara shara ya bayyana, ya zama mai sauƙi don magance kurakurai, kuma kari na kernel yanzu ya zama abin ƙyama. Gaskiya ne, injiniyoyi har yanzu suna buƙatar yin hankali tare da ƙwaƙwalwar ajiya kuma su san al'amuran jihar a cikin lambar (akwai harshe wanda zai iya watsi da waɗannan abubuwa?). Har yanzu, PHP 7 yana da ƙarancin abubuwan ban mamaki a cikin kantin sayar da mu.

Shin yana yiwuwa a ɗauki samfurin aiki tare da rubutun PHP na dogon lokaci, daidaita shi zuwa ƙarin ayyuka marasa mahimmanci kamar sarrafa buƙatun HTTP, kuma ta haka ne za a kawar da buƙatar ɗaukar komai daga karce tare da kowace buƙata?

Don magance wannan matsalar, da farko muna buƙatar aiwatar da aikace-aikacen uwar garken da zai iya karɓar buƙatun HTTP kuma mu tura su ɗaya bayan ɗaya zuwa ma'aikacin PHP ba tare da kashe shi kowane lokaci ba.

Mun san cewa za mu iya rubuta sabar yanar gizo a cikin PHP mai tsabta (PHP-PM) ko amfani da tsawo na C (Swoole). Kuma ko da yake kowace hanya tana da nata cancantar, duka zaɓuɓɓukan ba su dace da mu ba - muna son wani abu. Muna buƙatar fiye da sabar gidan yanar gizo kawai - muna tsammanin samun mafita wanda zai iya ceton mu daga matsalolin da ke da alaƙa da "farawa mai wuya" a cikin PHP, wanda a lokaci guda za'a iya daidaitawa da kuma fadada don takamaiman aikace-aikace. Wato muna buƙatar uwar garken aikace-aikacen.

Za a iya Tafi taimako da wannan? Mun san zai iya saboda harshe yana tattara aikace-aikace zuwa binaries guda; shi ne giciye-dandamali; yana amfani da nasa, kyakkyawa, ƙirar sarrafa layi ɗaya (daidaitacce) da ɗakin karatu don aiki tare da HTTP; kuma a ƙarshe, dubban ɗakunan karatu da haɗin kai za su kasance a gare mu.

Wahalolin Haɗa Harsunan Shirye-shiryen Biyu

Da farko, ya zama dole don ƙayyade yadda aikace-aikacen biyu ko fiye za su yi hulɗa da juna.

Misali, amfani kyakkyawan ɗakin karatu Alex Palaestras, yana yiwuwa a raba ƙwaƙwalwar ajiya tsakanin tsarin PHP da Go (mai kama da mod_php a Apache). Amma wannan ɗakin karatu yana da fasali waɗanda ke iyakance amfani da shi don magance matsalarmu.

Mun yanke shawarar yin amfani da wata hanya dabam, mafi gama gari: don gina hulɗa tsakanin matakai ta hanyar kwasfa / bututun. Wannan hanya ta tabbatar da abin dogaro a cikin shekarun da suka gabata kuma an inganta shi sosai a matakin tsarin aiki.

Da farko, mun ƙirƙiri ƙa'idar binary mai sauƙi don musayar bayanai tsakanin matakai da sarrafa kurakuran watsawa. A cikin mafi sauƙin tsari, wannan nau'in yarjejeniya yana kama da netstring с kafaffen girman fakitin kai (a cikin yanayinmu 17 bytes), wanda ya ƙunshi bayani game da nau'in fakiti, girmansa da abin rufe fuska na binary don bincika amincin bayanan.

A gefen PHP mun yi amfani da shi shirya aiki, kuma a gefen Go, ɗakin karatu encoding/binary.

Da alama a gare mu yarjejeniya ɗaya ba ta isa ba - kuma mun ƙara ikon yin kira net/rpc tafi sabis kai tsaye daga PHP. Daga baya, wannan ya taimaka mana sosai wajen haɓakawa, tunda muna iya haɗa ɗakunan karatu na Go cikin sauƙi cikin aikace-aikacen PHP. Ana iya ganin sakamakon wannan aikin, alal misali, a cikin sauran samfuran mu na buɗe ido Goridge.

Rarraba ayyuka a tsakanin ma'aikatan PHP da yawa

Bayan aiwatar da tsarin hulɗa, mun fara tunanin hanya mafi inganci don canja wurin ayyuka zuwa hanyoyin PHP. Lokacin da aiki ya zo, dole ne uwar garken aikace-aikacen ya zaɓi ma'aikaci kyauta don aiwatar da shi. Idan ma'aikaci / tsari ya fita tare da kuskure ko "ya mutu", muna kawar da shi kuma mu ƙirƙiri sabon don maye gurbinsa. Kuma idan ma'aikacin / tsari ya kammala cikin nasara, za mu mayar da shi zuwa tafkin ma'aikatan da ke da damar yin ayyuka.

RoadRunner: Ba a gina PHP don mutu ba, ko Golang don ceto

Don adana tafkin ma'aikata masu aiki, mun yi amfani da su tashar buffered, don cire ma'aikatan "matattu" ba zato ba tsammani daga tafkin, mun kara da wani tsari don bin diddigin kurakurai da jihohin ma'aikata.

Sakamakon haka, mun sami uwar garken PHP mai aiki da ke iya sarrafa duk wani buƙatun da aka gabatar a cikin nau'i na binary.

Domin aikace-aikacen mu ya fara aiki azaman sabar gidan yanar gizo, dole ne mu zaɓi ingantaccen ma'aunin PHP don wakiltar kowane buƙatun HTTP mai shigowa. A cikin yanayinmu, mu kawai canza buƙatar net/http daga Je zuwa tsari PSR-7ta yadda ya dace da yawancin tsarin tsarin PHP da ake da su a yau.

Saboda ana ɗaukar PSR-7 wanda ba zai iya canzawa (wasu za su ce a zahiri ba haka ba ne), masu haɓakawa dole ne su rubuta aikace-aikacen da ba sa ɗaukar buƙatun a matsayin mahaɗan duniya bisa ƙa'ida. Wannan ya yi daidai da ra'ayin tsarin tafiyar da PHP na tsawon rai. Ayyukanmu na ƙarshe, wanda har yanzu ba a bayyana sunansa ba, yayi kama da haka:

RoadRunner: Ba a gina PHP don mutu ba, ko Golang don ceto

Gabatar da RoadRunner - babban aiki uwar garken aikace-aikacen PHP

Aikin gwajin mu na farko shine bayan API, wanda lokaci-lokaci yana fashe cikin buƙatun da ba za a iya faɗi ba (fiye da sau da yawa fiye da yadda aka saba). Kodayake nginx ya isa a mafi yawan lokuta, muna ci karo da kurakurai 502 akai-akai saboda ba za mu iya daidaita tsarin da sauri ba don haɓakar da ake sa ran.

Don maye gurbin wannan bayani, mun tura sabar aikace-aikacen PHP/Go na farko a farkon 2018. Kuma nan da nan ya sami sakamako mai ban mamaki! Ba wai kawai mun kawar da kuskuren 502 gaba daya ba, amma mun sami damar rage yawan adadin sabobin da kashi biyu cikin uku, adana kuɗi da yawa da magungunan ciwon kai ga injiniyoyi da manajan samfur.

A tsakiyar shekara, mun inganta maganinmu, mun buga shi akan GitHub a ƙarƙashin lasisin MIT kuma mun sanya masa suna. HanyarRunner, don haka jaddada saurinsa mai ban mamaki da ingancinsa.

Yadda RoadRunner zai iya inganta tarin ci gaban ku

Aikace-aikacen HanyarRunner ya ba mu damar amfani da Middleware net/http a gefen Go don yin tabbacin JWT kafin buƙatun ya kai ga PHP, da kuma sarrafa WebSockets da tara jihar a duniya a cikin Prometheus.

Godiya ga ginanniyar RPC, zaku iya buɗe API na kowane ɗakin karatu na Go don PHP ba tare da rubuta abubuwan ƙarawa ba. Mafi mahimmanci, tare da RoadRunner zaka iya tura sabbin sabar sabar HTTP. Misalai sun haɗa da masu gudanar da aiki a cikin PHP AWS Lambda, Ƙirƙirar amintattun masu karya layi, har ma da ƙarawa gRPC zuwa aikace-aikacen mu.

Tare da taimakon PHP da al'ummomin Go, mun inganta kwanciyar hankali na mafita, ƙara yawan aikace-aikacen har zuwa sau 40 a wasu gwaje-gwaje, inganta kayan aikin gyarawa, aiwatar da haɗin kai tare da tsarin Symfony, da kuma ƙara goyon baya ga HTTPS, HTTP / 2, plugins, da kuma PSR-17.

ƙarshe

Wasu mutane har yanzu ana kama su a cikin ra'ayi mara kyau na PHP a matsayin jinkirin, harshe mara amfani kawai mai kyau don rubuta plugins don WordPress. Wadannan mutane na iya ma cewa PHP yana da irin wannan iyakance: lokacin da aikace-aikacen ya yi girma sosai, dole ne ku zaɓi yaren "balagagge" kuma ku sake rubuta tushen lambar da aka tara tsawon shekaru masu yawa.

Ga duk wannan ina so in amsa: sake tunani. Mun yi imanin cewa kawai ku saita kowane hani don PHP. Kuna iya ciyar da rayuwarku gaba ɗaya don canzawa daga wannan harshe zuwa wani, ƙoƙarin nemo madaidaicin madaidaicin buƙatunku, ko kuna iya fara tunanin harsuna azaman kayan aiki. Abubuwan da ake tsammani na harshe kamar PHP na iya zama dalilin nasararsa. Kuma idan kun haɗa shi da wani yare kamar Go, to, zaku ƙirƙira samfuran da suka fi ƙarfi fiye da idan an iyakance ku ga amfani da kowane harshe.

Bayan yin aiki tare da gungun Go da PHP, zamu iya cewa muna son su. Ba mu yi shirin sadaukar da ɗayan don ɗayan ba - akasin haka, za mu nemi hanyoyin samun ƙarin ƙima daga wannan tarin dual.

UPD: sannu ga mahaliccin RoadRunner kuma marubucin labarin asali - Lachesis

source: www.habr.com

Add a comment