RoadRunner: PHP ora dibangun kanggo mati, utawa Golang kanggo ngluwari

RoadRunner: PHP ora dibangun kanggo mati, utawa Golang kanggo ngluwari

Sugeng rawuh, Habr! Kita aktif ing Badoo nggarap kinerja PHP, amarga kita duwe sistem sing cukup gedhe ing basa iki lan masalah kinerja yaiku babagan nyimpen dhuwit. Luwih saka sepuluh taun kepungkur, kita nggawe PHP-FPM kanggo iki, sing wiwitane minangka set patch kanggo PHP, lan banjur dadi bagian saka distribusi resmi.

Ing taun-taun pungkasan, PHP wis nggawe kemajuan gedhe: tukang sampah wis apik, tingkat stabilitas saya tambah - saiki sampeyan bisa nulis daemon lan skrip umur dawa ing PHP tanpa masalah. Iki ngidini Spiral Scout luwih maju: RoadRunner, ora kaya PHP-FPM, ora ngresiki memori antarane panjalukan, sing menehi keuntungan kinerja tambahan (sanajan pendekatan iki rumit proses pangembangan). Saiki kita lagi nyobi karo alat iki, nanging kita durung duwe asil kanggo nuduhake. Supaya luwih nyenengake ngenteni dheweke, Kita nerbitake terjemahan saka pengumuman RoadRunner saka Spiral Scout.

Pendekatan saka artikel kasebut cedhak karo kita: nalika ngrampungake masalah, kita uga paling kerep nggunakake kombinasi PHP lan Go, entuk manfaat saka basa loro kasebut lan ora nyerahake siji kanggo liyane.

Seneng!

Swara sepuluh taun kepungkur, kita wis nggawe aplikasi kanggo perusahaan saka dhaptar Fortune 500, lan kanggo bisnis kanthi pamirsa ora luwih saka 500 pangguna. Kabeh wektu iki, insinyur kita ngembangake backend utamane ing PHP. Nanging rong taun kepungkur, ana sing nduwe pengaruh gedhe ora mung ing kinerja produk, nanging uga ing skalabilitas - kita ngenalake Golang (Go) menyang tumpukan teknologi.

Meh langsung, kita nemokake yen Go ngidini kita nggawe aplikasi sing luwih gedhe kanthi kinerja nganti 40x luwih cepet. Kanthi iku, kita bisa nggedhekake produk sing wis ana sing ditulis ing PHP, nambahake kanthi nggabungake kaluwihan loro basa kasebut.

Kita bakal pitutur marang kowe carane kombinasi Go lan PHP mbantu ngatasi masalah pembangunan nyata lan carane wis dadi alat kanggo kita sing bisa ngilangi sawetara masalah sing ana gandhengane karo Model mati PHP.

Lingkungan Pangembangan PHP Saben Dina

Sadurunge ngomong babagan carane sampeyan bisa nggunakake Go kanggo nguripake maneh model PHP sing wis mati, ayo deleng lingkungan pangembangan PHP standar sampeyan.

Umume kasus, sampeyan mbukak aplikasi nggunakake kombinasi server web nginx lan server PHP-FPM. Pisanan nglayani file statis lan ngarahake panjalukan tartamtu menyang PHP-FPM, lan PHP-FPM dhewe nglakokake kode PHP. Mbok menawa sampeyan nggunakake kombinasi sing kurang populer saka Apache lan mod_php. Nanging sanajan kerjane rada beda, prinsipe padha.

Ayo ndeleng carane PHP-FPM nglakokake kode aplikasi. Nalika panjalukan teka, PHP-FPM miwiti proses PHP anak lan ngliwati rincian panjalukan minangka bagéan saka negara (_GET, _POST, _SERVER, lsp.).

Negara ora bisa diganti sajrone eksekusi skrip PHP, mula mung ana siji cara kanggo entuk set data input anyar: kanthi ngresiki memori proses lan reinitialize.

Model eksekusi iki nduweni akeh kaluwihan. Sampeyan ora perlu sumelang ing bab konsumsi memori, kabeh pangolahan rampung diisolasi, lan yen salah siji mati, iku bakal otomatis recreated tanpa mengaruhi liyane saka pangolahan. Nanging pendekatan iki uga duwe kekurangan sing katon nalika nyoba nggedhekake aplikasi kasebut.

Cacat lan inefficiencies lingkungan PHP biasa

Yen sampeyan melu pangembangan profesional ing PHP, mula sampeyan ngerti ngendi arep miwiti proyek anyar - kanthi milih kerangka. Iki kalebu perpustakaan kanggo injeksi dependensi, ORM, terjemahan lan template. Lan mesthi, kabeh input pangguna bisa gampang dilebokake ing siji obyek (Symfony / HttpFoundation utawa PSR-7). Frameworks keren!

Nanging kabeh duwe rega. Ing kerangka tingkat perusahaan apa wae, kanggo ngolah panjaluk pangguna sing gampang utawa ngakses database, sampeyan kudu mbukak paling ora puluhan file, nggawe akeh kelas lan ngurai sawetara konfigurasi. Nanging sing paling awon yaiku sawise ngrampungake saben tugas, sampeyan kudu ngreset kabeh lan miwiti maneh: kabeh kode sing sampeyan wiwiti dadi ora ana gunane, kanthi bantuan sampeyan ora bakal ngolah panjaluk liyane. Marang iki kanggo programer sembarang sing nulis ing basa liyane, lan sampeyan bakal weruh bewilderment ing pasuryan.

Insinyur PHP wis pirang-pirang taun golek cara kanggo ngatasi masalah iki, nggunakake teknik loading malas sing cerdas, microframeworks, perpustakaan sing dioptimalake, cache, lan liya-liyane. (Cathetan penerjemah: masalah iki bakal ditanggulangi sebagian karo tekane Preload ing PHP 7.4)

Apa PHP karo Go bisa urip luwih saka siji panjaluk?

Sampeyan bisa nulis skrip PHP sing bakal tahan luwih saka sawetara menit (nganti jam utawa dina): contone, cron jobs, CSV parser, queue busters. Kabeh padha makarya miturut skenario sing padha: njupuk tugas, nglakokake, lan ngenteni sing sabanjure. Kode kasebut ana ing memori, ngirit milidetik larang amarga akeh langkah tambahan sing dibutuhake kanggo mbukak kerangka lan aplikasi.

Nanging ngembangake skrip umur dawa ora gampang. Sembarang kesalahan rampung mateni proses kasebut, diagnosis bocor memori ndadekake sampeyan edan, lan sampeyan ora bisa nggunakake debugging F5 maneh.

Kahanan wis apik karo release saka PHP 7: kolektor sampah dipercaya wis muncul, dadi luwih gampang kanggo nangani kasalahan, lan ekstensi kernel saiki dilindhungi saka bocor. Bener, insinyur isih kudu ati-ati karo memori lan ngerti masalah negara ing kode kasebut (apa ana basa sing ora kudu kuwatir babagan perkara kasebut?). Nanging, ing PHP 7, luwih sithik kejutan sing nunggu kita.

Apa bisa njupuk model nggarap skrip PHP sing wis suwe, adaptasi karo tugas sing luwih sepele kaya ngolah panjaluk HTTP, lan kanthi mangkono ngilangi kabutuhan kanggo mbukak kabeh saka awal kanggo saben panyuwunan?

Kanggo ngatasi masalah iki, kita kudu ngleksanakake aplikasi server sing bisa nampa panjalukan HTTP lan nerusake siji-siji menyang buruh PHP tanpa mateni saben wektu.

Kita ngerti yen kita bisa nulis server web nganggo PHP murni (PHP-PM) utawa nggunakake ekstensi C (Swoole). Lan sanajan saben cara duwe manfaat dhewe, loro pilihan kasebut ora cocog karo kita - kita pengin luwih akeh. Kita butuh luwih saka mung server web - kita ngarep-arep bisa entuk solusi sing bisa nylametake kita saka masalah sing ana gandhengane karo "mulai sing angel" ing PHP, sing ing wektu sing padha bisa gampang diadaptasi lan ditambahi kanggo aplikasi tartamtu. Yaiku, kita butuh server aplikasi.

Bisa Go bantuan karo iki? Kita ngerti bisa amarga basa kasebut nglumpukake aplikasi dadi binari tunggal; iku salib-platform; nggunakake model pangolahan paralel (konkurensi) lan perpustakaan dhewe, banget elegan kanggo nggarap HTTP; lan pungkasane, ewu perpustakaan lan integrasi open-source bakal kasedhiya kanggo kita.

Kesulitan nggabungake rong basa pamrograman

Langkah pisanan yaiku kanggo nemtokake carane loro utawa luwih aplikasi bakal komunikasi karo saben liyane.

Contone, nggunakake perpustakaan apik banget Alex Palaestras bisa ngetrapake enggo bareng memori antarane proses PHP lan Go (padha karo mod_php ing Apache). Nanging perpustakaan iki nduweni fitur sing mbatesi panggunaan kanggo ngrampungake masalah kita.

Kita mutusake nggunakake pendekatan liyane sing luwih umum: kanggo mbangun interaksi antarane proses liwat soket / pipa. Pendekatan iki wis mbuktekake linuwih sajrone dekade kepungkur lan wis dioptimalake kanthi apik ing tingkat sistem operasi.

Kanggo miwiti, kita nggawe protokol binar sing prasaja kanggo ijol-ijolan data ing antarane proses lan nangani kesalahan transmisi. Ing wangun sing paling gampang, jinis protokol iki padha karo netstring с header paket ukuran tetep (ing kasus kita 17 bita), sing ngemot informasi babagan jinis paket, ukuran lan topeng binar kanggo mriksa integritas data.

Ing sisih PHP kita digunakake fungsi paket, lan ing sisih Go - perpustakaan enkoding/biner.

Kayane mung siji protokol ora cukup - mula kita nambahake kemampuan kanggo nelpon Go services net/rpc langsung saka PHP. Iki mengko mbantu kita akeh ing pembangunan, amarga kita bisa kanthi gampang nggabungake perpustakaan Go menyang aplikasi PHP. Asil karya iki bisa dideleng, contone, ing produk open-source liyane Goridge.

Nyebarake tugas ing pirang-pirang buruh PHP

Sawise ngleksanakake mekanisme interaksi, kita wiwit mikir babagan cara paling efisien nransfer tugas menyang proses PHP. Nalika tugas teka, server aplikasi kudu milih buruh gratis kanggo ngrampungake. Yen buruh / proses mungkasi kanthi kesalahan utawa "mati," kita nyingkirake lan nggawe sing anyar kanggo ngganti. Lan yen buruh / proses wis rampung kasil, kita bali menyang blumbang buruh kasedhiya kanggo nindakake tugas.

RoadRunner: PHP ora dibangun kanggo mati, utawa Golang kanggo ngluwari

Kanggo nyimpen blumbang buruh aktif kita digunakake saluran buffered, kanggo mbusak ndadak "mati" buruh saka blumbang, kita nambah mekanisme kanggo nelusuri kasalahan lan negara buruh.

Akibaté, kita nampa server PHP sing bisa ngolah panjaluk apa wae sing disedhiyakake ing wangun binar.

Supaya aplikasi kita bisa digunakake minangka server web, kita kudu milih standar PHP sing bisa dipercaya kanggo makili panjalukan HTTP sing mlebu. Ing kasus kita mung ngowahi net / http request saka Go menyang format PSR-7supaya kompatibel karo paling framework PHP kasedhiya saiki.

Amarga PSR-7 dianggep immutable (sawetara bakal ngomong teknis iku ora), pangembang kudu nulis aplikasi sing ora dhasar nganggep panjalukan minangka entitas global. Iki cocog karo konsep proses PHP sing umure dawa. Implementasi pungkasan kita, sing durung dijenengi, katon kaya iki:

RoadRunner: PHP ora dibangun kanggo mati, utawa Golang kanggo ngluwari

Ngenalake RoadRunner - server aplikasi PHP kinerja dhuwur

Tugas tes pisanan kita yaiku backend API, sing sacara periodik ngalami panjaluk sing ora dikarepke (luwih asring tinimbang biasane). Sanajan nginx cukup ing pirang-pirang kasus, kita kerep nemoni kesalahan 502 amarga ora bisa ngimbangi sistem kanthi cepet kanggo nambah beban sing dikarepake.

Kanggo ngganti solusi iki, kita masang server aplikasi PHP/Go pisanan ing awal 2018. Lan langsung entuk efek sing luar biasa! Ora mung kita rampung njaluk nyisihaken saka kesalahan 502, nanging kita uga bisa kanggo ngurangi jumlah server dening rong pertiga, nyimpen akèh dhuwit lan ngelu kanggo engineers lan managers produk.

Ing pertengahan taun, kita wis nyempurnakake solusi, nerbitake ing GitHub miturut lisensi MIT, lan diarani Roadrunner, kanthi mangkono nandheske kacepetan lan efisiensi sing luar biasa.

Kepiye RoadRunner Bisa Ngapikake Tumpukan Pangembangan Sampeyan

Aplikasi Roadrunner ngidini kita nggunakake Middleware net / http ing sisih Go kanggo nindakake verifikasi JWT sadurunge panjalukan malah tekan PHP, uga kanggo nangani WebSockets lan agregasi negara global ing Prometheus.

Thanks kanggo RPC sing dibangun, sampeyan bisa mbukak API saka perpustakaan Go kanggo PHP tanpa nulis bungkus ekstensi. Sing luwih penting, RoadRunner bisa digunakake kanggo nyebarake server non-HTTP anyar. Conto kalebu penangan peluncuran ing PHP AWAK Lambda, nggawe busters antrian dipercaya lan malah nambah gRPC menyang aplikasi kita.

Kanthi bantuan komunitas PHP lan Go, kita wis nambah stabilitas solusi, nambah kinerja aplikasi nganti kaping 40 ing sawetara tes, alat debugging sing luwih apik, integrasi karo kerangka Symfony, lan nambah dhukungan kanggo HTTPS, HTTP/ 2, plugins, lan PSR-17.

kesimpulan

Sawetara wong isih kejiret ing tampilan PHP sing wis lawas minangka basa sing alon lan rumit mung apik kanggo nulis plugin WordPress. Wong-wong iki malah bisa ngomong yen PHP duwe watesan: nalika aplikasi dadi cukup gedhe, sampeyan kudu milih basa sing luwih "diwasa" lan nulis ulang basis kode sing wis diklumpukake sajrone pirang-pirang taun.

Kanggo kabeh iki aku arep mangsuli: mikir maneh. Kita pitados bilih mung sampeyan bisa nyetel watesan kanggo PHP. Sampeyan bisa nglampahi seumur hidup mlumpat saka basa siji menyang basa liyane, nyoba golek sing cocog kanggo kabutuhan, utawa sampeyan bisa miwiti mikir basa minangka alat. Kekurangan basa kaya PHP bisa uga dadi alasan kanggo sukses. Lan yen sampeyan gabungke karo basa liyane kaya Go, sampeyan bisa nggawe produk sing luwih kuat tinimbang yen sampeyan diwatesi mung siji basa.

Sawise nggarap kombinasi Go lan PHP, kita bisa ujar manawa kita tresna marang dheweke. Kita ora rencana kanggo kurban siji kanggo liyane, nanging goleki cara kanggo njaluk malah luwih Nilai metu saka tumpukan dual iki.

UPD: We welcome pencipta RoadRunner lan co-penulis artikel asli - Lachesis

Source: www.habr.com

Add a comment