Kwi-ecosystem ye-PHP okwangoku kukho iziqhagamshelo ezimbini zokusebenza kunye neseva ye-Tarantool - olu lulwandiso olusemthethweni lwe-PECL.
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
Iziphumo
Imowudi yongqamaniso
Inkqubo yeTarantool isebenzisa ifomati yokubini
Phambi kokuthelekisa iziqhagamshelo, siya kulinganisa ukusebenza kweekhowudi ze-MessagePack zesidibanisi se-PHP kwaye kuvavanyo olongezelelweyo siya kusebenzisa leyo ibonisa iziphumo ezilungileyo:
Nangona inguqulo ye-PHP (Pure) ingaphantsi kolwandiso lwe-PECL ngesantya, kwiiprojekthi zokwenyani ndingathanda ukuncoma ukuyisebenzisa.
Ke, masilinganise ukusebenza kweziqhagamshelo kwimowudi ehambelanayo:
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:
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.
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:
"Sasaza" imisebenzi eyi-10,000 kwii-25 coroutines kwaye ubone ukuba kwenzeka ntoni:
Inani lemisebenzi ngesekhondi linyuke ngamaxesha angaphezu kwama-3 ngenxa
Ngelishwa, i-PECL isinxibelelanisi ayizange iqale nge-ext-async.
Kuthekani ngeSQL?
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:
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:
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:
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:
Ilingana no 16 kumatshini wam. Masiqhube imilinganiselo yokudibanisa kwimisonto enxuseneyo eli-16:
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:
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
* Kwakungenakwenzeka ukusungula i-Swoole coroutines kunye neParallel; kubonakala ngathi ezi zandiso azihambelani.
Ngoko ke, iziphumo zokugqibela:
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
umthombo: www.habr.com