RoadRunner: PHP tsis tsim kom tuag, lossis Golang rau kev cawm

RoadRunner: PHP tsis tsim kom tuag, lossis Golang rau kev cawm

Hlo Habr! Peb ua haujlwm ntawm Badoo ua haujlwm ntawm PHP kev ua haujlwm, txij li thaum peb muaj cov kab ke loj loj hauv cov lus no thiab qhov teeb meem kev ua haujlwm yog qhov teeb meem txuag nyiaj. Ntau tshaj li kaum xyoo dhau los, peb tsim PHP-FPM rau qhov no, uas thaum xub thawj yog ib txheej ntawm thaj ua rau thaj rau PHP, thiab tom qab ntawd nkag mus rau hauv kev faib tawm.

Nyob rau hauv xyoo tas los no, PHP tau ua tiav zoo: cov khoom khib nyiab tau txhim kho, theem ntawm kev ruaj ntseg tau nce - hnub no koj tuaj yeem sau daemons thiab cov ntawv nyob ntev hauv PHP yam tsis muaj teeb meem. Qhov no tso cai rau Spiral Scout mus ntxiv: RoadRunner, tsis zoo li PHP-FPM, tsis ntxuav lub cim xeeb ntawm kev thov, uas ua rau muaj kev ua tau zoo ntxiv (txawm tias txoj hauv kev no ua rau nyuaj rau txoj kev loj hlob). Tam sim no peb tab tom sim nrog cov cuab yeej no, tab sis peb tseem tsis tau muaj cov txiaj ntsig los qhia. Ua kom tos lawv lom zem dua, peb luam tawm cov lus txhais ntawm RoadRunner tshaj tawm los ntawm Spiral Scout.

Txoj hauv kev los ntawm tsab xov xwm yog nyob ze rau peb: thaum daws peb cov teeb meem, peb kuj feem ntau siv ib pawg ntawm PHP thiab Mus, tau txais txiaj ntsig ntawm ob hom lus thiab tsis tso tseg ib qho kev nyiam ntawm lwm tus.

Txaus siab rau!

Hauv kaum xyoo dhau los, peb tau tsim cov ntawv thov rau cov tuam txhab los ntawm cov npe Fortune 500, thiab rau cov lag luam nrog cov neeg tuaj saib tsis pub tshaj 500 tus neeg siv. Txhua lub sijhawm no, peb cov engineers tau tsim cov backend feem ntau hauv PHP. Tab sis ob xyoos dhau los, ib yam dab tsi muaj kev cuam tshuam loj heev tsis yog ntawm kev ua tau zoo ntawm peb cov khoom, tab sis kuj ntawm lawv cov scalability - peb tau qhia Golang (Go) rau hauv peb cov txheej txheem thev naus laus zis.

Yuav luag tam sim ntawd, peb pom tias Go tso cai rau peb tsim cov ntawv thov loj dua nrog txog 40x kev txhim kho. Nrog nws, peb muaj peev xwm txuas ntxiv cov khoom uas twb muaj lawm sau hauv PHP, txhim kho lawv los ntawm kev sib txuas qhov zoo ntawm ob hom lus.

Peb yuav qhia koj tias kev sib xyaw ua ke ntawm Go thiab PHP pab daws cov teeb meem kev loj hlob tiag tiag thiab yuav ua li cas nws tau hloov mus ua ib qho cuab yeej rau peb uas tuaj yeem tshem tawm qee qhov teeb meem cuam tshuam nrog. PHP tuag qauv.

Koj qhov chaw tsim kho PHP txhua hnub

Ua ntej peb tham txog yuav ua li cas koj tuaj yeem siv Mus rau rov kho tus qauv PHP tuag, cia peb saib koj qhov chaw tsim kho PHP default.

Feem ntau, koj khiav koj daim ntawv thov siv kev sib txuas ntawm nginx web server thiab PHP-FPM server. Tus qub ua haujlwm zoo li qub cov ntaub ntawv thiab rov xa cov lus thov tshwj xeeb rau PHP-FPM, thaum PHP-FPM nws tus kheej ua rau PHP code. Tej zaum koj yuav tau siv qhov tsis tshua nyiam ua ke ntawm Apache thiab mod_php. Tab sis txawm hais tias nws ua haujlwm txawv me ntsis, cov ntsiab cai yog tib yam.

Cia wb mus saib yuav ua li cas PHP-FPM executes daim ntawv thov code. Thaum qhov kev thov tuaj rau hauv, PHP-FPM pib ua tus txheej txheem PHP tus menyuam thiab dhau cov ntsiab lus ntawm qhov kev thov ua ib feem ntawm nws lub xeev (_GET, _POST, _SERVER, thiab lwm yam).

Lub xeev tsis tuaj yeem hloov pauv thaum ua tiav PHP tsab ntawv, yog li tsuas muaj ib txoj hauv kev kom tau txais cov ntaub ntawv nkag tshiab: los ntawm kev tshem tawm cov txheej txheem nco thiab rov pib dua.

Qhov kev ua qauv no muaj ntau yam zoo. Koj tsis tas yuav txhawj xeeb ntau dhau ntawm kev nco qab, tag nrho cov txheej txheem raug cais tawm tag nrho, thiab yog tias ib tus ntawm lawv "tuag", nws yuav rov tsim dua tshiab thiab nws yuav tsis cuam tshuam rau cov txheej txheem ntxiv. Tab sis txoj hauv kev no kuj muaj qhov tsis zoo uas tshwm sim thaum sim ntsuas cov ntawv thov.

Qhov tsis zoo thiab tsis muaj txiaj ntsig ntawm PHP Ib puag ncig tsis tu ncua

Yog tias koj yog tus kws tshaj lij PHP tsim tawm, tom qab ntawd koj paub qhov twg los pib qhov project tshiab - nrog rau kev xaiv ntawm lub moj khaum. Nws muaj cov tsev qiv ntawv kev txhaj tshuaj, ORMs, kev txhais lus thiab cov qauv. Thiab, tau kawg, txhua tus neeg siv cov tswv yim tuaj yeem yooj yim muab tso rau hauv ib qho khoom (Symfony/HttpFoundation lossis PSR-7). Frameworks txias!

Tab sis txhua yam muaj nws tus nqi. Nyob rau hauv ib qho kev lag luam-theem lub hauv paus, txhawm rau ua cov neeg siv yooj yim thov lossis nkag mus rau hauv cov ntaub ntawv, koj yuav tsum thauj khoom tsawg kawg kaum ob ntawm cov ntaub ntawv, tsim ntau cov chav kawm thiab txheeb xyuas ntau qhov kev teeb tsa. Tab sis qhov phem tshaj plaws yog tias tom qab ua tiav txhua txoj haujlwm, koj yuav tsum rov pib dua txhua yam thiab pib dua: tag nrho cov cai uas koj nyuam qhuav pib ua tsis muaj txiaj ntsig, nrog nws txoj kev pab koj yuav tsis ua dua lwm qhov kev thov. Qhia qhov no rau txhua tus programmer uas sau ua lwm hom lus, thiab koj yuav pom qhov tsis txaus ntseeg ntawm nws lub ntsej muag.

PHP engineers tau nrhiav txoj hauv kev los daws qhov teeb meem no tau ntau xyoo, siv cov txuj ci ntse tub nkeeg-loading, microframeworks, optimized tsev qiv ntawv, cache, thiab lwm yam. Tab sis thaum kawg, koj tseem yuav tau rov pib dua tag nrho daim ntawv thov thiab pib dua, rov ua dua. . (Tus neeg txhais lus ceeb toom: qhov teeb meem no yuav raug daws ib nrab nrog rau qhov tshwm sim ntawm preload hauv PHP 7.4)

PHP nrog Go puas tuaj yeem muaj sia nyob ntau dua ib qho kev thov?

Nws muaj peev xwm sau PHP scripts uas nyob ntev tshaj li ob peb feeb (txog li teev los yog hnub): piv txwv li, cron hauj lwm, CSV parser, queue breakers. Lawv txhua tus ua haujlwm raws li qhov xwm txheej zoo ib yam: lawv rov qab ua haujlwm, ua tiav, thiab tos lwm qhov. Cov cai nyob hauv lub cim xeeb txhua lub sijhawm, txuag cov milliseconds uas muaj nuj nqis vim tias muaj ntau cov kauj ruam ntxiv uas yuav tsum tau ua kom thauj khoom lub moj khaum thiab daim ntawv thov.

Tab sis kev tsim cov ntawv nyob ntev tsis yooj yim. Txhua qhov kev ua yuam kev ua rau tag nrho cov txheej txheem, kev kuaj xyuas lub cim xeeb xau yog infuriating, thiab F5 debugging tsis tuaj yeem ua tau.

Qhov xwm txheej tau txhim kho nrog kev tso tawm ntawm PHP 7: tus neeg khaws cov khib nyiab uas ntseeg tau tau tshwm sim, nws tau dhau los ua yooj yim los daws qhov tsis raug, thiab cov ntsiav txuas ntxiv tam sim no xau pov thawj. Muaj tseeb tiag, engineers tseem yuav tsum tau ceev faj nrog kev nco thiab paub txog cov teeb meem hauv lub xeev hauv cov cai (Puas muaj ib hom lus uas tuaj yeem tsis quav ntsej txog tej yam no?). Tseem, PHP 7 muaj tsawg qhov xav tsis thoob hauv khw rau peb.

Puas yog nws muaj peev xwm coj tus qauv ntawm kev ua haujlwm nrog PHP scripts ntev, hloov nws mus rau ntau yam haujlwm tsis tseem ceeb xws li ua HTTP thov, thiab yog li tshem tawm qhov xav tau los thauj txhua yam ntawm kos nrog txhua qhov kev thov?

Txhawm rau daws qhov teeb meem no, peb thawj zaug yuav tsum siv daim ntawv thov server uas tuaj yeem lees txais HTTP thov thiab xa lawv ib qho los ntawm ib tus neeg ua haujlwm PHP yam tsis tau tua nws txhua zaus.

Peb paub tias peb tuaj yeem sau lub vev xaib server hauv PHP ntshiab (PHP-PM) lossis siv C txuas ntxiv (Swoole). Thiab txawm hais tias txhua txoj kev muaj nws tus kheej zoo, ob qho kev xaiv tsis haum rau peb - ​​peb xav tau ib yam dab tsi ntxiv. Peb xav tau ntau tshaj li qhov web server - peb xav kom tau txais kev daws teeb meem uas tuaj yeem cawm peb ntawm cov teeb meem cuam tshuam nrog "kev pib nyuaj" hauv PHP, uas tib lub sijhawm tuaj yeem hloov kho tau yooj yim thiab txuas ntxiv rau cov ntawv thov tshwj xeeb. Ntawd yog, peb xav tau daim ntawv thov server.

Mus pab tau qhov no? Peb paub tias nws ua tau vim hais tias cov lus compiles daim ntaub ntawv mus rau hauv ib tug binaries; nws yog cross-platform; siv nws tus kheej, zoo nkauj heev, ua qauv ua piv txwv (concurrency) thiab lub tsev qiv ntawv rau kev ua haujlwm nrog HTTP; thiab thaum kawg, ntau txhiab lub tsev qiv ntawv qhib thiab kev koom ua ke yuav muaj rau peb.

Qhov nyuaj ntawm kev sib txuas ob hom lus programming

Ua ntej tshaj plaws, nws yuav tsum tau txiav txim siab seb ob lossis ntau daim ntawv thov yuav sib txuas lus li cas.

Piv txwv li, siv tsev qiv ntawv zoo heev Alex Palaestras, nws muaj peev xwm sib qhia nco ntawm PHP thiab Go txheej txheem (zoo ib yam li mod_php hauv Apache). Tab sis lub tsev qiv ntawv no muaj cov yam ntxwv txwv nws siv los daws peb cov teeb meem.

Peb tau txiav txim siab siv txoj hauv kev sib txawv, ntau dua: los tsim kev sib cuam tshuam ntawm cov txheej txheem los ntawm cov qhov (sockets / pipelines). Txoj hauv kev no tau ua pov thawj tias muaj kev ntseeg siab nyob rau xyoo dhau los thiab tau ua kom zoo tshaj plaws ntawm qib kev ua haujlwm.

Yuav pib nrog, peb tsim ib qho yooj yim binary raws tu qauv rau kev sib pauv cov ntaub ntawv ntawm cov txheej txheem thiab tuav kis tau tus mob yuam kev. Hauv nws daim ntawv yooj yim tshaj plaws, hom kev cai no zoo ib yam li netstring с tsau loj pob ntawv header (hauv peb cov ntaub ntawv 17 bytes), uas muaj cov ntaub ntawv hais txog hom pob ntawv, nws qhov loj me thiab lub ntsej muag binary los xyuas qhov tseeb ntawm cov ntaub ntawv.

Ntawm PHP sab peb siv pob muaj nuj nqi, thiab nyob rau sab Go, lub tsev qiv ntawv encoding/binary.

Nws zoo nkaus li peb tias ib txoj cai tsis txaus - thiab peb ntxiv lub peev xwm hu net/rpc mus rau kev pabcuam ncaj qha los ntawm PHP. Tom qab ntawd, qhov no tau pab peb ntau heev hauv kev txhim kho, txij li peb tuaj yeem yooj yim integrate Go cov tsev qiv ntawv rau hauv PHP daim ntawv thov. Cov txiaj ntsig ntawm txoj haujlwm no tuaj yeem pom, piv txwv li, hauv peb lwm cov khoom siv qhib Goridge.

Kev faib cov dej num hla ntau tus neeg ua haujlwm PHP

Tom qab siv cov txheej txheem kev sib cuam tshuam, peb pib xav txog txoj hauv kev zoo tshaj plaws los hloov cov dej num rau PHP txheej txheem. Thaum ib txoj haujlwm tuaj txog, daim ntawv thov server yuav tsum xaiv tus neeg ua haujlwm pub dawb los ua nws. Yog tias tus neeg ua haujlwm / txheej txheem tawm nrog qhov yuam kev lossis "tuag", peb tshem nws thiab tsim ib qho tshiab los hloov nws. Thiab yog tias tus neeg ua haujlwm / txheej txheem tau ua tiav tiav, peb xa rov qab mus rau lub pas dej ntawm cov neeg ua haujlwm muaj los ua haujlwm.

RoadRunner: PHP tsis tsim kom tuag, lossis Golang rau kev cawm

Txhawm rau khaws lub pas dej ntawm cov neeg ua haujlwm nquag, peb siv buffed channel, txhawm rau tshem tawm cov neeg ua haujlwm "tuag" yam tsis tau npaj tseg los ntawm lub pas dej, peb ntxiv cov txheej txheem rau kev taug qab qhov yuam kev thiab xeev ntawm cov neeg ua haujlwm.

Raws li qhov tshwm sim, peb tau txais PHP server ua haujlwm muaj peev xwm ua tiav txhua qhov kev thov nthuav tawm hauv daim ntawv binary.

Txhawm rau kom peb daim ntawv thov pib ua haujlwm raws li lub vev xaib server, peb yuav tsum xaiv tus qauv PHP txhim khu kev qha los sawv cev rau txhua qhov kev thov HTTP tuaj. Hauv peb qhov xwm txheej, peb tsuas yog hloov net/http thov los ntawm Mus rau hom PSR-7yog li ntawd nws yog sib xws nrog feem ntau ntawm PHP moj khaum muaj hnub no.

Vim tias PSR-7 suav tias yog qhov hloov tsis tau (qee tus yuav hais tias nws tsis yog), cov neeg tsim khoom yuav tsum sau cov ntawv thov uas tsis kho qhov kev thov raws li lub hauv paus ntsiab lus. Qhov no haum zoo nrog lub tswv yim ntawm cov txheej txheem PHP ntev. Peb qhov kev siv zaum kawg, uas tseem tsis tau muaj npe, zoo li no:

RoadRunner: PHP tsis tsim kom tuag, lossis Golang rau kev cawm

Qhia RoadRunner - kev ua haujlwm siab PHP thov server

Peb qhov kev sim thawj zaug yog API backend, uas ib ntus bursts unpredictably (ntau zaus ntau dua li ib txwm). Txawm hais tias nginx tau txaus nyob rau hauv feem ntau, peb niaj hnub ntsib qhov yuam kev 502 vim tias peb tsis tuaj yeem sib npaug ntawm lub kaw lus sai txaus rau qhov kev cia siab ntawm kev thauj khoom.

Txhawm rau hloov qhov kev daws teeb meem no, peb tau xa peb tus thawj PHP / Go daim ntawv thov server thaum ntxov 2018. Thiab tam sim ntawd tau txais txiaj ntsig zoo kawg! Tsis tsuas yog peb tau tshem ntawm 502 qhov yuam kev tag nrho, tab sis peb tuaj yeem txo tus naj npawb ntawm cov servers los ntawm ob feem peb, txuag nyiaj ntau thiab mob taub hau rau cov kws tsim khoom thiab cov thawj coj khoom.

Los ntawm nruab nrab ntawm lub xyoo, peb tau txhim kho peb cov kev daws teeb meem, luam tawm nws ntawm GitHub raws li MIT daim ntawv tso cai thiab muab nws lub npe Roadrunner, yog li hais txog nws qhov zoo kawg ceev thiab efficiency.

Yuav ua li cas RoadRunner tuaj yeem txhim kho koj pawg txhim kho

Daim ntawv thov Roadrunner tso cai rau peb siv Middleware net / http ntawm sab Go los ua JWT cov ntaub ntawv pov thawj ua ntej qhov kev thov mus txog PHP, nrog rau tuav WebSockets thiab sib sau lub xeev thoob ntiaj teb hauv Prometheus.

Ua tsaug rau RPC built-in, koj tuaj yeem qhib API ntawm ib lub tsev qiv ntawv Go rau PHP yam tsis tau sau ntawv txuas ntxiv. Qhov tseem ceeb tshaj, nrog RoadRunner koj tuaj yeem xa cov servers tshiab uas tsis yog HTTP. Piv txwv suav nrog cov neeg ua haujlwm khiav hauv PHP AWS Lambda, tsim txhim khu kev qha queue breakers, thiab txawm ntxiv GRPC rau peb daim ntawv thov.

Nrog kev pab los ntawm PHP thiab Go cov zej zog, peb tau txhim kho kev ruaj ntseg ntawm cov kev daws teeb meem, nce kev ua haujlwm ntawm daim ntawv thov mus txog 40 zaug hauv qee qhov kev xeem, txhim kho cov cuab yeej debugging, siv kev koom ua ke nrog Symfony moj khaum, thiab ntxiv kev txhawb nqa rau HTTPS, HTTP / 2, plugins, thiab PSR-17.

xaus

Qee tus neeg tseem raug ntes tau nyob rau hauv qhov kev xav tsis zoo ntawm PHP raws li lus qeeb, tsis muaj kev cuam tshuam tsuas yog zoo rau kev sau plugins rau WordPress. Cov neeg no tej zaum txawm hais tias PHP muaj qhov txwv: thaum daim ntawv thov loj txaus, koj yuav tsum xaiv cov lus "mature" dua thiab rov sau cov lej hauv qab tau ntau xyoo.

Rau tag nrho cov no kuv xav teb: xav dua. Peb ntseeg hais tias tsuas yog koj teem ib qho kev txwv rau PHP. Koj tuaj yeem siv tag nrho koj lub neej hloov ntawm ib hom lus mus rau lwm qhov, sim nrhiav qhov zoo tshaj plaws match rau koj cov kev xav tau, lossis koj tuaj yeem pib xav txog cov lus ua cov cuab yeej. Qhov kev xav tsis zoo ntawm cov lus zoo li PHP tej zaum yuav yog vim li cas rau nws txoj kev vam meej. Thiab yog tias koj muab nws nrog lwm hom lus zoo li Go, ces koj yuav tsim cov khoom muaj zog ntau dua li yog tias koj raug txwv rau kev siv ib hom lus.

Tau ua haujlwm nrog ib pawg ntawm Go thiab PHP, peb tuaj yeem hais tias peb hlub lawv. Peb tsis npaj yuav txi ib qho rau lwm tus - ntawm qhov tsis sib xws, peb yuav nrhiav txoj hauv kev kom tau txais txiaj ntsig ntau dua los ntawm pawg ob pawg no.

UPD: peb zoo siab tos txais tus tsim RoadRunner thiab tus kws sau ntawv ntawm thawj tsab xov xwm - Lachesis

Tau qhov twg los: www.hab.com

Ntxiv ib saib