RoadRunner: Ang PHP wala gihimo aron mamatay, o ang Golang sa pagluwas

RoadRunner: Ang PHP wala gihimo aron mamatay, o ang Golang sa pagluwas

Hoy Habr! Aktibo mi sa Badoo nagtrabaho sa performance sa PHP, tungod kay kami adunay usa ka medyo dako nga sistema sa kini nga lengguwahe ug ang isyu sa pasundayag usa ka isyu sa pagtipig sa salapi. Kapin sa napulo ka tuig ang milabay, naghimo kami ug PHP-FPM alang niini, nga sa sinugdan usa ka hugpong sa mga patch alang sa PHP, ug sa ulahi misulod sa opisyal nga pag-apod-apod.

Sa bag-ohay nga mga tuig, ang PHP nakahimo og dako nga pag-uswag: ang tigkolekta sa basura milambo, ang lebel sa kalig-on miuswag - karon mahimo nimong isulat ang mga daemon ug dugay na nga mga script sa PHP nga wala’y problema. Gitugotan niini ang Spiral Scout sa pagpadayon: Ang RoadRunner, dili sama sa PHP-FPM, wala maglimpyo sa panumduman tali sa mga hangyo, nga naghatag dugang nga ganansya sa pasundayag (bisan kung kini nga pamaagi nagkomplikado sa proseso sa pag-uswag). Kami karon nag-eksperimento sa kini nga himan, apan wala pa kami mga resulta nga ipaambit. Para mas lingaw ang paghulat nila, gimantala namo ang hubad sa pahibalo sa RoadRunner gikan sa Spiral Scout.

Ang pamaagi gikan sa artikulo duol sa amon: kung gisulbad ang among mga problema, kanunay usab namon nga gigamit ang usa ka hugpong sa PHP ug Go, nakuha ang mga benepisyo sa duha nga mga sinultian ug dili biyaan ang usa pabor sa lain.

Enjoy!

Sa miaging napulo ka tuig, naghimo kami mga aplikasyon alang sa mga kompanya gikan sa lista swerte 500, ug alang sa mga negosyo nga adunay mamiminaw nga dili mosobra sa 500 ka tiggamit. Niining panahona, ang among mga inhenyero nagpalambo sa backend labi na sa PHP. Apan duha ka tuig na ang milabay, adunay usa ka butang nga adunay dako nga epekto dili lamang sa performance sa among mga produkto, apan usab sa ilang scalability - among gipaila ang Golang (Go) sa among teknolohiya nga stack.

Diha-diha dayon, among nadiskobrehan nga gitugotan kami ni Go sa paghimo og mas dagkong mga aplikasyon nga adunay hangtod sa 40x nga pagpaayo sa performance. Uban niini, nakahimo kami sa pagpalapad sa kasamtangan nga mga produkto nga gisulat sa PHP, pagpalambo niini pinaagi sa paghiusa sa mga bentaha sa duha ka mga pinulongan.

Isulti namo kanimo kung giunsa ang kombinasyon sa Go ug PHP makatabang sa pagsulbad sa tinuod nga mga problema sa pag-uswag ug kung giunsa kini nahimo nga usa ka himan alang kanamo nga makatangtang sa pipila nga mga problema nga adunay kalabotan sa PHP himatyon nga modelo.

Ang imong adlaw-adlaw nga palibot sa pagpalambo sa PHP

Sa dili pa kita maghisgot kon unsaon nimo paggamit ang Go aron buhion ang PHP himatyon nga modelo, atong tan-awon ang imong default PHP development environment.

Sa kadaghanan nga mga kaso, gipadagan nimo ang imong aplikasyon gamit ang kombinasyon sa nginx web server ug PHP-FPM server. Ang nahauna nag-alagad sa mga static nga mga file ug nag-redirect sa piho nga mga hangyo sa PHP-FPM, samtang ang PHP-FPM mismo ang nagpatuman sa PHP code. Mahimo nimong gamiton ang dili kaayo popular nga kombinasyon sa Apache ug mod_php. Apan bisan kung kini molihok nga medyo lahi, ang mga prinsipyo managsama.

Atong tan-awon kung giunsa pagpatuman sa PHP-FPM ang code sa aplikasyon. Kung moabut ang usa ka hangyo, ang PHP-FPM magsugod sa usa ka proseso sa bata sa PHP ug ipasa ang mga detalye sa hangyo ingon bahin sa estado niini (_GET, _POST, _SERVER, ug uban pa).

Ang estado dili mausab sa panahon sa pagpatuman sa usa ka PHP script, mao nga ang bugtong paagi sa pagkuha sa usa ka bag-o nga set sa input data mao ang pinaagi sa paghawan sa proseso sa panumduman ug sa pagsugod niini pag-usab.

Kini nga modelo sa pagpatuman adunay daghang mga bentaha. Dili nimo kinahanglan nga mabalaka pag-ayo bahin sa pagkonsumo sa panumduman, ang tanan nga mga proseso hingpit nga nahimulag, ug kung ang usa kanila "mamatay", awtomatiko kini nga himuon pag-usab ug dili kini makaapekto sa nahabilin nga mga proseso. Apan kini nga pamaagi adunay mga disbentaha usab nga makita kung gisulayan ang pag-scale sa aplikasyon.

Mga Disadvantages ug Inefficiencies sa usa ka Regular nga PHP Environment

Kung ikaw usa ka propesyonal nga developer sa PHP, nan nahibal-an nimo kung asa magsugod ang usa ka bag-ong proyekto - nga adunay pagpili sa usa ka balangkas. Kini naglangkob sa dependency injection library, ORMs, hubad ug templates. Ug, siyempre, ang tanan nga input sa gumagamit mahimong dali nga ibutang sa usa ka butang (Symfony/HttpFoundation o PSR-7). Nindot ang mga frameworks!

Apan ang tanan adunay iyang presyo. Sa bisan unsang gambalay sa lebel sa negosyo, aron maproseso ang usa ka yano nga hangyo sa gumagamit o pag-access sa usa ka database, kinahanglan nimo nga i-load ang labing menos dosena nga mga file, maghimo daghang mga klase ug mag-parse sa daghang mga pag-configure. Apan ang pinakagrabe nga butang mao nga human makompleto ang matag buluhaton, kinahanglan nimo nga i-reset ang tanan ug magsugod pag-usab: ang tanan nga code nga imong gisugdan mahimong walay kapuslanan, uban sa tabang niini dili ka na magproseso sa laing hangyo. Isulti kini sa bisan kinsa nga programmer nga nagsulat sa laing pinulongan, ug makita nimo ang kalibog sa iyang nawong.

Ang mga inhenyero sa PHP nangita og mga paagi aron masulbad kini nga problema sulod sa mga katuigan, gamit ang maalamon nga mga teknik sa pagkarga, microframeworks, optimized nga mga librarya, cache, ug uban pa. (Mubo nga sulat sa maghuhubad: kini nga problema partially masulbad sa pag-abot sa preload sa PHP 7.4)

Makalahutay ba ang PHP uban sa Go labaw sa usa ka hangyo?

Posible ang pagsulat sa mga script sa PHP nga mabuhi ug mas taas kaysa pipila ka minuto (hangtod sa mga oras o mga adlaw): pananglitan, mga buluhaton sa cron, mga parser sa CSV, mga tigputol sa pila. Tanan sila nagtrabaho sumala sa parehas nga senaryo: gibawi nila ang usa ka buluhaton, gipatuman kini, ug naghulat sa sunod. Ang code anaa sa panumduman sa tanang panahon, nga makadaginot sa bililhong mga millisecond tungod kay adunay daghang dugang nga mga lakang nga gikinahanglan aron makarga ang balangkas ug aplikasyon.

Apan ang pag-ugmad ug dugay nang mga script dili sayon. Ang bisan unsang sayup hingpit nga nakapatay sa proseso, ang pag-diagnose sa mga pagtulo sa memorya makapasuko, ug ang F5 debugging dili na mahimo.

Ang sitwasyon miuswag uban sa pagpagawas sa PHP 7: usa ka kasaligan nga tigkolekta sa basura mitungha, kini nahimong mas sayon ​​sa pagdumala sa mga sayop, ug kernel extension karon leak-proof. Tinuod, ang mga inhenyero kinahanglan pa nga mag-amping sa panumduman ug mahibal-an ang mga isyu sa estado sa code (adunay usa ka sinultian nga makabalewala niining mga butanga?). Bisan pa, ang PHP 7 adunay gamay nga mga sorpresa nga giandam alang kanamo.

Posible ba nga makuha ang modelo sa pagtrabaho sa dugay na nga mga script sa PHP, ipahiangay kini sa labi ka gamay nga mga buluhaton sama sa pagproseso sa mga hangyo sa HTTP, ug sa ingon makuha ang panginahanglan nga i-load ang tanan gikan sa wala sa matag hangyo?

Aron masulbad kini nga problema, kinahanglan una namon nga ipatuman ang usa ka aplikasyon sa server nga makadawat sa mga hangyo sa HTTP ug i-redirect kini usa-usa sa trabahante sa PHP nga dili kini patyon matag higayon.

Nahibal-an namon nga makasulat kami usa ka web server sa lunsay nga PHP (PHP-PM) o gamit ang usa ka extension sa C (Swoole). Ug bisan kung ang matag pamaagi adunay kaugalingon nga mga merito, ang duha nga kapilian dili angay kanamo - gusto namon ang usa ka butang nga labi pa. Nagkinahanglan kami labaw pa sa usa ka web server - gilauman namon nga makakuha usa ka solusyon nga makaluwas kanamo gikan sa mga problema nga adunay kalabotan sa usa ka "lisud nga pagsugod" sa PHP, nga sa samang higayon dali nga mapahiangay ug mapalawig alang sa piho nga mga aplikasyon. Sa ato pa, kinahanglan namon ang usa ka server sa aplikasyon.

Makatabang ba si Go niini? Nahibal-an namon nga mahimo kini tungod kay ang pinulongan nag-compile sa mga aplikasyon ngadto sa usa ka binary; kini usa ka cross-platform; naggamit sa iyang kaugalingon, elegante kaayo, parallel nga modelo sa pagproseso (concurrency) ug usa ka librarya alang sa pagtrabaho uban sa HTTP; ug sa katapusan, liboan ka mga open-source nga librarya ug mga integrasyon ang magamit nato.

Ang mga Kalisud sa Paghiusa sa Duha ka Pinulongan sa Programming

Una sa tanan, gikinahanglan aron mahibal-an kung giunsa ang duha o daghan pa nga mga aplikasyon makigkomunikar sa usag usa.

Pananglitan, ang paggamit maayo kaayo nga librarya Alex Palaestras, posible nga ipaambit ang memorya tali sa mga proseso sa PHP ug Go (sama sa mod_php sa Apache). Apan kini nga librarya adunay mga bahin nga naglimite sa paggamit niini alang sa pagsulbad sa among problema.

Nakahukom kami nga mogamit usa ka lahi, labi ka sagad nga pamaagi: paghimo og interaksyon tali sa mga proseso pinaagi sa mga socket / pipeline. Kini nga pamaagi napamatud-an nga kasaligan sa miaging mga dekada ug maayo nga na-optimize sa lebel sa operating system.

Sa pagsugod, naghimo kami usa ka yano nga binary protocol alang sa pagbayloay sa datos tali sa mga proseso ug pagdumala sa mga sayup sa transmission. Sa pinakasimple nga porma niini, kini nga matang sa protocol susama sa netstring с fixed size packet header (sa among kaso 17 bytes), nga adunay kasayuran bahin sa tipo sa pakete, gidak-on niini ug usa ka binary mask aron masusi ang integridad sa datos.

Sa bahin sa PHP nga among gigamit pack function, ug sa Go side, ang library encoding/binary.

Para kanamo dili igo ang usa ka protocol - ug gidugang namon ang abilidad sa pagtawag net/rpc go serbisyo direkta gikan sa PHP. Sa ulahi, nakatabang kaayo kini kanamo sa pag-uswag, tungod kay dali namong maapil ang mga librarya sa Go sa mga aplikasyon sa PHP. Ang resulta niini nga trabaho makita, pananglitan, sa among uban pang open-source nga produkto Lugut.

Pag-apod-apod sa mga buluhaton sa daghang mga trabahante sa PHP

Human sa pagpatuman sa mekanismo sa interaksyon, nagsugod kami sa paghunahuna mahitungod sa labing episyente nga paagi sa pagbalhin sa mga buluhaton ngadto sa mga proseso sa PHP. Kung moabut ang usa ka buluhaton, ang server sa aplikasyon kinahanglan nga mopili usa ka libre nga trabahante aron ipatuman kini. Kung ang usa ka trabahante/proseso mogawas nga adunay sayup o "namatay", atong kuhaon kini ug maghimo usa ka bag-o aron ilisan kini. Ug kung malampuson nga nahuman ang trabahante/proseso, among ibalik kini sa grupo sa mga trabahante nga magamit aron mahimo ang mga buluhaton.

RoadRunner: Ang PHP wala gihimo aron mamatay, o ang Golang sa pagluwas

Aron tipigan ang pool sa aktibong mga trabahante, among gigamit gibuffer channel, aron makuha ang wala damha nga "patay" nga mga trabahante gikan sa pool, kami nagdugang usa ka mekanismo alang sa pagsubay sa mga sayup ug estado sa mga trabahante.

Ingon usa ka sangputanan, nakakuha kami usa ka nagtrabaho nga server sa PHP nga makahimo sa pagproseso sa bisan unsang mga hangyo nga gipresentar sa binary nga porma.

Aron ang among aplikasyon makasugod sa pagtrabaho isip web server, kinahanglan namong mopili ug kasaligang sumbanan sa PHP nga magrepresentar sa bisan unsang umaabot nga HTTP nga hangyo. Sa among kaso, kami lang pagbag-o net/http hangyo gikan sa Go to format PSR-7aron kini nahiuyon sa kadaghanan sa mga balangkas sa PHP nga magamit karon.

Tungod kay ang PSR-7 giisip nga dili mausab (ang uban moingon sa teknikal nga dili kini), ang mga developers kinahanglan nga magsulat sa mga aplikasyon nga wala magtagad sa hangyo isip usa ka global nga entidad sa prinsipyo. Nahiangay kini sa konsepto sa dugay nga mga proseso sa PHP. Ang among katapusang pagpatuman, nga wala pa hinganli, ingon niini:

RoadRunner: Ang PHP wala gihimo aron mamatay, o ang Golang sa pagluwas

Gipaila ang RoadRunner - taas nga performance sa PHP application server

Ang among una nga buluhaton sa pagsulay mao ang usa ka backend sa API, nga matag karon ug unya mobuto sa dili matag-an nga mga hangyo (mas kanunay kaysa sa naandan). Bisan kung ang nginx igo na sa kadaghanan nga mga kaso, kanunay namon nga nasugatan ang 502 nga mga sayup tungod kay dili namon mabalanse dayon ang sistema alang sa gipaabut nga pagtaas sa karga.

Aron mapulihan kini nga solusyon, among gi-deploy ang among unang PHP/Go application server sa sayong bahin sa 2018. Ug diha-diha dayon nakakuha usa ka talagsaon nga epekto! Dili lamang nga bug-os namon nga gitangtang ang sayup nga 502, apan nakahimo kami nga makunhuran ang gidaghanon sa mga server sa dos-tersiya, makatipig daghang salapi ug mga pildoras sa ulo alang sa mga inhenyero ug managers sa produkto.

Sa tungatunga sa tuig, gipauswag namo ang among solusyon, gipatik kini sa GitHub ubos sa lisensya sa MIT ug ginganlan kini roadrunner, sa ingon nagpasiugda sa talagsaon nga katulin ug kaepektibo niini.

Giunsa ang RoadRunner makapauswag sa imong development stack

Paggamit roadrunner mitugot kanamo sa paggamit sa Middleware net/http sa Go side aron sa paghimo sa JWT verification sa dili pa ang hangyo makaabot sa PHP, ingon man sa pagdumala sa WebSockets ug aggregate state sa tibuok kalibutan sa Prometheus.

Salamat sa built-in nga RPC, mahimo nimong ablihan ang API sa bisan unsang mga librarya sa Go para sa PHP nga wala nagsulat og mga extension wrapper. Labaw sa tanan, sa RoadRunner mahimo nimong i-deploy ang mga bag-ong non-HTTP server. Ang mga pananglitan naglakip sa nagdagan nga mga handler sa PHP AWS Lambda, paghimo og kasaligan nga mga breaker sa pila, ug bisan sa pagdugang gRPC sa among mga aplikasyon.

Uban sa tabang sa PHP ug Go nga mga komunidad, among gipauswag ang kalig-on sa solusyon, gipadako ang performance sa aplikasyon hangtod sa 40 ka beses sa pipila ka mga pagsulay, gipaayo ang mga himan sa pag-debug, gipatuman ang integrasyon sa Symfony framework, ug gidugang nga suporta alang sa HTTPS, HTTP/2, plugins, ug PSR-17.

konklusyon

Ang ubang mga tawo nasakpan gihapon sa karaan nga ideya sa PHP isip usa ka hinay, dili magamit nga pinulongan nga maayo lamang sa pagsulat sa mga plugins alang sa WordPress. Kini nga mga tawo mahimo’g moingon nga ang PHP adunay ingon nga limitasyon: kung ang aplikasyon modako nga igo, kinahanglan ka nga mopili usa ka labi ka "hamtong" nga lengguwahe ug isulat pag-usab ang base sa code nga natipon sa daghang mga tuig.

Niining tanan gusto nakong tubagon: hunahunaa pag-usab. Kami nagtuo nga ikaw ra ang nagtakda ug bisan unsang mga pagdili para sa PHP. Mahimo nimong igugol ang imong tibuok kinabuhi sa pagbalhin gikan sa usa ka pinulongan ngadto sa lain, pagsulay sa pagpangita sa hingpit nga tugma alang sa imong mga panginahanglan, o mahimo nimong sugdan ang paghunahuna sa mga pinulongan isip mga himan. Ang gituohang mga depekto sa usa ka pinulongan sama sa PHP mahimong tinuod nga rason sa kalampusan niini. Ug kung imong isagol kini sa lain nga lengguwahe sama sa Go, nan makahimo ka ug labi ka kusgan nga mga produkto kaysa kung limitado ka sa paggamit sa bisan unsang usa ka lengguwahe.

Sa pagtrabaho uban sa usa ka hugpong sa mga Go ug PHP, kita makaingon nga kita nahigugma kanila. Wala kami nagplano nga isakripisyo ang usa alang sa usa - sa kasukwahi, mangita kami mga paagi aron makakuha labi pa nga kantidad gikan sa kini nga doble nga stack.

UPD: gidawat namo ang tiglalang sa RoadRunner ug ang co-author sa orihinal nga artikulo - Lachesis

Source: www.habr.com

Idugang sa usa ka comment