Ukusheshisa izixhumi ze-PHP ze-Tarantool kusetshenziswa i-Async, i-Swoole ne-Parallel

Ukusheshisa izixhumi ze-PHP ze-Tarantool kusetshenziswa i-Async, i-Swoole ne-Parallel

Ku-ecosystem ye-PHP okwamanje kunezixhumi ezimbili zokusebenza neseva ye-Tarantool - lesi isandiso esisemthethweni se-PECL i-tarantool/tarantool-php, ebhalwe ngo-C, kanye tarantool-php/client, ebhalwe nge-PHP. Ngingumbhali walokhu kwakamuva.

Kulesi sihloko, ngingathanda ukwabelana ngemiphumela yokuhlolwa kokusebenza kwayo yomibili imitapo yolwazi futhi ngibonise ukuthi, ngezinguquko ezincane kukhodi, ungafinyelela kanjani ukukhuphuka kokusebenza okungu-3-5 (ekuhlolweni kokwenziwa!).

Yini esizoyihlola?

Sizobavivinya laba okukhulunywe ngabo ngenhla ehambisanayo izixhumi ezisebenza ngokuhambisanayo, ngokuhambisana, nangokuhambisana ngokulinganayo. πŸ™‚ Futhi asifuni ukuthinta ikhodi yezixhumi ngokwazo. Okwamanje kunezandiso ezimbalwa ezitholakalayo ukuze ufeze okufunayo:

  • Swoole ― uhlaka olusebenza kahle lwe-asynchronous lwe-PHP. Isetshenziswa iziqhwaga ze-inthanethi ezifana ne-Alibaba ne-Baidu. Kusukela kunguqulo 4.1.0 kuvele indlela yomlingo SwooleRuntime ::enableCoroutine(), okukuvumela ukuthi "uguqule imitapo yolwazi yenethiwekhi ye-PHP evumelanisiwe ibe evumelanayo enomugqa owodwa wekhodi."
  • I-Async kuze kube muva nje iyisandiso esithembisayo kakhulu somsebenzi ongavumelanisi ku-PHP. Kungani kuze kube muva nje? Ngeshwa, ngenxa yesizathu engingasazi, umbhali ususe inqolobane futhi isiphetho sephrojekthi esizayo asicacile. Kuzofanele ngiyisebenzise eyodwa kusukela ezimfoloko. Njenge-Swoole, lesi sandiso sikuvumela ukuthi uvule kalula ibhulukwe lakho ngokuthinta isihlakala ukuze unike amandla i-asynchrony ngokufaka esikhundleni sokusetshenziswa okujwayelekile kokusakazwa kwe-TCP ne-TLS ngezinguqulo zakhona ezingavumelaniyo. Lokhu kwenziwa ngenketho ethi β€œasync.tcp = 1".
  • Okufanayo ― isandiso esisha esivela kuJoe Watkins owaziwayo, umbhali wemitapo yolwazi efana nephpdbg, apcu, pthreads, pcov, uopz. Isandiso sihlinzeka nge-API yokufunda okuningi ku-PHP futhi sibekwe esikhundleni se-pthreads. Umkhawulo obalulekile womtapo wolwazi ukuthi usebenza kuphela nenguqulo ye-ZTS (Zend Thread Safe) ye-PHP.

Sizohlola kanjani?

Ake sethule isenzakalo se-Tarantool ngokugawulwa kwemithi ngokubhala kusengaphambili kukhutshaziwe (wal_mode = none) kanye nokwanda kwebhafa yenethiwekhi (funda phambili = 1 * 1024 * 1024). Inketho yokuqala izoqeda umsebenzi ngediski, eyesibili izokwenza kube nokwenzeka ukufunda izicelo eziningi ezivela kubhafa yesistimu yokusebenza futhi ngaleyo ndlela kuncishiswe inani lezingcingo zesistimu.

Kumabhentshimakhi asebenza nedatha (ukufaka, ukususwa, ukufunda, njll.), ngaphambi kokuqala ibhentshimakhi, kuzokwakhiwa kabusha isikhala se-memtx, lapho amanani enkomba eyinhloko enziwa khona yi-generator yamavelu enombolo ephelele e-odiwe (ukulandelana).
I-DDL yesikhala ibonakala kanje:

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

Uma kunesidingo, ngaphambi kokusebenzisa ibhentshimakhi, isikhala sigcwaliswa ngama-tuples ayi-10,000 efomu.

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

Ama-Tuples afinyelelwa kusetshenziswa inani elingukhiye elingahleliwe.

I-benchmark ngokwayo iyisicelo esisodwa kuseva, esenziwa izikhathi ezingu-10,000 (ama-revolutions), okuthi, nawo, asebenze ngokuphindaphindiwe. Ukuphindaphinda kuyaphindwa kuze kube sonke isikhathi ukuchezuka phakathi kweziphindaphindo ezi-5 kungaphakathi kwephutha elamukelekayo lika-3%*. Ngemuva kwalokhu, umphumela ojwayelekile uthathwa. Kukhona ukuphumula kwesekhondi elingu-1 phakathi kokuphindaphinda ukuvimbela iphrosesa ukuthi inganyakazi. Umqoqi kadoti we-Lua ukhutshaziwe ngaphambi kokuphindaphinda ngakunye futhi uyaphoqeleka ukuthi uqale ngemuva kokuqeda. Inqubo ye-PHP yethulwa kuphela ngezandiso ezidingekayo zebhentshimakhi, ngokugcina kumthamo okukhiphayo kunikwe amandla futhi umqoqi kadoti ukhutshaziwe.

* Inombolo yokuguquguquka, ukuphindaphinda kanye nomkhawulo wephutha ungashintshwa kuzilungiselelo zebhentshimakhi.

Indawo yokuhlola

Imiphumela eshicilelwe ngezansi yenziwe ku-MacBookPro (2015), isistimu yokusebenza - i-Fedora 30 (inguqulo ye-kernel 5.3.8-200.fc30.x86_64). I-Tarantool yethulwa endaweni ye-docker enepharamitha "--network host".

Izinguqulo zephakheji:

Tarantool: 2.3.0-115-g5ba5ed37e
I-Docker: 19.03.3, yakha i-a872fc2f86
I-PHP: 7.3.11 (cli) (yakhiwe: Okt 22 2019 08:11:04)
i-tarantool/iklayenti: 0.6.0
rybakit/msgpack: 0.6.1
i-ext-tarantool: 0.3.2 (+ isichibi sokungu-7.3)*
i-ext-msgpack: 2.0.3
i-ext-async: 0.3.0-8c1da46
i-ext-swoole: 4.4.12
i-ext-parallel: 1.1.3

* Ngeshwa, isixhumi esisemthethweni asisebenzi nenguqulo ye-PHP> 7.2. Ukuhlanganisa nokusebenzisa isandiso ku-PHP 7.3, bekufanele ngisebenzise isichibi.

Imiphumela

Imodi yokuvumelanisa

Iphrothokholi ye-Tarantool isebenzisa ifomethi kanambambili I-MessagePack ukuhlela imilayezo. Kusixhumi se-PECL, ukwenziwa kwe-serialization kufihlwe ekujuleni kwelabhulali futhi kuthinta inqubo yombhalo wekhodi kusuka kukhodi yezwe lomsebenzisi. akubonakali kungenzeka. Isixhumi esihlanzekile se-PHP, ngokuphambene nalokho, sinikeza ikhono lokwenza inqubo yokufaka ngokwezifiso ngokunweba isifaki khodi esijwayelekile noma ngokusebenzisa owakho ukusebenzisa. Kukhona izifaki khodi ezimbili ezitholakala ngaphandle kwebhokisi, esisodwa sisekelwe kukho msgpack/msgpack-php (isandiso esisemthethweni se-MessagePack PECL), enye ivuliwe rybakit/msgpack (nge-PHP ehlanzekile).

Ngaphambi kokuqhathanisa izixhumi, sizokala ukusebenza kwezifaki khodi ze-MessagePack zesixhumi se-PHP futhi ekuhloleni okwengeziwe sizosebenzisa leyo ebonisa umphumela omuhle kakhulu:

Ukusheshisa izixhumi ze-PHP ze-Tarantool kusetshenziswa i-Async, i-Swoole ne-Parallel
Nakuba inguqulo ye-PHP (Pure) ingaphansi kwesandiso se-PECL ngesivinini, kumaphrojekthi wangempela ngisazoncoma ukuyisebenzisa. rybakit/msgpack, ngoba esandisweni esisemthethweni se-MessagePack ukucaciswa kwefomethi kusetshenziswa kancane (isibonelo, akukho ukusekelwa kwezinhlobo zedatha yangokwezifiso, ngaphandle kwalokho ongeke ukwazi ukusebenzisa iDesimali - uhlobo olusha lwedatha olwethulwe ku-Tarantool 2.3) futhi luno inombolo yabanye izinkinga (kuhlanganise nezindaba zokuhambisana ne-PHP 7.4). Nokho, ngokuvamile, iphrojekthi ibukeka ilahliwe.

Ngakho-ke, ake silinganise ukusebenza kwezixhumi kwimodi yokuvumelanisa:

Ukusheshisa izixhumi ze-PHP ze-Tarantool kusetshenziswa i-Async, i-Swoole ne-Parallel
Njengoba kungabonwa kugrafu, isixhumi se-PECL (i-Tarantool) sibonisa ukusebenza okungcono uma kuqhathaniswa nesixhumi se-PHP (Iklayenti). Kodwa lokhu akumangazi, ngoba lokhu kwakamuva, ngaphezu kokusetshenziswa ngolimi olunensayo, empeleni kwenza umsebenzi owengeziwe: kwakhiwa into entsha ngocingo ngalunye. Isicelo ΠΈ Imphendvulo (uma kwenzeka Khetha - futhi Imigomo, futhi esimweni se-Update/Upsert ― Operations), izinhlangano ezihlukene Connection, I-Packer ΠΈ I-Handler bangeza futhi phezulu. Ngokusobala, ukuguquguquka kuza ngentengo. Kodwa-ke, ngokuvamile, umhumushi we-PHP ubonisa ukusebenza okuhle, nakuba kukhona umehluko, awubalulekile futhi, mhlawumbe, uzoba ngaphansi uma usebenzisa ukulayisha kuqala ku-PHP 7.4, ingasaphathwa i-JIT ku-PHP 8.

Asiqhubeke. I-Tarantool 2.0 yengeze ukwesekwa kwe-SQL. Ake sizame ukwenza imisebenzi ethi Khetha, Faka, Buyekeza futhi Usule sisebenzisa iphrothokholi ye-SQL futhi siqhathanise imiphumela nokulingana kwe-noSQL (kanambambili):

Ukusheshisa izixhumi ze-PHP ze-Tarantool kusetshenziswa i-Async, i-Swoole ne-Parallel
Imiphumela ye-SQL ayihlaba umxhwele kakhulu (ake ngikukhumbuze ukuthi sisahlola imodi yokuvumelanisa). Kodwa-ke, ngeke ngicasuke ngalokhu kusenesikhathi; Ukusekelwa kwe-SQL kusengaphansi kwentuthuko esebenzayo (kamuva nje, ngokwesibonelo, ukwesekwa kungeziwe. izitatimende ezilungisiwe) futhi, ukwahlulela ngohlu nezindaba, injini ye-SQL izothuthukiswa kaningi esikhathini esizayo.

Vumelanisa

Nokho, manje ake sibone ukuthi isandiso se-Async singasisiza kanjani sithuthukise imiphumela engenhla. Ukubhala izinhlelo ezingavumelanisi, isandiso sinikeza i-API esekelwe kuma-coroutines, esizowasebenzisa. Sithola ngokunamandla ukuthi inani eliphelele lama-coroutines endaweni yethu yi-25:

Ukusheshisa izixhumi ze-PHP ze-Tarantool kusetshenziswa i-Async, i-Swoole ne-Parallel
"Sabalalisa" imisebenzi eyi-10,000 kuma-coroutines angama-25 futhi ubone ukuthi kwenzekani:

Ukusheshisa izixhumi ze-PHP ze-Tarantool kusetshenziswa i-Async, i-Swoole ne-Parallel
Inani lemisebenzi ngomzuzwana likhuphuke izikhathi ezingaphezu kwezingu-3 tarantool-php/client!

Ngokudabukisayo, isixhumi se-PECL asiqalanga nge-ext-async.

Kuthiwani nge-SQL?

Ukusheshisa izixhumi ze-PHP ze-Tarantool kusetshenziswa i-Async, i-Swoole ne-Parallel
Njengoba ubona, kwimodi engavumelaniyo umehluko phakathi kwephrothokholi kanambambili ne-SQL waba ngaphakathi kwephutha lephutha.

Swoole

Futhi sithola inani eliphelele lama-coroutines, kulokhu ku-Swoole:
Ukusheshisa izixhumi ze-PHP ze-Tarantool kusetshenziswa i-Async, i-Swoole ne-Parallel
Ake sime ku-25. Masiphinde iqhinga elifanayo nesandiso se-Async - sabalalise imisebenzi engu-10,000 phakathi kwama-coroutine angu-25. Ngaphezu kwalokho, sizofaka olunye uvivinyo lapho sizohlukanisa khona wonke umsebenzi ngezinqubo ezimbili ezi-2 (okungukuthi, inqubo ngayinye izokwenza imisebenzi engu-5,000 kuma-coroutines angu-25). Izinqubo zizodalwa kusetshenziswa I-SwooleProcess.

Imiphumela:

Ukusheshisa izixhumi ze-PHP ze-Tarantool kusetshenziswa i-Async, i-Swoole ne-Parallel
I-Swole ibonisa umphumela ophansi kancane uma uqhathaniswa ne-Async uma iqhutshwa ngenqubo eyodwa, kodwa ngezinqubo ezingu-2 isithombe sishintsha kakhulu (inombolo engu-2 ayizange ikhethwe ngenhlanhla; emshinini wami, kwakuyizinqubo ezi-2 ezibonisa umphumela omuhle kakhulu).

Ngendlela, isandiso se-Async sine-API yokusebenza ngezinqubo, kodwa lapho angizange ngibone noma yimuphi umehluko ekusebenziseni amabhentshimakhi kunqubo eyodwa noma ngaphezulu (kungenzeka ukuthi ngimoshe ndawana thize).

I-SQL vs iphrothokholi kanambambili:

Ukusheshisa izixhumi ze-PHP ze-Tarantool kusetshenziswa i-Async, i-Swoole ne-Parallel
Njenge-Async, umehluko phakathi kokusebenza kanambambili kanye ne-SQL uyasuswa ngemodi evumelanayo.

Okufanayo

Njengoba isandiso se-Parallel singaphathelene nama-coroutines, kodwa mayelana nezintambo, ake silinganise inani eliphelele lezintambo ezifanayo:

Ukusheshisa izixhumi ze-PHP ze-Tarantool kusetshenziswa i-Async, i-Swoole ne-Parallel
Ilingana no-16 emshinini wami. Masisebenzise amabhentshimakhi esixhumi emicu ehambisanayo engu-16:

Ukusheshisa izixhumi ze-PHP ze-Tarantool kusetshenziswa i-Async, i-Swoole ne-Parallel
Njengoba ubona, umphumela ungcono kakhulu kunezandiso ezingavumelanisi (ingabalwa i-Swoole esebenza ngezinqubo ezi-2). Qaphela ukuthi kusixhumi se-PECL, imisebenzi yokuvuselela kanye ne-Upst ayinalutho. Lokhu kungenxa yokuthi le misebenzi ihlulekile ngephutha - angazi noma bekuyiphutha le-ext-parallel, ext-tarantool, noma kokubili.

Manje ake siqhathanise ukusebenza kwe-SQL:

Ukusheshisa izixhumi ze-PHP ze-Tarantool kusetshenziswa i-Async, i-Swoole ne-Parallel
Uyaqaphela ukufana negrafu yezixhumi ezisebenza ngokuvumelanisa?

Ndawonye

Futhi ekugcineni, ake sifingqe yonke imiphumela kugrafu eyodwa ukuze sibone isithombe esiphelele sezandiso ezihloliwe. Ake sengeze ukuhlolwa okusha nje okukodwa eshadini, esingakakakwenzi - ake sisebenzise ama-Async coroutines ngokuhambisana sisebenzisa i-Parallel*. Umqondo wokuhlanganisa izandiso ezingenhla usuvele usuvele kwaxoxwa ngakho ababhali, kodwa akukho ukuvumelana okufinyelelwe, kuzomele ukwenze ngokwakho.

* Akwenzekanga ukwethula ama-Swoole coroutines nge-Parallel; kubonakala sengathi lezi zandiso azihambisani.

Ngakho, imiphumela yokugcina:

Ukusheshisa izixhumi ze-PHP ze-Tarantool kusetshenziswa i-Async, i-Swoole ne-Parallel

Esikhundleni isiphetho

Ngokubona kwami, imiphumela ibonakale ifaneleka impela, futhi ngasizathu simbe ngiyaqiniseka ukuthi lokhu akuwona umkhawulo! Kungakhathaliseki ukuthi udinga ukuzinqumela lokhu kuphrojekthi yangempela ngokwakho, ngizosho kuphela ukuthi kimina bekuwukuhlolwa okuthakazelisayo okukuvumela ukuthi uhlole ukuthi "ungakwazi ukukhama" kangakanani kusixhumi se-TCP esivumelanayo ngomzamo omncane. Uma unemibono yokuthuthukisa amabhentshimakhi, ngizojabula ukucabangela isicelo sakho sokudonsa. Yonke ikhodi enemiyalo yokuqalisa nemiphumela ishicilelwa ngokuhlukile izinqolobane.

Source: www.habr.com

Engeza amazwana