RoadRunner: ʻAʻole kūkulu ʻia ʻo PHP e make, a i ʻole ʻo Golang e hoʻopakele

RoadRunner: ʻAʻole kūkulu ʻia ʻo PHP e make, a i ʻole ʻo Golang e hoʻopakele

E Habr! Hoʻoikaika mākou ma Badoo e hana ana ma ka hana PHP, no ka mea he ʻōnaehana nui kā mākou ma kēia ʻōlelo a ʻo ka hoʻopuka hana he pilikia mālama kālā. ʻOi aku ma mua o ʻumi makahiki i hala aku nei, ua hana mākou i PHP-FPM no kēia, ʻo ia ka mea i hoʻonohonoho mua ʻia i kahi hoʻonohonoho no PHP, a ma hope ua komo i ka hāʻawi kūhelu.

I nā makahiki i hala iho nei, ua holomua nui ʻo PHP: ua hoʻomaikaʻi ka ʻohi ʻōpala, ua piʻi ka pae o ka paʻa - i kēia lā hiki iā ʻoe ke kākau i nā daemons a me nā palapala lōʻihi ma PHP me ka pilikia ʻole. Ua ʻae kēia i ka Spiral Scout e hele hou aku: ʻO RoadRunner, ʻaʻole like me PHP-FPM, ʻaʻole hoʻomaʻemaʻe i ka hoʻomanaʻo ma waena o nā noi, e hāʻawi ana i ka loaʻa hana hou (ʻoiai ʻo kēia ala e hoʻopili ai i ke kaʻina hana). Ke hoʻāʻo nei mākou i kēia mea hana, akā ʻaʻohe hopena e kaʻana like. I mea e leʻaleʻa ai ke kali ʻana iā lākou, hoʻopuka mākou i ka unuhi o ka hoʻolaha RoadRunner mai Spiral Scout.

ʻO ke ala mai ka ʻatikala e pili kokoke ana iā mākou: i ka wā e hoʻoponopono ai i kā mākou mau pilikia, hoʻohana pinepine mākou i ka pūʻulu o PHP a me Go, e loaʻa ana nā pono o nā ʻōlelo ʻelua a ʻaʻole haʻalele i kekahi i kekahi.

I ka!

I nā makahiki he ʻumi i hala iho nei, ua hana mākou i nā noi no nā hui mai ka papa inoa ʻO Fortune 500, a no nā ʻoihana me ka lehulehu o nā mea hoʻohana ʻaʻole ʻoi aku ma mua o 500. I kēia manawa a pau, ua hoʻomohala kā mākou poʻe ʻenekinia i ka backend ma PHP. Akā ʻelua makahiki i hala aku nei, ua loaʻa kekahi mea i ka hopena nui ʻaʻole wale i ka hana o kā mākou huahana, akā i ko lākou scalability - ua hoʻokomo mākou iā Golang (Go) i kā mākou ʻenehana ʻenehana.

Aneane koke, ʻike mākou ua ʻae ʻo Go iā mākou e kūkulu i nā noi nui aʻe a hiki i ka 40x hoʻomaikaʻi hana. Me ia, ua hiki iā mākou ke hoʻonui i kā mākou huahana PHP e kū nei, e hoʻomaikaʻi iā lākou ma ka hoʻohui ʻana i nā pono o nā ʻōlelo ʻelua.

E haʻi mākou iā ʻoe pehea e kōkua ai ka hui ʻana o Go a me PHP i ka hoʻoponopono ʻana i nā pilikia hoʻomohala maoli a pehea i lilo ai i mea hana no mākou e hiki ai ke hoʻopau i kekahi o nā pilikia pili me Hoʻohālike make PHP.

ʻO kāu puni hoʻomohala PHP i kēlā me kēia lā

Ma mua o ko mākou kamaʻilio ʻana pehea e hiki ai iā ʻoe ke hoʻohana iā Go e hoʻolaʻa i ke kumu hoʻohālike make PHP, e nānā kāua i kāu kaiapuni hoʻomohala PHP paʻamau.

I ka hapanui o nā hihia, holo ʻoe i kāu noi me ka hoʻohana ʻana i ka hui pūnaewele nginx a me ka server PHP-FPM. Hāʻawi ka mea mua i nā faila static a hoʻihoʻi hou i nā noi kikoʻī i PHP-FPM, ʻoiai ʻo PHP-FPM ponoʻī e hoʻokō i ka code PHP. Ke hoʻohana nei paha ʻoe i ka hui pū ʻana o Apache a me mod_php. Akā ʻoiai he ʻokoʻa iki ka hana, ua like nā loina.

E nānā kākou pehea e hoʻokō ai ʻo PHP-FPM i ke code noi. Ke komo mai kahi noi, hoʻomaka ka PHP-FPM i kahi kaʻina hana keiki PHP a hāʻawi i nā kikoʻī o ka noi ma ke ʻano o kona mokuʻāina (_GET, _POST, _SERVER, etc.).

ʻAʻole hiki i ka mokuʻāina ke hoʻololi i ka wā o ka hoʻokō ʻana i kahi palapala PHP, no laila ʻo ke ala wale nō e kiʻi ai i kahi hoʻonohonoho hou o ka ʻikepili hoʻokomo ma ka holoi ʻana i ka hoʻomanaʻo kaʻina hana a hoʻomaka hou.

He nui nā pono o kēia kŘkohu hoʻokō. ʻAʻole pono ʻoe e hopohopo nui e pili ana i ka hoʻohana ʻana i ka hoʻomanaʻo, ua kaʻawale loa nā kaʻina hana a pau, a inā "make" kekahi o lākou, e hana hou ʻia ʻo ia a ʻaʻole e pili i ke koena o nā kaʻina. Akā ʻo kēia ala hoʻi he mau hemahema i ʻike ʻia i ka wā e hoʻāʻo ai e hoʻonui i ka noi.

Nā pōʻino a me nā hemahema o kahi kaiapuni PHP maʻamau

Inā he mea hoʻomohala PHP ʻoe, a laila ʻike ʻoe i kahi e hoʻomaka ai i kahi papahana hou - me ke koho ʻana i kahi framework. Aia i loko o nā hale waihona puke dependency injection, nā ORM, nā unuhi a me nā mamana. A, ʻoiaʻiʻo, hiki ke hoʻokomo pono ʻia nā mea hoʻohana āpau i hoʻokahi mea (Symfony/HttpFoundation a i ʻole PSR-7). Maikaʻi nā frameworks!

Akā, aia nā mea a pau i kona kumukūʻai. I loko o kekahi ʻoihana-level framework, e hoʻoponopono i kahi noi mea hoʻohana maʻalahi a i ʻole ke komo ʻana i kahi waihona, pono ʻoe e hoʻouka ma ka liʻiliʻi loa o nā faila, hana i nā papa he nui a hoʻopaʻa i kekahi mau hoʻonohonoho. Akā ʻo ka mea ʻino loa ma hope o ka hoʻopau ʻana i kēlā me kēia hana, pono ʻoe e hoʻonohonoho hou i nā mea āpau a hoʻomaka hou: lilo nā code āpau āu i hoʻomaka ai i mea ʻole, me kāna kōkua ʻaʻole ʻoe e hana hou i kahi noi hou. E haʻi i kēia i kekahi mea papahana e kākau ana ma kekahi ʻōlelo ʻē aʻe, a e ʻike ʻoe i ka pīhoihoi ma kona mau maka.

Ua ʻimi nā ʻenekini PHP i nā ala e hoʻoponopono ai i kēia pilikia no nā makahiki, me ka hoʻohana ʻana i nā ʻenehana hoʻoili palaualelo akamai, microframeworks, optimized libraries, cache, etc. (Meka a ka mea unuhi: e hoʻopau hapa ʻia kēia pilikia me ka hiki ʻana mai o preload ma PHP 7.4)

Hiki iā PHP me Go ke ola ma mua o hoʻokahi noi?

Hiki ke kākau i nā palapala PHP e ola ana ma mua o kekahi mau minuke (a hiki i nā hola a i ʻole nā ​​lā): no ka laʻana, cron tasks, CSV parsers, queue breakers. Hana lākou a pau e like me ke kūlana hoʻokahi: lawe lākou i kahi hana, hoʻokō, a kali i ka hana aʻe. Noho ke code i ka hoʻomanaʻo i nā manawa a pau, e mālama ana i nā milliseconds makamae no ka mea he nui nā ʻanuʻu hou e pono ai e hoʻouka i ka framework a me ka noi.

Akā ʻaʻole maʻalahi ka hoʻomohala ʻana i nā palapala lōʻihi. Hoʻopau ka hewa i ke kaʻina hana, ʻo ka ʻike ʻana i nā leaks hoʻomanaʻo he mea huhū, a ʻaʻole hiki ke hoʻopau hou ʻia ka F5.

Ua hoʻomaikaʻi ʻia ke kūlana me ka hoʻokuʻu ʻana o PHP 7: ua ʻike ʻia kahi ʻohi ʻōpala hilinaʻi, ua maʻalahi ka hoʻoponopono ʻana i nā hewa, a ʻo ka hoʻonui ʻana i ka kernel i kēia manawa he leak-proof. ʻOiaʻiʻo, pono nā ʻenekinia e makaʻala i ka hoʻomanaʻo a e makaʻala i nā pilikia mokuʻāina ma ke code (he ʻōlelo paha e hiki ke haʻalele i kēia mau mea?). Eia nō naʻe, ʻoi aku ka liʻiliʻi o ka PHP 7 i nā mea kupanaha no mākou.

Hiki paha ke lawe i ke kumu hoʻohālike o ka hana ʻana me nā palapala PHP lōʻihi, hoʻololi iā ia i nā hana koʻikoʻi e like me ka hoʻoponopono ʻana i nā noi HTTP, a laila e hoʻopau i ka pono e hoʻouka i nā mea āpau mai ka wā ʻōpala me kēlā me kēia noi?

No ka hoʻoponopono ʻana i kēia pilikia, pono mākou e hoʻokō i kahi noi kikowaena hiki ke ʻae i nā noi HTTP a hoʻihoʻi hou iā lākou i kēlā me kēia i ka mea hana PHP me ka pepehi ʻole iā ia i kēlā me kēia manawa.

Ua ʻike mākou hiki iā mākou ke kākau i kahi kikowaena pūnaewele ma ka PHP maʻemaʻe (PHP-PM) a i ʻole ka hoʻohana ʻana i ka extension C (Swoole). A ʻoiai ua loaʻa i kēlā me kēia ala kona pono ponoʻī, ʻaʻole i kūpono nā koho ʻelua iā mākou - makemake mākou i kahi mea hou aʻe. Pono mākou ma mua o kahi kikowaena pūnaewele wale nō - ua manaʻo mākou e loaʻa kahi hopena e hiki ke hoʻopakele iā mākou mai nā pilikia e pili ana i kahi "hoʻomaka paʻakikī" ma PHP, i ka manawa like hiki ke maʻalahi a hoʻonui ʻia no nā noi kikoʻī. ʻO ia hoʻi, pono mākou i kahi kikowaena noi.

Hiki iā Go ke kōkua me kēia? Ua ʻike mākou hiki iā ia no ka mea hoʻohui ka ʻōlelo i nā noi i loko o nā binaries hoʻokahi; he kahua kea; hoʻohana i kāna kumu hoʻohālike ponoʻī, nani loa, ʻano hana like (concurrency) a me kahi waihona no ka hana ʻana me HTTP; a ʻo ka hope loa, e loaʻa iā mākou nā kaukani o nā hale waihona puke a me nā hoʻohui.

Nā pilikia o ka hoʻohui ʻana i ʻelua mau ʻōlelo papahana

ʻO ka mea mua, pono e hoʻoholo pehea e kamaʻilio ai nā noi ʻelua a ʻoi aku kekahi i kekahi.

No ka laʻana, hoʻohana hale waihona puke maikaʻi loa Alex Palaestras, ua hiki ke kaʻana like i ka hoʻomanaʻo ma waena o nā kaʻina PHP a me Go (e like me mod_php ma Apache). Akā, he mau hiʻohiʻona kēia waihona e kaupalena ʻia ai kona hoʻohana ʻana no ka hoʻoponopono ʻana i kā mākou pilikia.

Ua hoʻoholo mākou e hoʻohana i kahi ala ʻē aʻe, ʻoi aku ka maʻamau: e kūkulu i ka pilina ma waena o nā kaʻina hana ma o nā kumu / pipeline. Ua hōʻoia kēia ala i ka hilinaʻi i nā makahiki i hala aku nei a ua hoʻopaʻa maikaʻi ʻia ma ka pae ʻōnaehana hana.

No ka hoʻomaka ʻana, ua hana mākou i kahi protocol binary maʻalahi no ka hoʻololi ʻana i ka ʻikepili ma waena o nā kaʻina hana a me ka mālama ʻana i nā hewa hoʻouna. Ma konaʻano maʻalahi, ua like kēiaʻano protocol net string с poʻomanaʻo pūʻolo nui paʻa (i kā mākou hihia 17 bytes), aia ka ʻike e pili ana i ke ʻano o ka ʻeke, kona nui a me kahi mask binary e nānā i ka pono o ka ʻikepili.

Ma ka ʻaoʻao PHP mākou i hoʻohana ai hana pūʻolo, a ma ka ʻaoʻao Go, ka waihona hoʻopāpā/binary.

Me he mea lā ʻaʻole lawa ka protocol hoʻokahi - a ua hoʻohui mākou i ka hiki ke kelepona net/rpc hele pololei mai PHP. Ma hope mai, ua kōkua nui kēia iā mākou i ka hoʻomohala ʻana, no ka mea hiki iā mākou ke hoʻohui maʻalahi i nā hale waihona puke Go i nā polokalamu PHP. Hiki ke ʻike ʻia ka hopena o kēia hana, no ka laʻana, i kā mākou huahana open-source ʻē aʻe Goridge.

Ka hāʻawi ʻana i nā hana ma waena o nā limahana PHP he nui

Ma hope o ka hoʻokō ʻana i ka mīkini pili, hoʻomaka mākou e noʻonoʻo e pili ana i ke ala kūpono loa e hoʻololi i nā hana i nā kaʻina PHP. Ke hiki mai kahi hana, pono e koho ke kikowaena noi i kahi limahana manuahi e hoʻokō. Inā puka ka mea hana/kaʻina hana me ka hewa a i ʻole "make", hoʻopau mākou iā ia a hana i kahi mea hou e pani ai. A inā ua hoʻokō pono ka mea hana/kaʻina hana, e hoʻihoʻi mākou iā ia i ka pūnāwai o nā limahana i hiki ke hana i nā hana.

RoadRunner: ʻAʻole kūkulu ʻia ʻo PHP e make, a i ʻole ʻo Golang e hoʻopakele

No ka mālama ʻana i ka loko o nā limahana hana, hoʻohana mākou kaila pale, no ka wehe ʻana i nā limahana "make" i manaʻo ʻole ʻia mai ka loko wai, ua hoʻohui mākou i kahi mīkini no ka nānā ʻana i nā hewa a me nā mokuʻāina o nā limahana.

ʻO ka hopena, ua loaʻa iā mākou kahi kikowaena PHP hana hiki ke hoʻoponopono i nā noi i hōʻike ʻia ma ke ʻano binary.

I mea e hoʻomaka ai kā mākou noi e hana ma ke ʻano he kikowaena pūnaewele, pono mākou e koho i kahi maʻamau PHP pono e hōʻike i nā noi HTTP e hiki mai ana. I ko mākou hihia, ʻo mākou wale nō hoʻololi net/http noi mai Go to format PSR-7i kūpono ia me ka hapa nui o ka PHP frameworks i loaʻa i kēia lā.

No ka mea, ua manaʻo ʻia ʻo PSR-7 ʻaʻole hiki ke hoʻololi ʻia (e ʻōlelo kekahi poʻe ʻaʻole ia), pono nā mea hoʻomohala e kākau i nā noi i mālama ʻole i ka noi ma ke ʻano he hui honua. Ua kūpono kēia me ka manaʻo o nā kaʻina hana PHP lōʻihi. ʻO kā mākou hoʻokō hope, ʻaʻole i kapa ʻia, ua like kēia:

RoadRunner: ʻAʻole kūkulu ʻia ʻo PHP e make, a i ʻole ʻo Golang e hoʻopakele

Ke hoʻolauna nei iā RoadRunner - kiʻekiʻe hana PHP polokalamu kikowaena

ʻO kā mākou hana hoʻāʻo mua he API backend, ka mea e hāhā i kēlā me kēia manawa me ka manaʻo ʻole (ʻoi aku ka nui ma mua o ka maʻamau). ʻOiai ua lawa ka nginx i ka hapa nui o nā hihia, ʻike pinepine mākou i nā hewa 502 no ka mea ʻaʻole hiki iā mākou ke kaulike i ka ʻōnaehana wikiwiki no ka piʻi ʻana o ka ukana.

No ka hoʻololi ʻana i kēia hoʻonā, ua kau mākou i kā mākou kikowaena noi PHP/Go mua i ka hoʻomaka ʻana o 2018. A loaʻa koke kahi hopena kupaianaha! ʻAʻole wale mākou i hoʻopau loa i ka hewa 502, akā ua hiki iā mākou ke hōʻemi i ka helu o nā kikowaena i ʻelua hapakolu, e mālama ana i ka nui o ke kālā a me nā lāʻau poʻo no nā ʻenekinia a me nā mea hoʻokele huahana.

Ma ka waena o ka makahiki, ua hoʻomaikaʻi mākou i kā mākou hopena, paʻi ʻia ma GitHub ma lalo o ka laikini MIT a kapa ʻia. Alanui Alanui, no laila e hoʻoikaika ana i kona wikiwiki a me ka pono.

Pehea e hiki ai iā RoadRunner ke hoʻomaikaʻi i kāu waihona hoʻomohala

Ka hoʻohana Alanui Alanui ʻae iā mākou e hoʻohana i ka Middleware net/http ma ka ʻaoʻao Go e hana i ka hōʻoia JWT ma mua o ka hiki ʻana o ka noi i PHP, a me ka lawelawe ʻana i nā WebSockets a me ka mokuʻāina aggregate honua ma Prometheus.

Mahalo i ka RPC i kūkulu ʻia, hiki iā ʻoe ke wehe i ka API o nā hale waihona puke Go no PHP me ke kākau ʻole ʻana i nā mea hoʻopili hoʻonui. ʻO ka mea nui aku, me RoadRunner hiki iā ʻoe ke kau i nā kikowaena non-HTTP hou. ʻO nā laʻana e pili ana i nā mea lawelawe ma PHP ʻO AWS Lambda, ka hana ʻana i nā mea haki laina hilinaʻi, a me ka hoʻohui ʻana gRPC i kā mākou mau noi.

Me ke kōkua o nā kaiāulu PHP a me Go, ua hoʻomaikaʻi mākou i ke kūpaʻa o ka hopena, hoʻonui i ka hana noi a hiki i 40 mau manawa i kekahi mau hoʻāʻo, hoʻomaikaʻi i nā mea hana debugging, hoʻokō i ka hoʻohui ʻana me ka Symfony framework, a hoʻohui i ke kākoʻo no HTTPS, HTTP/2, plugins, a me PSR-17.

hopena

Loaʻa ʻia kekahi poʻe i ka manaʻo o ka PHP ma ke ʻano he ʻōlelo lohi a paʻakikī wale nō no ka kākau ʻana i nā plugins no WordPress. E ʻōlelo paha kēia poʻe he palena ka PHP: i ka nui o ka noi, pono ʻoe e koho i kahi ʻōlelo "ʻoi aʻe" a kākau hou i ka waihona code i hōʻiliʻili ʻia i nā makahiki he nui.

I kēia mau mea a pau, makemake wau e pane: e noʻonoʻo hou. Ke manaʻoʻiʻo nei mākou ʻo ʻoe wale nō ka mea i kau i nā palena no PHP. Hiki iā ʻoe ke hoʻolilo i kou ola holoʻokoʻa i ka hoʻololi ʻana mai kahi ʻōlelo a i kekahi, e ʻimi ana i ka hoʻokūkū kūpono no kāu mau pono, a i ʻole hiki iā ʻoe ke hoʻomaka e noʻonoʻo i nā ʻōlelo he mau mea hana. ʻO nā hemahema i manaʻo ʻia o ka ʻōlelo e like me PHP ke kumu o kona kūleʻa. A inā ʻoe e hui pū me kekahi ʻōlelo ʻē aʻe e like me Go, a laila e hana ʻoe i nā huahana ʻoi aku ka ikaika ma mua o ka palena o ka hoʻohana ʻana i kekahi ʻōlelo.

Ma hope o ka hana ʻana me kahi pūʻulu o Go a me PHP, hiki iā mākou ke ʻōlelo he aloha mākou iā lākou. ʻAʻole mākou e hoʻolālā e mōhai aku i kekahi no kekahi - akā, e ʻimi mākou i nā ala e loaʻa ai ka waiwai hou aʻe mai kēia waihona pālua.

UPD: mahalo mākou i ka mea nāna i hana iā RoadRunner a me ka mea kākau kumu o ka ʻatikala kumu - Lachesis

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka