Kumhanyisa PHP zvibatanidza zveTarantool uchishandisa Async, Swoole uye Parallel

Kumhanyisa PHP zvibatanidza zveTarantool uchishandisa Async, Swoole uye Parallel

Muiyo PHP ecosystem pane parizvino maviri anobatanidza ekushanda neTarantool server - iyi ndiyo yepamutemo PECL yekuwedzera. tarantool/tarantool-php, rakanyorwa muC, uye tarantool-php/client, yakanyorwa muPHP. Ndini munyori wekupedzisira.

Muchikamu chino, ndinoda kugovera mhedzisiro yekuyedzwa kwekuita kwemaraibhurari ese uye kuratidza kuti, nekuchinja kushoma kune kodhi, unogona kuwana 3-5 performance kuwedzera (pamiyedzo yekugadzira!).

Tichaedzei?

Tichaedza idzo dzataurwa pamusoro apa synchronous ma-connectors anomhanya asynchronously, akafanana, uye asynchronously-parallel. πŸ™‚ Isu hatidiwo kubata kodhi yezvibatanidza ivo pachavo. Ikozvino kune akati wandei ekuwedzera anowanikwa kuti uwane zvaunoda:

  • Swoole - yakakwira-inoshanda asynchronous chimiro chePHP. Inoshandiswa nemahofori eInternet akadai saAlibaba neBaidu. Kubva shanduro 4.1.0 nzira yemashiripiti yakaonekwa SwooleRuntime ::gonesaCoroutine(), iyo inokutendera iwe "kushandura synchronous PHP network maraibhurari kune asynchronous ane mutsara wekodhi."
  • Async yaive kusvika nguva pfupi yadarika kuwedzera kwakavimbisa kweasynchronous basa muPHP. Sei kusvika munguva pfupi yapfuura? Nehurombo, nechikonzero chandisingazive, munyori akadzima repository uye ramangwana repurojekiti harina kujeka. Ndichafanira kuishandisa one kubva kumaforogo. Kufanana neSwoole, iyi yekuwedzera inobvumidza iwe kuti utendeuke bhurugwa rako zviri nyore nekufinyamisa kweruoko kuti ugone kugonesa asynchrony nekutsiva iyo yakajairwa kuita kweTCP neTLS hova neshanduro dzadzo dzeasynchronous. Izvi zvinoitwa kuburikidza nesarudzo "async.tcp = 1".
  • Parallel ― yekuwedzera nyowani kubva kune anozivikanwa Joe Watkins, munyori wemaraibhurari akadai phpdbg, apcu, pthreads, pcov, uopz. Iyo yekuwedzera inopa API yekuverengera akawanda muPHP uye inomisikidzwa sechinotsiva pthreads. Chinhu chakakosha chinodzikamisa raibhurari ndechekuti inongoshanda neZTS (Zend Thread Safe) vhezheni yePHP.

Tichaedza sei?

Ngatitangei chiitiko cheTarantool nekunyora-mberi kutema matanda kwakaremara (wal_mode = hapana) uye yakawedzera network buffer (kuverenga = 1 * 1024 * 1024) Sarudzo yekutanga ichabvisa basa ne diski, yechipiri ichaita kuti zvikwanise kuverenga zvimwe zvikumbiro kubva kune inoshanda sisitimu buffer uye nekudaro kuderedza nhamba yekufona system.

Kune mabhenji anoshanda nedata (kupinza, kudzima, kuverenga, nezvimwewo), usati watanga bhenji, memtx nzvimbo ichave (patsva) yakagadzirwa, umo iyo yekutanga index kukosha inogadzirwa nejenareta yeakarongedzerwa manhamba. (kutevedzana).
Nzvimbo DDL inoita seizvi:

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}})

Kana zvichidikanwa, usati wamhanyisa bhenji, nzvimbo yacho inozadzwa negumi remazana matuples efomu.

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

Matuples anowanikwa uchishandisa zvisina kujairika kiyi kukosha.

Iyo benchmark pachayo chikumbiro chimwe chete kune sevha, iyo inoitwa 10,000 nguva (marevolutions), ayo, zvakare, anoitwa mukudzokororwa. Iko kudzokororwa kunodzokororwa kusvika nguva yese kutsauka pakati pe5 iterations iri mukati mekukanganisa kunogamuchirwa kwe3%*. Mushure meizvi, mugumisiro wepakati unotorwa. Pane 1 sekondi kumbomira pakati iterations kudzivirira processor kubva throttling. Muunganidzi wemarara weLua akaremara kusati kwaitwa imwe neimwe uye anomanikidzwa kutanga kana apedza. Iyo PHP maitiro anotangwa chete neakawedzerwa anodiwa kune iyo bhenji, ine inobuda buffering inogoneswa uye muunganidzi wemarara akaremara.

* Huwandu hwekuchinja, kudzokororwa uye kukanganisa kwechikumbaridzo kunogona kuchinjwa mumabhenji magadzirirwo.

Test environment

Migumisiro yakabudiswa pazasi yakaitwa paMacBookPro (2015), operating system - Fedora 30 (kernel version 5.3.8-200.fc30.x86_64). Tarantool yakatangwa mudocker ine parameter "--network host".

Package versions:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, kuvaka a872fc2f86
PHP: 7.3.11 (cli) (yakavakwa: Gumiguru 22 2019 08:11:04)
tarantool/mutengi: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ chigamba che7.3)*
ext-msgpack: 2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
ext-parallel: 1.1.3

* Nehurombo, iyo yepamutemo yekubatanidza haishande neiyo PHP vhezheni> 7.2. Kuunganidza uye kumhanyisa kuwedzera paPHP 7.3, ndaifanira kushandisa chigamba.

Mhinduro

Synchronous mode

Iyo Tarantool protocol inoshandisa iyo binary fomati MessagePack kugadzirisa mameseji. Mune iyo PECL yekubatanidza, serialization yakavanzwa pakadzika mukati meraibhurari uye inokanganisa encoding maitiro kubva kuuserland kodhi. hazviite. Iyo yakachena PHP yekubatanidza, pane zvinopesana, inopa kugona kugadzirisa iyo encoding maitiro nekuwedzera yakajairwa encoder kana nekushandisa yako pachako kuita. Kune maviri encoder anowanikwa kunze kwebhokisi, imwe yakavakirwa pa msgpack/msgpack-php (yepamutemo MessagePack PECL yekuwedzera), imwe yacho iripo rybakit/msgpack (mune PHP yakachena).

Tisati tafananidza majoini, isu tichayera mashandiro eMessagePack encoder yeiyo PHP yekubatanidza uye mune imwe bvunzo tichashandisa iyo inoratidza yakanakisa mhedzisiro:

Kumhanyisa PHP zvibatanidza zveTarantool uchishandisa Async, Swoole uye Parallel
Kunyangwe iyo PHP vhezheni (Yakachena) yakaderera kune yePECL yekuwedzera mukumhanya, mumapurojekiti chaiwo ndingadai ndichiri kukurudzira kuishandisa. rybakit/msgpack, nekuti mune yepamutemo MessagePack yekuwedzera iyo fomati yakatarwa inongoitwa zvishoma (semuenzaniso, hapana tsigiro yemhando dzedata, pasina iyo iwe haungakwanise kushandisa Decimal - itsva data mhando yakaunzwa muTarantool 2.3) uye ine a nhamba yevamwe matambudziko (kusanganisira nyaya dzekuenderana nePHP 7.4). Zvakanaka, kazhinji, chirongwa chinotaridzika chakasiiwa.

Saka, ngatiyere mashandiro ezvibatanidza mune synchronous mode:

Kumhanyisa PHP zvibatanidza zveTarantool uchishandisa Async, Swoole uye Parallel
Sezvinoonekwa kubva pagirafu, iyo PECL yekubatanidza (Tarantool) inoratidza kuita kuri nani kana ichienzaniswa neiyo PHP yekubatanidza (Client). Asi izvi hazvishamise, zvichipihwa kuti iyo yekupedzisira, kunze kwekushandiswa mumutauro unononoka, inoita basa rakawanda: chinhu chitsva chinogadzirwa nekufona kwega kwega. chikumbiro ΠΈ Response (munyaya yeSarudzo - zvakare Zvikonzero, uye munyaya ye Update/Upsert ― Operations), masangano akasiyana Connection, packers ΠΈ Handler vanowedzerawo pamusoro. Zviripachena, kuchinjika kunouya pamutengo. Nekudaro, kazhinji, muturikiri wePHP anoratidza kuita kwakanaka, kunyangwe paine musiyano, hauna kukosha uye, pamwe, uchave wakaderera kana uchishandisa preloading muPHP 7.4, tisingatauri JIT muPHP 8.

Ngatienderere mberi. Tarantool 2.0 yakawedzera rutsigiro rweSQL. Ngatiedzei kuita Sarudza, Isa, Gadziridza uye Delete mashandiro uchishandisa SQL protocol uye enzanisa zvawanikwa ne noSQL (binary) yakaenzana:

Kumhanyisa PHP zvibatanidza zveTarantool uchishandisa Async, Swoole uye Parallel
Mhedzisiro yeSQL hainakidze (rega ndikuyeuchidze kuti tichiri kuyedza synchronous mode). Nekudaro, ini handingatsamwire pamusoro peizvi nguva isati yasvika; Tsigiro yeSQL ichiri pasi pekusimudzira (nguva pfupi yapfuura, semuenzaniso, rutsigiro rwakawedzerwa. mashoko akagadzirira) uye, tichitarisa nerondedzero nyaya, iyo SQL injini ichaitwa akati wandei ekugadzirisa mune ramangwana.

async

Zvakanaka, ikozvino ngationei kuti kuwedzera kweAsync kunogona kutibatsira sei kuvandudza zvabuda pamusoro. Kunyora zvirongwa zveasynchronous, kuwedzera kunopa API yakavakirwa pamakoroni, yatichashandisa. Isu tinoona empirically kuti iyo yakakwana nhamba ye coroutines yezvakatipoteredza ndeye 25:

Kumhanyisa PHP zvibatanidza zveTarantool uchishandisa Async, Swoole uye Parallel
"Paridza" 10,000 mashandiro mumakumi maviri neshanu coroutines uye ona zvinoitika:

Kumhanyisa PHP zvibatanidza zveTarantool uchishandisa Async, Swoole uye Parallel
Nhamba yekushanda pasekondi yakawedzera nekanopfuura ka3 kune tarantool-php/client!

Zvinosuruvarisa, iyo PECL yekubatanidza haina kutanga ne ext-async.

Zvakadini neSQL?

Kumhanyisa PHP zvibatanidza zveTarantool uchishandisa Async, Swoole uye Parallel
Sezvauri kuona, mune asynchronous modhi mutsauko pakati peiyo binary protocol uye SQL wakava mukati memucheto wekukanganisa.

Swoole

Zvekare tinowana huwandu hwakakwana hwema coroutines, panguva ino yeSwoole:
Kumhanyisa PHP zvibatanidza zveTarantool uchishandisa Async, Swoole uye Parallel
Ngatimirei pamakumi maviri neshanu. Ngatidzokorore hunyengeri hwakafanana nekuwedzera kweAsync - govera 25 mashandiro pakati pemakumi maviri neshanu coroutines. Uye zvakare, isu tichawedzera imwe bvunzo umo isu tichagovanisa basa rese kuita maviri maitiro maviri (kureva kuti, yega yega ichaita 10,000 mashandiro mu25 coroutines). Maitiro achagadzirwa uchishandisa SwooleProcess.

Mhinduro:

Kumhanyisa PHP zvibatanidza zveTarantool uchishandisa Async, Swoole uye Parallel
Swole inoratidza mhedzisiro yakaderera zvishoma kana ichienzaniswa neAsync kana ichiitwa mune imwechete maitiro, asi ne2 maitiro mufananidzo unochinja zvakanyanya (nhamba 2 haina kusarudzwa nemukana; pamushini wangu, yaive 2 maitiro airatidza mhedzisiro yakanaka).

Nenzira, iyo Async yekuwedzera ine zvakare API yekushanda nematanho, asi ipapo ini handina kuona chero mutsauko kubva pakumhanyisa mabhenji mune imwe kana akawanda maitiro (zvinogoneka kuti ndakakanganisa kumwe kunhu).

SQL vs binary protocol:

Kumhanyisa PHP zvibatanidza zveTarantool uchishandisa Async, Swoole uye Parallel
Sezvakaita Async, mutsauko uripo pakati pebhinari uye SQL mashandiro anobviswa mune asynchronous mode.

Parallel

Sezvo iyo Parallel yekuwedzera isiri ye coroutines, asi nezve shinda, ngatiyera iyo yakakwana nhamba yetambo dzakafanana:

Kumhanyisa PHP zvibatanidza zveTarantool uchishandisa Async, Swoole uye Parallel
Yakaenzana ne16 pamushini wangu. Ngatimhanyei mabhenji mabhenji pane gumi nematanhatu tambo dzakafanana:

Kumhanyisa PHP zvibatanidza zveTarantool uchishandisa Async, Swoole uye Parallel
Sezvauri kuona, mhedzisiro yacho yakatonaka kupfuura neasynchronous extensions (kwete kuverenga Swoole inomhanya pane maviri maitiro). Ziva kuti yePECL yekubatanidza, iyo Yekuvandudza uye Upsert mashandiro haana chinhu. Izvi zvinokonzerwa nekuti mabasa aya akatadza nekukanganisa - handizive kana yaive mhosva ye ext-parallel, ext-tarantool, kana zvese.

Zvino ngatienzanise SQL performance:

Kumhanyisa PHP zvibatanidza zveTarantool uchishandisa Async, Swoole uye Parallel
Waona kufanana negirafu yezvibatanidza zvinomhanya zvakangofanana?

Pamwe chete

Uye pakupedzisira, ngatipfupikisai mibairo yese mune imwe girafu kuti tione iyo yakazara mufananidzo weiyo yakaedzwa yekuwedzera. Ngatiwedzerei muyedzo mutsva muchati, izvo zvatisati taita - ngatimhanyei Async coroutines nenzira yakafanana tichishandisa Parallel*. Pfungwa yekubatanidza iyo iri pamusoro ekuwedzera yatove yakakurukurwa vanyori, asi hapana kubvumirana kwakasvika, iwe uchafanirwa kuzviita iwe pachako.

* Izvo zvaisaita kuvhura Swoole coroutines neParallel; zvinoita sekunge aya ekuwedzera haaenderane.

Saka, mhedzisiro yekupedzisira:

Kumhanyisa PHP zvibatanidza zveTarantool uchishandisa Async, Swoole uye Parallel

Pane mhedziso

Mukuona kwangu, mhedzisiro yakave yakanyatsokodzera, uye nekuda kwechimwe chikonzero ndine chokwadi chekuti uyu hausi iwo muganho! Kunyangwe iwe uchifanira kusarudza izvi muprojekiti chaiyo iwe pachako, ini ndinongotaura kuti kwandiri chaive chiyedzo chinonakidza chinokutendera kuti uongorore kuti yakawanda sei yaunogona "kusvina" kunze kweiyo synchronous TCP yekubatanidza nekuita kushoma. Kana iwe uine mazano ekuvandudza mabhenji, ini ndichafara kufunga nezvechikumbiro chako chekudhonza. Yese kodhi ine yekutanga mirairo uye mhedzisiro inoburitswa mune yakaparadzana repositories.

Source: www.habr.com

Voeg