Ukukhawulezisa izixhumi ze-PHP zeTarantool usebenzisa i-Async, i-Swoole kunye neParallel

Ukukhawulezisa izixhumi ze-PHP zeTarantool usebenzisa i-Async, i-Swoole kunye neParallel

Kwi-ecosystem ye-PHP okwangoku kukho iziqhagamshelo ezimbini zokusebenza kunye neseva ye-Tarantool - olu lulwandiso olusemthethweni lwe-PECL. i-tarantool/tarantool-php, ebhalwe ngoC, kunye tarantool-php/client, ebhalwe kwi-PHP. Ndingumbhali wale yokugqibela.

Kweli nqaku, ndingathanda ukwabelana ngeziphumo zokuvavanywa kokusebenza kwazo zombini iilayibrari kwaye ndibonise ukuba, ngotshintsho oluncinci kwikhowudi, unokufikelela kwi-3-5 yokunyuka komsebenzi (kwiimvavanyo zokwenziwa!).

Siza kuvavanya ntoni?

Siza kuvavanya ezi zikhankanywe ngasentla i-synchronous izihlanganisi zisebenza ngokufana, ngokunxuseneyo, kunye ne-asynchronously-parallel. πŸ™‚ Kananjalo asifuni ukuchukumisa ikhowudi yeziqhagamshelo ngokwazo. Okwangoku kukho izandiso ezininzi ezikhoyo ukufezekisa le nto uyifunayo:

  • Swoole ― isakhelo se-asynchronous ephezulu yokusebenza kwe-PHP. Isetyenziswa zizigebenga ze-Intanethi ezifana ne-Alibaba kunye ne-Baidu. Ukusukela kwinguqulo 4.1.0 kuye kwavela indlela yomlingo SwooleRuntime ::enableCoroutine(), ekuvumela ukuba "uguqule iilayibrari zenethiwekhi ze-PHP ezilungelelanisiweyo zibe zi-asynchronous ezinomgca omnye wekhowudi."
  • I-Async ibikude kube mva nje kulwandiso oluthembisayo lomsebenzi ohambelana ne-asynchronous kwi-PHP. Kutheni kude kube mva nje? Ngelishwa, ngenxa yesizathu esingaziwayo kum, umbhali ucime indawo yokugcina kwaye ikamva leprojekthi alicacanga. Kuya kufuneka ndiyisebenzise enye ukusuka kwiifolokhwe. NjengoSwoole, olu lwandiso lukuvumela ukuba uvule ngokulula ibhulukhwe yakho ngokuqhwanyaza kwesandla ukuze wenze i-asynchrony ngokubuyisela ukuphunyezwa okusemgangathweni kwe-TCP kunye nemijelo ye-TLS kunye neenguqulelo zabo ze-asynchronous. Oku kwenziwa ngokhetho "async.tcp = 1Β«.
  • E fanayo ― ulwandiso olutsha oluvela kuJoe Watkins owaziwayo, umbhali wamathala eencwadi anje ngephpdbg, apcu, pthreads, pcov, uopz. Ulwandiso lubonelela nge-API yokuphindaphinda kwi-PHP kwaye ibekwe njengendawo yokutshintshwa kweepthreads. Umda obalulekileyo wethala leencwadi kukuba lisebenza kuphela nenguqulelo ye-ZTS (Zend Thread Safe) ye-PHP.

Siza kuvavanya njani?

Masiqalise umzekelo weTarantool ngokugawulwa kwemithi phambili kuvaliwe (wal_mode = akukho) kunye nokwanda kwesikhuseli somsebenzi womnatha (funda ngaphambili = 1 * 1024 * 1024). Inketho yokuqala iya kuphelisa umsebenzi kunye nediski, okwesibini kuya kwenza ukuba kufundwe izicelo ezininzi kwi-buffer yesixokelelwano esisebenzayo kwaye ngokwenjenjalo unciphise inani leefowuni zesixokelelwano.

Kwiibenchmarks ezisebenza ngedatha (ukufakwa, ukucinywa, ukufunda, njl.njl.), ngaphambi kokuba kuqaliswe ibhentshi, indawo ye-memtx iya (kwaphinda) yenziwe, apho amaxabiso esalathiso aphambili enziwa ngumvelisi wamaxabiso adityanisiweyo apheleleyo. (ulandelelwano).
Indawo ye-DDL ibonakala ngolu hlobo:

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

Ukuba kuyimfuneko, ngaphambi kokuba usebenzise ibhentshi, indawo izaliswe ngamaphepha angama-10,000 efom.

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

Ii-Tuples zifikelelwa kusetyenziswa ixabiso elingundoqo elingenamkhethe.

I-benchmark ngokwayo iyisicelo esisodwa kumncedisi, owenziwe ngamaxesha angama-10,000 (i-revolutions), leyo, nayo, iqhutywe ngokuphindaphindiweyo. Uphindaphindo luyaphindwa kude kube lonke ixesha ukutenxa phakathi kophindaphindo lwe-5 ngaphakathi kwempazamo eyamkelekileyo ye-3%*. Emva koku, umphumo oqhelekileyo uthathwa. Kukho ikhefu lesibini eli-1 phakathi kokuphindaphinda ukukhusela iprosesa ukuba iqhube. Umqokeleli wenkunkuma kaLua ukhubaziwe ngaphambi kokuphinda-phinda kwaye unyanzelekile ukuba aqale emva kokuba egqibile. Inkqubo ye-PHP iqaliswe kuphela kunye nezandiso eziyimfuneko kwi-benchmark, kunye ne-buffering yemveliso enikwe amandla kwaye umqokeleli wenkunkuma uvaliwe.

* Inani lohlaziyo, uphinda-phindo kunye nethreshold yempazamo inokutshintshwa kwisethingi yebenchmark.

Indawo yovavanyo

Iziphumo ezipapashwe ngezantsi zenziwe kwi-MacBookPro (2015), inkqubo yokusebenza - Fedora 30 (i-kernel version 5.3.8-200.fc30.x86_64). I-Tarantool yasungulwa kwi-docker kunye nepharamitha "--network host".

Iinguqulelo zepakethi:

Tarantool: 2.3.0-115-g5ba5ed37e
I-Docker: 19.03.3, yakha i-872fc2f86
PHP: 7.3.11 (cli) (eyakhelwe: Oct 22 2019 08:11:04)
tarantool / umxhasi: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ patch for 7.3)*
ext-msgpack: 2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
ext-parallel: 1.1.3

* Ngelishwa, isinxibelelanisi esisemthethweni asisebenzi ngenguqulo ye-PHP> 7.2. Ukuqokelela kunye nokuqhuba ulwandiso kwi-PHP 7.3, kwafuneka ndisebenzise isiqwenga.

Iziphumo

Imowudi yongqamaniso

Inkqubo yeTarantool isebenzisa ifomati yokubini MessagePack ukulandelelanisa imiyalezo. Kwisidibanisi se-PECL, ukulandelelana kufihlwe nzulu kubunzulu bethala leencwadi kwaye kuchaphazela inkqubo yokufakwa kweekhowudi kwikhowudi yomsebenzisi. ayibonakali inokwenzeka. Isidibanisi esisulungekileyo se-PHP, ngokuchaseneyo, sibonelela ngesakhono sokwenza inkqubo ye-encoding ngokwandisa i-encoder esemgangathweni okanye ngokusebenzisa ukuphunyezwa kwakho. Kukho iikhowudi ezimbini ezifumanekayo ngaphandle kwebhokisi, enye isekwe kuyo msgpack/msgpack-php (Ulwandiso olusemthethweni lwe-MessagePack PECL), enye ivuliwe rybakit/msgpack (kwi-PHP ecocekileyo).

Phambi kokuthelekisa iziqhagamshelo, siya kulinganisa ukusebenza kweekhowudi ze-MessagePack zesidibanisi se-PHP kwaye kuvavanyo olongezelelweyo siya kusebenzisa leyo ibonisa iziphumo ezilungileyo:

Ukukhawulezisa izixhumi ze-PHP zeTarantool usebenzisa i-Async, i-Swoole kunye neParallel
Nangona inguqulo ye-PHP (Pure) ingaphantsi kolwandiso lwe-PECL ngesantya, kwiiprojekthi zokwenyani ndingathanda ukuncoma ukuyisebenzisa. rybakit/msgpack, kuba kulwandiso olusemthethweni lwe-MessagePack ukucaciswa kwefomathi kuphunyezwe ngokuyinxenye kuphela (umzekelo, akukho nkxaso kwiintlobo zedatha yesiko, ngaphandle kwayo awuyi kukwazi ukusebenzisa i-Decimal - uhlobo olutsha lwedatha olufakwe kwi-Tarantool 2.3) kwaye ine inani labanye iingxaki (kubandakanywa nemiba yokuhambelana ne-PHP 7.4). Ewe, ngokubanzi, iprojekthi ibonakala ilahliwe.

Ke, masilinganise ukusebenza kweziqhagamshelo kwimowudi ehambelanayo:

Ukukhawulezisa izixhumi ze-PHP zeTarantool usebenzisa i-Async, i-Swoole kunye neParallel
Njengoko kunokubonwa kwigrafu, i-PECL connector (Tarantool) ibonisa ukusebenza okungcono xa kuthelekiswa ne-PHP isixhumi (uMthengi). Kodwa oku akumangalisi, ngenxa yokuba le yokugqibela, ukongeza ekuphunyezweni ngolwimi olucothayo, eneneni yenza umsebenzi omninzi: into entsha yenziwe ngomnxeba ngamnye. isicelo ΠΈ impendulo (kwimeko yokuKhetha - kwakhona Criteria, kwaye kwimeko yoHlaziyo/Upsert ― Operations), imibutho eyahlukileyo Uxhumano, Ipakethi ΠΈ Umphathi nazo zongeza ngaphezulu. Ngokucacileyo, ukuguquguquka kuza kwixabiso. Nangona kunjalo, ngokubanzi, itoliki ye-PHP ibonisa ukusebenza kakuhle, nangona kukho umehluko, ayibalulekanga kwaye, mhlawumbi, iya kuba ngaphantsi xa usebenzisa ukulayishwa kwangaphambili kwi-PHP 7.4, ingakhankanyi iJIT kwi-PHP 8.

Masiqhubele phambili. I-Tarantool 2.0 yongeza inkxaso ye-SQL. Makhe sizame ukwenza Khetha, Faka, Hlaziya kwaye Cima imisebenzi usebenzisa iprotocol yeSQL kwaye uthelekise iziphumo kunye ne-noSQL (yesibini) elinganayo:

Ukukhawulezisa izixhumi ze-PHP zeTarantool usebenzisa i-Async, i-Swoole kunye neParallel
Iziphumo zeSQL azichukumisi kakhulu (makhe ndikukhumbuze ukuba sisavavanya imowudi ye-synchronous). Nangona kunjalo, andiyi kucaphuka malunga nale nto phambi kwexesha; Inkxaso ye-SQL isephantsi kophuhliso olusebenzayo (kutsha nje, umzekelo, inkxaso yongezwa. iingxelo ezilungisiweyo) kwaye, ngokugweba ngoluhlu nemiba, i-injini ye-SQL iya kuqhuba inani lolungiselelo kwixesha elizayo.

Unyango

Ewe, ngoku makhe sibone ukuba ulwandiso lwe-Async lunokusinceda njani siphucule iziphumo ezingentla. Ukubhala iinkqubo ze-asynchronous, ulwandiso lubonelela nge-API esekelwe kwii-coroutines, esiya kuzisebenzisa. Sifumanisa ngamandla ukuba elona nani lifanelekileyo lee-coroutines zokusingqongileyo ngama-25:

Ukukhawulezisa izixhumi ze-PHP zeTarantool usebenzisa i-Async, i-Swoole kunye neParallel
"Sasaza" imisebenzi eyi-10,000 kwii-25 coroutines kwaye ubone ukuba kwenzeka ntoni:

Ukukhawulezisa izixhumi ze-PHP zeTarantool usebenzisa i-Async, i-Swoole kunye neParallel
Inani lemisebenzi ngesekhondi linyuke ngamaxesha angaphezu kwama-3 ngenxa tarantool-php/client!

Ngelishwa, i-PECL isinxibelelanisi ayizange iqale nge-ext-async.

Kuthekani ngeSQL?

Ukukhawulezisa izixhumi ze-PHP zeTarantool usebenzisa i-Async, i-Swoole kunye neParallel
Njengoko ubona, kwimo ye-asynchronous umahluko phakathi kweprotocol yokubini kunye neSQL ibe ngaphakathi komda wempazamo.

Swoole

Kwakhona sifumanisa elona nani lifanelekileyo lee-coroutines, ngeli xesha le-Swoole:
Ukukhawulezisa izixhumi ze-PHP zeTarantool usebenzisa i-Async, i-Swoole kunye neParallel
Masime ngo-25. Masiphinde iqhinga elifanayo kunye nolwandiso lwe-Async - ukusabalalisa imisebenzi ye-10,000 phakathi kwe-25 coroutines. Ukongeza, siya kongeza olunye uvavanyo apho siya kwahlula wonke umsebenzi kwiinkqubo ezimbini (oko kukuthi, inkqubo nganye iya kwenza imisebenzi engama-2 kwii-coroutines ezingama-5,000). Iinkqubo ziyakwenziwa kusetyenziswa SwooleProcess.

Iziphumo:

Ukukhawulezisa izixhumi ze-PHP zeTarantool usebenzisa i-Async, i-Swoole kunye neParallel
I-Swole ibonisa umphumo ophantsi kancinci xa kuthelekiswa ne-Async xa iqhutywe kwinkqubo enye, kodwa ngeenkqubo ze-2 umfanekiso utshintsha ngokuphawulekayo (inombolo ye-2 ayikhethwanga ngethuba; kumatshini wam, yayiyi-2 iinkqubo ezibonisa umphumo ongcono).

Ngendlela, ulwandiso lwe-Async lukwanayo ne-API yokusebenza kunye neenkqubo, kodwa apho andizange ndiqaphele nawuphi na umahluko ekusebenzeni kweebenchmarks kwinkqubo enye okanye ngaphezulu (kungenzeka ukuba ndiphazamise kwenye indawo).

I-SQL vs iprotocol yokubini:

Ukukhawulezisa izixhumi ze-PHP zeTarantool usebenzisa i-Async, i-Swoole kunye neParallel
Njengoko kunye ne-Async, umahluko phakathi kokubini kunye nokusebenza kwe-SQL kupheliswe kwimodi ye-asynchronous.

E fanayo

Kuba ulwandiso lweParallel alukho malunga nee-coroutines, kodwa malunga nemisonto, masilinganise elona nani lifanelekileyo lemisonto ehambelanayo:

Ukukhawulezisa izixhumi ze-PHP zeTarantool usebenzisa i-Async, i-Swoole kunye neParallel
Ilingana no 16 kumatshini wam. Masiqhube imilinganiselo yokudibanisa kwimisonto enxuseneyo eli-16:

Ukukhawulezisa izixhumi ze-PHP zeTarantool usebenzisa i-Async, i-Swoole kunye neParallel
Njengoko ubona, isiphumo singcono ngakumbi kunokwandiswa kwe-asynchronous (ngaphandle kokubala i-Swoole esebenza kwiinkqubo ezi-2). Qaphela ukuba isidibanisi se-PECL, uHlaziyo kunye nokusebenza okuPhakamisayo akunanto. Oku kungenxa yokuba le misebenzi ayiphumelelanga ngempazamo - andazi ukuba yayilityala le-ext-parallel, ext-tarantool, okanye zombini.

Ngoku makhe sithelekise ukusebenza kweSQL:

Ukukhawulezisa izixhumi ze-PHP zeTarantool usebenzisa i-Async, i-Swoole kunye neParallel
Qaphela ukufana kunye negrafu yezihlanganisi ezisebenza ngaxeshanye?

Kunye

Kwaye ekugqibeleni, makhe sishwankathele zonke iziphumo kwigrafu enye ukuze sibone umfanekiso opheleleyo wokwandiswa okuvavanywayo. Masenze nje uvavanyo olunye olutsha kwitshati, esingekayenzi okwangoku - masiqhube ii-Async coroutines ngokunxuseneyo sisebenzisa iParallel*. Umbono wokudibanisa izandiso ezingentla sele sele kwaxoxwa ababhali, kodwa akukho mvumelwano kwafikelelwa kuyo, kuya kufuneka ukwenze ngokwakho.

* Kwakungenakwenzeka ukusungula i-Swoole coroutines kunye neParallel; kubonakala ngathi ezi zandiso azihambelani.

Ngoko ke, iziphumo zokugqibela:

Ukukhawulezisa izixhumi ze-PHP zeTarantool usebenzisa i-Async, i-Swoole kunye neParallel

Endaweni yesiphelo

Ngokombono wam, iziphumo ziye zabonakala zifanelekile, kwaye ngenxa yesizathu esithile ndiqinisekile ukuba oku akusiyo umda! Nokuba ufuna ukuthatha isigqibo malunga noku kwiprojekthi yokwenyani kuphela, ndiza kuthi kum ibiluvavanyo olunomdla olukuvumela ukuba uvavanye ukuba ungakanani na "onokuthi ucudise" ngaphandle kwekhonkco le-TCP elihambelanayo ngomzamo omncinci. Ukuba unemibono yokuphucula iibenchmarks, ndiya kuvuya ukuqwalasela isicelo sakho sokutsala. Yonke ikhowudi enemiyalelo yokuqalisa kunye neziphumo ipapashwa ngokwahlukileyo iindawo zokugcina.

umthombo: www.habr.com

Yongeza izimvo