Dardar gelinta isku xirayaasha PHP ee Tarantool iyadoo la adeegsanayo Async, Swoole iyo Parallel

Dardar gelinta isku xirayaasha PHP ee Tarantool iyadoo la adeegsanayo Async, Swoole iyo Parallel

Nidaamka deegaanka ee PHP waxaa hadda jira laba xiriiriye oo la shaqeeya serverka Tarantool - kani waa kordhinta rasmiga ah ee PECL tarantool/tarantool-php, ku qoran C, iyo tarantool-php/macmiil, oo ku qoran PHP. Waxaan ahay qoraaga kan dambe.

Maqaalkan, waxaan jeclaan lahaa inaan wadaago natiijooyinka imtixaanka waxqabadka ee labada maktabadood oo aan tusiyo sida, isbeddellada ugu yar ee koodhka, waxaad ku gaari kartaa 3-5 kor u kaca waxqabadka (imtixaannada synthetic!).

Maxaan tijaabin doonaa?

Waxaan tijaabin doonaa kuwa kor ku xusan isku mid ah Xidhiidhiyayaasha u socda is-barbar yaac, is barbar socda, iyo isbarbar-dhig. πŸ™‚ Sidoo kale ma rabno inaan taabano koodhka isku xirka laftooda. Hadda waxaa jira dhowr kordhin oo la heli karo si loo gaaro waxaad rabto:

  • Swoole - qaab-dhismeedka asynchronous ee waxqabadka sare leh ee PHP. Waxaa isticmaala shirkadaha waaweyn ee internetka sida Alibaba iyo Baidu. Laga soo bilaabo nooca 4.1.0 waxaa soo muuqday hab sixir SwooleRuntime :: awoodCoroutine(), kaas oo kuu ogolaanaya inaad u beddesho maktabadaha isku-xidhka PHP ee isku midka ah una beddelo kuwa aan la mid ahayn oo leh hal xariiq oo kood ah.
  • Async wuxuu ahaa ilaa dhowaan kordhin rajo leh oo loogu talagalay shaqada asynchronous ee PHP. Waa maxay sababta ilaa dhawaan? Nasiib darro, sabab aan la garaneyn awgeed, qoraagu wuxuu tirtiray kaydkii, ma cadda mustaqbalka mashruuca. Waa inaan isticmaalo hal laga bilaabo fargeeto. Sida Swoole oo kale, kordhintan ayaa kuu ogolaanaysa inaad si fudud surwaalkaaga ugu shido gacanta gacan-ku-jiidka si aad awood ugu siiso asynchrony adigoo ku beddelaya hirgelinta caadiga ah ee TCP iyo durdurrada TLS noocyadooda asynchronous. Tan waxaa lagu sameeyaa ikhtiyaarka "async.tcp = 1Β«.
  • Is barbardhig - kordhin cusub oo cadaalad ah oo ka timid Joe Watkins oo caan ah, qoraa maktabadaha sida phpdbg, apcu, pthreads, pcov, uopz. Kordhinta ayaa siisa API-ga loogu talagalay isku-dhufashada PHP waxaana loo dhigayaa beddelka pthreads. Xaddidaadda weyn ee maktabadda ayaa ah inay la shaqeyso oo keliya ZTS (Zend Thread Safe) nooca PHP.

Sideen u tijaabin doonaa?

Aan bilowno tusaalaha Tarantool oo leh qori-hor-u-qoris oo naafo ah (wal_mode = midnaiyo kororka shabakada wax kaydisa (akhrinta = 1 * 1024 * 1024). Doorashada ugu horeysa waxay baabi'in doontaa shaqada diskka, tan labaad waxay suurtogal ka dhigi doontaa in la akhriyo codsiyo badan oo ka yimaada nidaamka qalliinka oo hoos u dhigaya tirada wicitaanada nidaamka.

Astaamaha ku shaqeeya xogta (gelinta, tirtirka, akhrinta, iwm.), ka hor inta aan la bilaabin bartilmaameedka, meel bannaan oo memtx ah ayaa (dib loo abuuri doonaa), kaas oo qiyamka index-ka aasaasiga ah uu abuuray koronto-dhaliye ah qiimaha isugeynta la dalbaday (isku xigxiga).
Meesha DDL waxay u egtahay sidan:

space = box.schema.space.create(config.space_name, {id = config.space_id, temporary = true})
space:create_index('primary', {type = 'tree', parts = {1, 'unsigned'}, sequence = true})
space:format({{name = 'id', type = 'unsigned'}, {name = 'name', type = 'string', is_nullable = false}})

Haddii loo baahdo, ka hor inta aanad bilaabin bartilmaameedka, booska waxaa ka buuxsamay 10,000 tuples oo foomka ah.

{id, "tuplΠ΅_<id>"}

Tuples waxaa lagu galaa iyadoo la isticmaalayo qiime aan toos ahayn.

Halbeegga laftiisu waa hal codsi oo server-ka ah, kaas oo la fuliyo 10,000 jeer (kacaanno), kuwaas oo, markeeda, la fuliyo si isdaba joog ah. Ku celcelinta waa lagu soo noqnoqdaa ilaa inta u dhaxaysa 5 ku celcelinta ay ku jiraan khalad la aqbali karo oo ah 3%*. Taas ka dib, celceliska natiijada ayaa la qaadaa. Waxaa jira 1 ilbiriqsi oo hakad ah inta u dhaxaysa ku celcelinta si looga ilaaliyo processor-ku inuu xoqo. Qashin ururiyaha Lua waa naafo ka hor inta aan la soo celin waxaana lagu qasbay inuu bilaabo marka uu dhammeeyo. Habka PHP waxaa lagu bilaabay kaliya kordhinta lagama maarmaanka u ah bartilmaameedka, iyada oo wax soo saarka la kartiyeeyay iyo qashinka aruuriyaha naafo.

* Tirada kacaanka, soo noqnoqoshada iyo marinka khaladka waxa lagu bedeli karaa goobaha bartilmaameedka.

Deegaanka tijaabi

Natiijooyinka hoos lagu daabacay waxaa lagu sameeyay MacBookPro (2015), nidaamka hawlgalka - Fedora 30 (nooca kernel 5.3.8-200.fc30.x86_64). Tarantool waxaa lagu soo bandhigay goob-xirfadeedka "--network host".

Noocyada xirmada:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, dhis a872fc2f86
PHP: 7.3.11 (cli) (lagu dhisay: Oktoobar 22 2019 08:11:04)
tarantool/macmiil: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ balastar loogu talagalay 7.3)*
ext-msgpack: 2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
is barbar dhig: 1.1.3

* Nasiib darro, xiriiriyaha rasmiga ah kuma shaqeeyo nooca PHP> 7.2. Si aan u ururiyo oo aan u socodsiiyo kordhinta PHP 7.3, waa inaan isticmaalo balastar.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹

Qaab isku xidhan

Hab-maamuuska Tarantool wuxuu isticmaalaa qaab laba-geesood ah Xidhmada fariinta si taxane ah fariimaha. Xidhiidhiyaha PECL, taxanayntu waxay ku qarsoon tahay gunta hoose ee maktabadda waxayna saamaysaa habka codaynta ee koodka dhulka isticmaalaha uma muuqato mid suurtagal ah. Xidhiidhiyaha PHP saafiga ah, liddi ku ah, wuxuu bixiyaa awooda lagu habayn karo habka codaynta iyadoo la kordhinayo codeeyaha caadiga ah ama adoo isticmaalaya hirgalintaada. Waxa jira laba cod-bixiyeyaal oo laga heli karo sanduuqa dhexdiisa, mid ku salaysan msgpack/msgpack-php (Fidinta Rasmiga ah ee MessagePack PECL), kan kalena waa daaran yahay rybakit/msgpack (ee PHP saafi ah).

Kahor intaanan isbarbardhigin xirayaasha, waxaan cabbiri doonaa waxqabadka MessagePack encoders ee isku xiraha PHP iyo tijaabooyin dheeri ah waxaan isticmaali doonaa midda muujisa natiijada ugu fiican:

Dardar gelinta isku xirayaasha PHP ee Tarantool iyadoo la adeegsanayo Async, Swoole iyo Parallel
Inkasta oo nooca PHP (Pure) uu ka hooseeyo xawaaraha PECL, mashaariicda dhabta ah waxaan weli ku talin lahaa isticmaalka rybakit/msgpack, sababtoo ah kordhinta MessagePack-ka rasmiga ah qaabka qeexitaanka qayb ahaan ayaa lafuliyaa (tusaale ahaan, ma jirto wax taageero ah noocyada xogta gaarka ah, taas oo la'aanteed ma awoodid inaad isticmaasho Decimal - nooc cusub oo xog ah oo lagu soo bandhigay Tarantool 2.3) oo leh a tirada kale dhibaatooyinka (oo ay ku jiraan arrimaha ku habboon ee PHP 7.4). Waa hagaag, guud ahaan, mashruucu wuxuu u muuqdaa mid laga tagay.

Marka, aan ku cabbirno waxqabadka xirayaasha qaab isku mid ah:

Dardar gelinta isku xirayaasha PHP ee Tarantool iyadoo la adeegsanayo Async, Swoole iyo Parallel
Sida ka muuqata garaafka, isku xirka PECL (Tarantool) wuxuu muujinayaa waxqabad wanaagsan marka la barbar dhigo xiriiriyaha PHP (Client). Laakiin tani maaha wax la yaab leh, marka la eego in kan dambe, marka lagu daro in lagu hirgeliyo luqad gaabis ah, dhab ahaantii wuxuu qabtaa shaqo badan: shay cusub ayaa la abuuray wicitaan kasta. Codsiga ΠΈ Waxqabadka (haddii ay dhacdo Xulo - sidoo kale Shuruudaha, iyo xaaladda Cusbooneysii/Cusbooneysii - Hawlgallada), hay'ado kala duwan Connection, Xirmada ΠΈ Qalabka waxay sidoo kale ku daraan korka. Sida cad, dabacsanaantu waxay ku timaadaa qiimo. Si kastaba ha noqotee, guud ahaan, turjubaanka PHP wuxuu muujinayaa waxqabad wanaagsan, inkastoo uu jiro farqi, waa wax aan micno lahayn, laga yaabee, xitaa way yaraan doontaa marka la isticmaalayo horudhaca PHP 7.4, ma aha in lagu xuso JIT gudaha PHP 8.

Aan hore u socono. Tarantool 2.0 waxay ku dartay taageerada SQL. Aynu isku dayno inaan samayno Xulo, Geli, Cusbooneysiin iyo Tirtir hawlgallada annagoo adeegsanayna borotokoolka SQL oo barbar dhig natiijooyinka noSQL (binary) u dhigma:

Dardar gelinta isku xirayaasha PHP ee Tarantool iyadoo la adeegsanayo Async, Swoole iyo Parallel
Natiijooyinka SQL maaha kuwo aad u cajiib ah (aan ku xasuusiyo inaan wali tijaabineyno qaabka isku midka ah). Si kastaba ha ahaatee, anigu kama xanaaqi doono arrintan wakhti ka hor; Taageerada SQL waxay weli ku jirtaa horumar firfircoon (dhawaan dhow, tusaale ahaan, taageerada ayaa lagu daray hadallo diyaarsan) iyo, marka lagu qiimeeyo liiska arrimaha, Matoorka SQL wuxuu mari doonaa dhowr hagaajin mustaqbalka.

async

Hagaag, hadda aan aragno sida kordhinta Async ay naga caawin karto hagaajinta natiijooyinka kore. Si loo qoro barnaamijyada asynchronous, kordhintu waxay bixisaa API ku salaysan coroutines, kaas oo aan isticmaali doono. Waxaan ogaanay si macquul ah in tirada ugu fiican ee coroutines ee deegaankeena ay tahay 25:

Dardar gelinta isku xirayaasha PHP ee Tarantool iyadoo la adeegsanayo Async, Swoole iyo Parallel
"Faafi" 10,000 hawlgal oo dhan 25 coroutines oo arag waxa dhaca:

Dardar gelinta isku xirayaasha PHP ee Tarantool iyadoo la adeegsanayo Async, Swoole iyo Parallel
Tirada hawlgallada ilbiriqsikiiba waxay korodhay in ka badan 3 jeer tarantool-php/macmiil!

Nasiib darrose, xiriiriyaha PECL kuma bilaaban ext-async.

Ka warran SQL?

Dardar gelinta isku xirayaasha PHP ee Tarantool iyadoo la adeegsanayo Async, Swoole iyo Parallel
Sida aad arki karto, qaabka asynchronous farqiga u dhexeeya borotokoolka binary iyo SQL wuxuu noqday dhexda qaladka.

Swoole

Mar labaad waxaan ogaanay tirada ugu wanaagsan ee coroutines, markan Swoole:
Dardar gelinta isku xirayaasha PHP ee Tarantool iyadoo la adeegsanayo Async, Swoole iyo Parallel
Aan ku joojino 25. Aynu ku celino isla khiyaanada sida kordhinta Async - u qaybi 10,000 hawlgal inta u dhaxaysa 25 coroutines. Intaa waxaa dheer, waxaan ku dari doonaa imtixaan kale kaas oo aan u qaybin doono dhammaan shaqada 2 laba hab (taas oo ah, habka kasta wuxuu fulin doonaa 5,000 hawlgal 25 coroutines). Nidaamyada waxaa la abuuri doonaa iyadoo la isticmaalayo Geedi socodka Swoole.

Natiijooyinka:

Dardar gelinta isku xirayaasha PHP ee Tarantool iyadoo la adeegsanayo Async, Swoole iyo Parallel
Swole waxay muujinaysaa natiijo wax yar ka hooseeya marka la barbar dhigo Async marka la wado hal geeddi-socod, laakiin hababka 2 sawirku si aad ah ayuu u bedelayaa (lambarka 2 lama dooran si kadis ah, mashiinkayga, waxay ahayd 2 hababka oo muujiyay natiijada ugu fiican).

Jid ahaan, kordhinta Async waxay sidoo kale leedahay API si ay ula shaqeyso hababka, laakiin halkaas ma aanan dareemin wax farqi ah oo ka yimid jaangooyooyinka hal ama in ka badan (waxaa suurtagal ah in aan meel ku khalkhaliyay).

SQL vs binary borotokool:

Dardar gelinta isku xirayaasha PHP ee Tarantool iyadoo la adeegsanayo Async, Swoole iyo Parallel
Sida Async, farqiga u dhexeeya hawlgallada binary iyo SQL ayaa lagu baabi'iyaa habka asynchronous.

Is barbardhig

Mar haddii kordhinta isbarbar-dhigga aysan ku saabsanayn coroutines, laakiin ku saabsan dunta, aan cabbirno tirada ugu habboon ee dunta isbarbar-dhigga ah:

Dardar gelinta isku xirayaasha PHP ee Tarantool iyadoo la adeegsanayo Async, Swoole iyo Parallel
Waxay la mid tahay 16 mashiinkayga. Aan ku socodsiino bartilmaameedyada xiriiriyaha 16 dun oo isbarbar socda:

Dardar gelinta isku xirayaasha PHP ee Tarantool iyadoo la adeegsanayo Async, Swoole iyo Parallel
Sida aad arki karto, natiijadu xitaa way ka fiican tahay kordhinta asynchronous (lama xisaabin Swoole ku shaqeeya 2 hannaan). Ogsoonow in xiriiriyaha PECL, Cusbooneysiinta iyo Kordhinta hawlgallada ay madhan yihiin. Tani waxay sabab u tahay xaqiiqda ah in hawlgalladani ay ku fashilmeen khalad - ma garanayo inay khaladka lahayd ext-parallel, ext-tarantool, ama labadaba.

Hadda aan is barbar dhigno waxqabadka SQL:

Dardar gelinta isku xirayaasha PHP ee Tarantool iyadoo la adeegsanayo Async, Swoole iyo Parallel
Fiiro u yeelo isku ekaanshaha garaafka ee xiriiriyeyaasha si isku mid ah u shaqeynaya?

Wadajir

Ugu dambeyntiina, aan ku soo koobno ​​dhammaan natiijooyinka hal garaaf si aan u aragno sawirka guud ee ballaarinta la tijaabiyay. Aan ku darno hal tijaabo oo cusub jaantuska, kaas oo aynaan wali samayn - aynu si barbar socda u wadno Async coroutines anagoo adeegsanayna Parallel*. Fikradda isku-darka kordhinta kor ku xusan waa horeba ayaa laga hadlay Qorayaasha, laakiin wax heshiis ah lama gaarin, waa inaad adigu sameysaa.

* Suurtogal ma ahayn in la bilaabo Swoole coroutines oo leh Parallel; waxay u muuqataa in kordhintan aan la socon karin.

Haddaba, natiijada kama dambaysta ah:

Dardar gelinta isku xirayaasha PHP ee Tarantool iyadoo la adeegsanayo Async, Swoole iyo Parallel

Halkii gabagabo

Fikradayda, natiijadu waxay u soo baxday inay noqoto mid u qalantaa, iyo sabab qaar ka mid ah waxaan hubaa in tani aysan ahayn xadka! Haddii aad u baahan tahay inaad tan ku go'aansato mashruuc dhab ah oo keliya naftaada, waxaan kaliya dhihi doonaa aniga waxay ii ahayd tijaabo xiiso leh oo kuu oggolaaneysa inaad qiimeyso inta aad ka "dhuujin karto" isku-xiraha TCP-ga isku-dhafka ah ee dadaalka ugu yar. Haddii aad hayso fikrado lagu hagaajinayo bartilmaameedyada, waan ku farxi doonaa inaan tixgeliyo codsigaaga jiidista. Dhammaan koodka leh tilmaamaha bilaabista iyo natiijooyinka waxaa lagu daabacay si gaar ah kayd.

Source: www.habr.com

Add a comment