RoadRunner: PHP барои мурдан сохта нашудааст ё Голанг барои наҷот

RoadRunner: PHP барои мурдан сохта нашудааст ё Голанг барои наҷот

Эй Ҳабр! Мо дар Badoo фаъолем кор дар иҷрои PHP, зеро мо дар ин забон як системаи хеле калон дорем ва масъалаи иҷроиш масъалаи сарфаи пул аст. Зиёда аз даҳ сол пеш мо барои ин PHP-FPM-ро эҷод кардем, ки дар аввал маҷмӯи часҳо барои PHP буд ва баъдан ба паҳнкунии расмӣ ворид шуд.

Солҳои охир PHP ба пешравиҳои бузург ноил шуд: коллектори партовҳо беҳтар шуд, сатҳи устуворӣ баланд шуд - имрӯз шумо метавонед демонҳо ва скриптҳои дарозмуддатро дар PHP бидуни мушкилот нависед. Ин ба Spiral Scout имкон дод, ки минбаъд пеш равад: RoadRunner, бар хилофи PHP-FPM, хотираи байни дархостҳоро тоза намекунад, ки ин фоидаи иловагӣ медиҳад (гарчанде ки ин равиш раванди рушдро мушкил мекунад). Мо ҳоло бо ин асбоб озмоиш карда истодаем, аммо то ҳол натиҷае надорем, ки мубодила кунем. Барои он ки интизории онҳо шавқовартар шавад, мо тарҷумаи эълони RoadRunnerро аз Spiral Scout нашр мекунем.

Муносибати мақола ба мо наздик аст: ҳангоми ҳалли мушкилоти худ, мо инчунин аксар вақт як қатор PHP ва Go -ро истифода мебарем, ки бартариҳои ҳарду забонро ба даст меорем ва якеро ба манфиати дигаре тарк намекунем.

Баҳра баред!

Дар даҳ соли охир мо барои ширкатҳо аз рӯйхат замимаҳо эҷод кардем Фаронса 500, ва барои корхонаҳое, ки аудиторияи на бештар аз 500 корбар доранд. Дар тӯли ин вақт, муҳандисони мо пуштибониро асосан дар PHP таҳия мекарданд. Аммо ду сол пеш чизе на танҳо ба иҷрои маҳсулоти мо, балки ба миқёспазирии онҳо низ таъсири калон расонд - мо Golang (Go) -ро ба стеки технологии худ ҷорӣ кардем.

Қариб дарҳол, мо фаҳмидем, ки Go ба мо имкон дод, ки барномаҳои калонтарро бо беҳбудии то 40x беҳтар созем. Бо он, мо тавонистем маҳсулоти мавҷудаи дар PHP навишташударо васеъ кунем ва онҳоро тавассути омезиши бартариҳои ҳарду забон такмил диҳем.

Мо ба шумо мегӯям, ки чӣ тавр омезиши Go ва PHP барои ҳалли мушкилоти воқеии рушд кӯмак мекунад ва чӣ гуна он барои мо ба асбобе табдил ёфтааст, ки метавонад аз баъзе мушкилоти марбут ба он халос шавад. Модели марги PHP.

Муҳити таҳияи ҳаррӯзаи PHP-и шумо

Пеш аз он ки мо дар бораи он сӯҳбат кунем, ки чӣ тавр шумо метавонед Go-ро барои эҳёи модели мурдаи PHP истифода баред, биёед муҳити пешфарзии рушди PHP-и шуморо бубинем.

Дар аксари ҳолатҳо, шумо барномаи худро бо истифода аз омезиши веб-сервери nginx ва сервери PHP-FPM иҷро мекунед. Аввалин ба файлҳои статикӣ хидмат мерасонад ва дархостҳои мушаххасро ба PHP-FPM равона мекунад, дар ҳоле ки худи PHP-FPM рамзи PHP-ро иҷро мекунад. Шумо шояд комбинатсияи камтар маъмули Apache ва mod_php-ро истифода баред. Аммо гарчанде ки он каме дигар кор мекунад, принсипҳо яканд.

Биёед бубинем, ки чӣ тавр PHP-FPM рамзи барномаро иҷро мекунад. Вақте ки дархост ворид мешавад, PHP-FPM раванди кӯдаки PHP-ро оғоз мекунад ва тафсилоти дархостро ҳамчун қисми ҳолати он (_GET, _POST, _SERVER ва ғайра) интиқол медиҳад.

Ҳолат ҳангоми иҷрои скрипти PHP наметавонад тағир ёбад, аз ин рӯ танҳо як роҳи ба даст овардани маҷмӯи нави маълумоти воридотӣ вуҷуд дорад: тоза кардани хотираи раванд ва аз нав оғоз кардани он.

Ин модели иҷро бартариҳои зиёд дорад. Шумо набояд дар бораи истеъмоли хотира аз ҳад зиёд ғамхорӣ кунед, ҳама равандҳо комилан ҷудо карда мешаванд ва агар яке аз онҳо "мурда шавад", он ба таври худкор аз нав барқарор карда мешавад ва ба боқимондаи равандҳо таъсир намерасонад. Аммо ин равиш инчунин нуқсонҳое дорад, ки ҳангоми кӯшиши васеъ кардани барнома пайдо мешаванд.

Камбудиҳо ва бесамарии муҳити муқаррарии PHP

Агар шумо як таҳиягари касбии PHP бошед, пас шумо медонед, ки лоиҳаи навро аз куҷо оғоз кунед - бо интихоби чаҳорчӯба. Он аз китобхонаҳои тазриқи вобастагӣ, ORMҳо, тарҷумаҳо ва қолабҳо иборат аст. Ва, албатта, ҳама вуруди корбарро метавон ба осонӣ дар як объект ҷойгир кард (Symfony/HttpFoundation ё PSR-7). Чорчӯбаҳо хубанд!

Аммо ҳама чиз арзиши худро дорад. Дар ҳама гуна чаҳорчӯбаи сатҳи корхона, барои коркарди дархости оддии корбар ё дастрасӣ ба пойгоҳи додаҳо, шумо бояд ҳадди аққал даҳҳо файлро бор кунед, синфҳои сершумор эҷод кунед ва якчанд конфигуратсияҳоро таҳлил кунед. Аммо бадтарин чиз дар он аст, ки пас аз анҷом додани ҳар як супориш ба шумо лозим меояд, ки ҳама чизро аз нав танзим кунед ва аз нав оғоз кунед: тамоми коде, ки шумо оғоз кардед, бефоида мешавад ва бо ёрии он шумо дигар дархости дигарро коркард намекунед. Инро ба ягон барномасозе, ки ба ягон забони дигар менависад, бигӯед ва дар чеҳраи ӯ ҳайрон мешавед.

Муҳандисони PHP солҳо боз роҳҳои ҳалли ин мушкилотро меҷӯянд, бо истифода аз усулҳои доно боркунии танбалӣ, микрофроймҳо, китобхонаҳои оптимизатсияшуда, кэш ва ғайра. Аммо дар ниҳоят, шумо ба ҳар ҳол бояд тамоми барномаро аз нав танзим кунед ва дубора оғоз кунед. . (Эзоҳи мутарҷим: бо пайдоиши ин мушкилот қисман ҳал хоҳад шуд пешакӣ дар PHP 7.4)

Оё PHP бо Go метавонад зиёда аз як дархостро наҷот диҳад?

Скриптҳои PHP-ро навиштан мумкин аст, ки умри бештар аз чанд дақиқа (то соатҳо ё рӯзҳо) дарозтар аст: масалан, вазифаҳои cron, таҳлилгари CSV, шикастани навбат. Ҳамаи онҳо мувофиқи як сенария кор мекунанд: онҳо супоришро мегиранд, онро иҷро мекунанд ва вазифаи дигарро интизор мешаванд. Рамз ҳама вақт дар хотира ҷойгир буда, миллисонияҳои гаронбаҳоро сарфа мекунад, зеро барои бор кардани чаҳорчӯба ва барнома қадамҳои зиёди иловагӣ лозиманд.

Аммо таҳияи скриптҳои дарозмуддат осон нест. Ҳама гуна хатогӣ равандро комилан мекушад, ташхиси ихроҷи хотира хашмгин аст ва ислоҳи F5 дигар имконнопазир аст.

Вазъият бо нашри PHP 7 беҳтар шуд: як коллектори боэътимоди партов пайдо шуд, коркарди хатогиҳо осонтар шуд ва васеъшавии ядро ​​ҳоло аз ихроҷ тобовар аст. Дуруст аст, ки муҳандисон то ҳол бояд бо хотира эҳтиёткор бошанд ва аз масъалаҳои давлатӣ дар код огоҳ бошанд (оё забоне ҳаст, ки ин чизҳоро сарфи назар карда метавонад?). Бо вуҷуди ин, PHP 7 барои мо сюрпризҳои камтаре дорад.

Оё модели кор бо скриптҳои дарозмуддати PHP-ро гирифтан, онро ба корҳои ночиз, ба монанди коркарди дархостҳои HTTP мутобиқ кардан ва ба ин васила аз зарурати боркунии ҳама чиз аз сифр бо ҳар як дархост халос шудан мумкин аст?

Барои ҳалли ин мушкилот, ба мо лозим буд, ки як барномаи серверро амалӣ созем, ки метавонад дархостҳои HTTP-ро қабул кунад ва онҳоро як ба як ба коргари PHP бе куштани он равона кунад.

Мо медонистем, ки мо метавонем веб-серверро бо PHP холис (PHP-PM) ё бо истифода аз тамдиди C (Swoole) нависем. Ва гарчанде ки ҳар як усул бартариҳои худро дорад, ҳарду вариант ба мо мувофиқ набуданд - мо чизи бештареро мехостем. Ба мо на танҳо як сервери веб лозим буд - мо интизор будем, ки ҳалли он ба даст ояд, ки метавонад моро аз мушкилоти марбут ба "оғози сахт" дар PHP наҷот диҳад, ки дар айни замон онро барои барномаҳои мушаххас ба осонӣ мутобиқ кардан ва васеъ кардан мумкин аст. Яъне ба мо сервери барнома лозим буд.

Оё Go метавонад дар ин кор кӯмак кунад? Мо медонистем, ки ин метавонад аз он сабаб бошад, ки забон барномаҳоро ба як файлҳои дуӣ тартиб медиҳад; он кросс-платформа аст; модели коркарди худ, хеле шево, параллелӣ (ҳамзамон) ва китобхонаро барои кор бо HTTP истифода мебарад; ва ниҳоят, ҳазорҳо китобхонаҳои кушодаасос ва ҳамгироӣ барои мо дастрас хоҳанд шуд.

Мушкилоти омезиши ду забони барномасозӣ

Пеш аз ҳама, муайян кардан лозим буд, ки ду ё зиёда барномаҳо бо ҳамдигар чӣ гуна муошират мекунанд.

Масалан, истифода китобхонаи зебо Alex Palaestras, имкон дошт мубодилаи хотира байни равандҳои PHP ва Go (монанд ба mod_php дар Apache). Аммо ин китобхона дорои хусусиятҳое мебошад, ки истифодаи онро барои ҳалли мушкилоти мо маҳдуд мекунад.

Мо тасмим гирифтем, ки як равиши дигар ва маъмултарро истифода барем: эҷоди ҳамкории байни равандҳо тавассути розеткаҳо / қубурҳо. Ин равиш дар тӯли даҳсолаҳои охир боэътимод будани худро собит кард ва дар сатҳи системаи оператсионӣ хуб такмил дода шудааст.

Барои оғоз, мо як протоколи оддии бинариро барои мубодилаи маълумот байни равандҳо ва коркарди хатогиҳои интиқол эҷод кардем. Дар соддатарин шакли худ, ин намуди протокол ба он монанд аст шабака с сарлавҳаи бастаи андозаи собит (дар ҳолати мо 17 байт), ки дорои маълумот дар бораи намуди пакет, андозаи он ва ниқоби дуӣ барои тафтиши якпорчагии маълумот мебошад.

Дар тарафи PHP мо истифода бурдем Функсияи бастабандӣ, ва дар тарафи Go, китобхона рамзгузорӣ / дуӣ.

Ба назари мо чунин менамуд, ки як протокол кофӣ нест - ва мо қобилияти занг заданро илова кардем net/rpc go бевосита аз PHP. Баъдтар, ин ба мо дар рушд кӯмак кард, зеро мо метавонистем китобхонаҳои Go-ро ба барномаҳои PHP ба осонӣ ворид кунем. Натичаи ин корро, масалан, дар дигар махсулоти кушоди мо дидан мумкин аст Горидж.

Тақсим кардани вазифаҳо дар байни коргарони сершумори PHP

Пас аз татбиқи механизми мутақобила, мо дар бораи роҳи самараноктарини интиқоли вазифаҳо ба равандҳои PHP фикр кардем. Вақте ки супориш меояд, сервери барнома бояд коргари ройгонро барои иҷрои он интихоб кунад. Агар коргар/процесс бо хатогие барояд ё «мурад», мо аз он халос мешавем ва барои иваз кардани он як нав месозем. Ва агар коргар/раванд бомуваффақият анҷом ёбад, мо онро ба ҳавзаи коргароне, ки барои иҷрои вазифаҳо дастрасанд, бармегардонем.

RoadRunner: PHP барои мурдан сохта нашудааст ё Голанг барои наҷот

Барои нигоҳ доштани ҳавзи коргарони фаъол, мо истифода мебарем канали буферӣ, барои аз ҳавз хориҷ кардани коргарони ғайричашмдошт «мурда» мо механизми пайгирии хатоҳо ва ҳолати коргаронро илова кардем.

Дар натиҷа, мо сервери кории PHP гирифтем, ки қодир ба коркарди ҳама дархостҳои дар шакли дуӣ пешниҳодшуда мебошад.

Барои он ки замимаи мо ҳамчун веб-сервер ба кор шурӯъ кунад, мо бояд стандарти боэътимоди PHP-ро барои муаррифии ҳама дархостҳои HTTP-и воридотӣ интихоб кунем. Дар ҳолати мо, мо танҳо табдил додан net/http дархост аз Гузаштан ба формат PSR-7то ки он бо аксари чаҳорчӯбаҳои PHP, ки имрӯз дастрасанд, мувофиқ бошад.

Азбаски PSR-7 бетағйир ҳисобида мешавад (баъзеҳо мегӯянд, ки аз ҷиҳати техникӣ ин тавр нест), таҳиягарон бояд барномаҳое нависанд, ки дархостро ҳамчун як субъекти глобалӣ баррасӣ намекунанд. Ин ба консепсияи равандҳои дарозмуддати PHP мувофиқат мекунад. Татбиқи ниҳоии мо, ки ҳанӯз номбар нашудааст, чунин менамуд:

RoadRunner: PHP барои мурдан сохта нашудааст ё Голанг барои наҷот

Муаррифии RoadRunner - сервери барномаҳои PHP баландсифат

Вазифаи аввалини санҷишии мо як пуштибонии API буд, ки давра ба давра дар дархостҳои пешгӯинашаванда медарояд (аз муқаррарӣ бештар). Гарчанде ки nginx дар аксари ҳолатҳо кофӣ буд, мо мунтазам бо 502 хато дучор мешудем, зеро мо натавонистем системаро барои афзоиши интизории сарборӣ зуд мувозинат кунем.

Барои иваз кардани ин ҳалли мо, мо аввалин сервери барномаҳои PHP/Go-и худро дар аввали соли 2018 ҷойгир кардем. Ва дарҳол таъсири бениҳоят ба даст овард! Мо на танхо аз хатои 502 пурра халос шудем, балки мо тавонистем шумораи серверхоро аз се ду хисса кам карда, пули бисьёр ва дорухои дарди сарро барои инженерон ва менеҷерони маҳсулот сарфа кунем.

Дар миёнаи сол, мо ҳалли худро такмил додем, онро дар GitHub таҳти иҷозатномаи MIT нашр кардем ва онро номгузорӣ кардем. Роҳрунер, Ҳамин тариқ, суръат ва самаранокии бебаҳои онро таъкид мекунад.

Чӣ тавр RoadRunner метавонад стеки рушди шуморо такмил диҳад

Ариза Роҳрунер ба мо имкон дод, ки Middleware net/http-ро дар канори Go истифода барем, то санҷиши JWT-ро пеш аз расидани дархост PHP иҷро кунем ва инчунин WebSockets ва ҳолати ҷамъро дар саросари ҷаҳон дар Prometheus идора кунем.

Бо шарофати RPC-и дарунсохт, шумо метавонед API-и ҳама китобхонаҳои Go-ро барои PHP бидуни навиштани парпечҳои васеъкунӣ кушоед. Муҳимтар аз ҳама, бо RoadRunner шумо метавонед серверҳои нави HTTP-ро ҷойгир кунед. Мисолҳо коркардкунандагони иҷрошаванда дар PHP мебошанд AWS Lambda, сохтани навбатҳои боэътимод ва ҳатто илова кардан gRPC ба дархостҳои мо.

Бо кӯмаки ҷомеаҳои PHP ва Go, мо устувории ҳалли ҳалли худро такмил додем, иҷрои барномаҳоро дар баъзе санҷишҳо то 40 маротиба зиёд кардем, абзорҳои ислоҳи ислоҳро такмил додем, ҳамгироиро бо чаҳорчӯбаи Symfony амалӣ кардем ва дастгирии HTTPS, HTTP/2, плагинҳо ва PSR-17.

хулоса

Баъзе одамон то ҳол дар мафҳуми кӯҳнашудаи PHP ҳамчун забони суст ва ноустувор танҳо барои навиштани плагинҳо барои WordPress хубанд. Ин одамон ҳатто метавонанд бигӯянд, ки PHP чунин маҳдудият дорад: вақте ки барнома ба қадри кофӣ калон мешавад, шумо бояд забони "баркамол" -ро интихоб кунед ва пойгоҳи коди дар тӯли солҳои зиёд ҷамъшударо аз нав нависед.

Ба хамаи ин ман мехохам чавоб дихам: бори дигар фикр кунед. Мо боварӣ дорем, ки танҳо шумо ҳама гуна маҳдудиятҳоро барои PHP муқаррар мекунед. Шумо метавонед тамоми умри худро барои гузариш аз як забон ба забони дигар сарф кунед ва кӯшиш кунед, ки мувофиқати комилро барои ниёзҳои худ пайдо кунед ё шумо метавонед забонҳоро ҳамчун асбоб фикр кунед. Камбудиҳои эҳтимолии забон ба монанди PHP метавонанд воқеан сабаби муваффақияти он бошанд. Ва агар шумо онро бо забони дигар ба мисли Go якҷоя кунед, шумо маҳсулотҳои пурқувваттареро эҷод мекунед, назар ба он ки шумо бо истифодаи ягон забон маҳдуд шуда бошед.

Бо як қатор Go ва PHP кор карда, мо гуфта метавонем, ки мо онҳоро дӯст медорем. Мо ният надорем, ки якеро барои дигаре курбон кунем — баръакс, мо роххои аз ин стеки дугона ба даст овардани арзиши боз хам бештарро чустучу мекунем.

UPD: мо офаринандаи RoadRunner ва ҳаммуаллифи мақолаи аслиро истиқбол мекунем - Лачесис

Манбаъ: will.com

Илова Эзоҳ