Ho potlakisa lihokelo tsa PHP bakeng sa Tarantool ho sebelisa Async, Swoole le Parallel

Ho potlakisa lihokelo tsa PHP bakeng sa Tarantool ho sebelisa Async, Swoole le Parallel

Sebakeng sa tikoloho ea PHP hajoale ho na le likhokahano tse peli tsa ho sebetsa le seva sa Tarantool - ena ke katoloso ea semmuso ea PECL. tarantool/tarantool-php, e ngotsoeng ka C, le tarantool-php/client, e ngotsoeng ka PHP. Ke 'na mongoli oa ho qetela.

Sehloohong sena, ke rata ho arolelana liphetho tsa tlhahlobo ea ts'ebetso ea lilaebrari ka bobeli le ho bonts'a hore na, ka liphetoho tse fokolang ho khoutu, o ka fihlela keketseho ea ts'ebetso ea 3-5 (litekong tsa maiketsetso!).

Re tla leka eng?

Re tla leka tse boletsoeng ka holimo e tsamaisanang lihokelo tse tsamaeang ka mokhoa o ts'oanang, ka ho ts'oana, le ka mokhoa o ts'oanang. 🙂 Hape ha re batle ho ama khoutu ea lihokelo ka botsona. Hajoale ho na le likeketso tse 'maloa tse fumanehang ho fihlela seo u se batlang:

  • Swoole ― moralo o sebetsang hantle oa asynchronous bakeng sa PHP. E sebelisoa ke linatla tse kang Alibaba le Baidu. Ho tloha ka mofuta oa 4.1.0 ho hlahile mokhoa oa boselamose SwooleRuntime ::enableCoroutine(), e u lumellang ho "fetola lilaebrari tsa marang-rang tsa PHP hore e be tse sa lumellaneng tse nang le mola o le mong oa khoutu."
  • Async e bile katoloso e ts'episang haholo bakeng sa mosebetsi oa asynchronous ho PHP. Hobaneng ho fihlela morao tjena? Ka bomalimabe, ka lebaka leo ke sa le tsebeng, mongoli o hlakotse polokelo mme bokamoso ba morero ha bo hlake. Ke tla tlameha ho e sebelisa ngoe ho tloha liferekong. Joalo ka Swoole, katoloso ena e u lumella ho bulela borikhoe ba hau habonolo ka letsoho ho etsa hore asynchrony ka ho nkela ts'ebetso e tloaelehileng ea melapo ea TCP le TLS ka mefuta ea bona e sa ts'oaneng. Sena se etsoa ka khetho "async.tcp = 1".
  • Ho tšoana - katoloso e ncha e tsoang ho Joe Watkins ea tsebahalang, sengoli sa lilaebrari tse kang phpdbg, apcu, pthreads, pcov, uopz. Katoloso e fana ka API bakeng sa ho bala ka bongata ho PHP mme e behiloe joalo ka sebaka sa li-pthreads. Khaello e kholo ea laeborari ke hore e sebetsa feela le mofuta oa ZTS (Zend Thread Safe) oa PHP.

Re tla leka joang?

Ha re hlahiseng mohlala oa Tarantool ka ho rema lifate esale pele ho holofalitsoe (wal_mode = ha ho letho) le ho eketsa buffer ea marang-rang (bala pele = 1 * 1024 * 1024). Khetho ea pele e tla felisa mosebetsi le disk, ea bobeli e tla etsa hore ho khonehe ho bala likōpo tse ling tse tsoang ho buffer ea tsamaiso ea ts'ebetso 'me ka hona ho fokotsa palo ea mehala ea tsamaiso.

Bakeng sa li-benchmarks tse sebetsang ka data (ho kenya, ho hlakola, ho bala, joalo-joalo), pele u qala benchmark, sebaka sa memtx se tla (re) se thehoe, moo litekanyetso tsa mantlha tsa index li hlahisoang ke jenereithara ea litekanyetso tse felletseng tse laetsoeng. (tatellano).
Sebaka sa DDL se shebahala tjena:

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

Haeba ho hlokahala, pele o tsamaisa benchmark, sebaka se tlatsitsoe ka likopi tse 10,000 tsa foromo.

{id, "tuplе_<id>"}

Li-tuples li fumaneha ho sebelisoa boleng bo sa reroang.

Benchmark ka boeona ke kopo e le 'ngoe ho seva, e etsoang ka makhetlo a 10,000 (liphetoho), tseo, le tsona, li etsoang ka ho pheta-pheta. Liphetoho li phetoa ho fihlela liphapang tsa nako eohle lipakeng tsa 5 li ka har'a phoso e amohelehang ea 3% *. Ka mor'a sena, sephetho se tloaelehileng se nkoa. Ho na le khefutso ea motsotsoana o le mong pakeng tsa ho pheta-pheta ho thibela processor hore e se ke ea sisinyeha. Moqotetsi oa lithōle oa Lua oa holofala pele ho phetisetso e 'ngoe le e 'ngoe 'me o qobelloa ho qala ka mor'a hore e phethe. Ts'ebetso ea PHP e qalisoa feela ka likeketso tse hlokahalang bakeng sa benchmark, e nang le buffering ea tlhahiso e nolofalitsoeng mme moqokeleli oa lithōle o holofetse.

* Palo ea liphetohelo, phetisetso le moeli oa liphoso li ka fetoloa maemong a benchmark.

Sebaka sa teko

Liphetho tse hatisitsoeng ka tlase li entsoe ka MacBookPro (2015), sistimi e sebetsang - Fedora 30 (mofuta oa kernel 5.3.8-200.fc30.x86_64). Tarantool e ile ea hlahisoa ka docker e nang le parameter "--network host".

Mefuta ea liphutheloana:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, haha ​​​​a872fc2f86
PHP: 7.3.11 (cli) (e hahiloe: Oct 22 2019 08:11:04)
tarantool / moreki: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ patch bakeng sa 7.3)*
ext-msgpack: 2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
ext-parallel: 1.1.3

* Ka bomalimabe, sehokelo sa semmuso ha se sebetse le mofuta oa PHP> 7.2. Ho bokella le ho tsamaisa katoloso ho PHP 7.3, ke ile ka tlameha ho e sebelisa patch.

Liphetho

Mokhoa o lumellanang

Protocol ea Tarantool e sebelisa sebopeho sa binary MessagePack ho hlophisa melaetsa. Sehokelong sa PECL, serialization e patiloe botebong ba laeborari mme e ama ts'ebetso ea khouto ho tsoa ho khoutu ea basebelisi. ha ho bonahale ho khoneha. Sehokelo se hloekileng sa PHP, ho fapana le hoo, se fana ka bokhoni ba ho etsa mokhoa oa khouto ka ho holisa encoder e tloaelehileng kapa ka ho sebelisa ts'ebetso ea hau. Ho na le li-encoder tse peli tse fumanehang ka ntle ho lebokose, e 'ngoe e ipapisitse le msgpack/msgpack-php (katoloso ea semmuso ea MessagePack PECL), e 'ngoe e ntse e tsoela pele rybakit/msgpack (ka PHP e hloekileng).

Pele re bapisa lihokelo, re tla lekanya ts'ebetso ea li-encoder tsa MessagePack bakeng sa sehokelo sa PHP mme litekong tse ling re tla sebelisa e bonts'ang sephetho se setle ka ho fetisisa:

Ho potlakisa lihokelo tsa PHP bakeng sa Tarantool ho sebelisa Async, Swoole le Parallel
Leha mofuta oa PHP (Pure) o tlase ho katoloso ea PECL ka lebelo, mererong ea 'nete ke ntse ke tla khothaletsa ho e sebelisa. rybakit/msgpack, hobane ho katoloso ea semmuso ea MessagePack, litlhaloso tsa sebopeho li kengoa tšebetsong hanyane feela (mohlala, ha ho na ts'ehetso bakeng sa mefuta ea data e tloaelehileng, ntle le eo u ke keng ua khona ho sebelisa Decimal - mofuta o mocha oa data o hlahisitsoeng ho Tarantool 2.3) mme o na le palo ea ba bang mathata (ho kenyeletsoa le litaba tsa ho lumellana le PHP 7.4). Hantle, ka kakaretso, morero ona o shebahala o lahliloe.

Kahoo, ha re lekanye ts'ebetso ea lihokelo ka mokhoa oa synchronous:

Ho potlakisa lihokelo tsa PHP bakeng sa Tarantool ho sebelisa Async, Swoole le Parallel
Joalokaha ho ka bonoa ho graph, sehokelo sa PECL (Tarantool) se bonts'a ts'ebetso e ntle ha e bapisoa le sehokelo sa PHP (Client). Empa sena ha se makatse, kaha ho qetela, ntle le ho kenngoa ts'ebetsong ka puo e fokolang, ha e le hantle e etsa mosebetsi o mongata: ntho e ncha e bōptjoa ka mohala o mong le o mong. Request и karabelo (tabeng ea Khetha - hape Litlhahiso, le tabeng ea Update/Upsert ― ts'ebetso ea), mekhatlo e arohaneng Kamano, Paka и Tšoara li boetse li eketsa ka holimo. Ho hlakile hore ho tenyetseha ho tla ka theko. Leha ho le joalo, ka kakaretso, mofetoleli oa PHP o bontša ts'ebetso e ntle, le hoja ho na le phapang, ha e na thuso 'me, mohlomong, e tla ba tlase le ho feta ha u sebelisa preloading ho PHP 7.4, re sa bue ka JIT ho PHP 8.

Ha re tsoeleng pele. Tarantool 2.0 e hlahisitse tšehetso ea SQL. Ha re leke ho etsa Ts'ebetso ea Khetha, Kenya, Nchafatso le Hlakola re sebelisa protocol ea SQL mme re bapise liphetho le tse lekanang le tsa noSQL (binary):

Ho potlakisa lihokelo tsa PHP bakeng sa Tarantool ho sebelisa Async, Swoole le Parallel
Liphetho tsa SQL ha li khahle haholo (e re ke u hopotse hore re ntse re leka mokhoa oa synchronous). Leha ho le joalo, nke ke ka halefisoa ke sena pele ho nako; Tšehetso ea SQL e ntse e le tlas'a nts'etsopele e sebetsang (haufinyane tjena, mohlala, tšehetso e ile ea eketsoa. lipolelo tse lokisitsoeng) le, ho ahlola ka lenane litokollo, enjene ea SQL e tla ba le lintlafatso tse ngata nakong e tlang.

Amohela

Joale, ha re boneng hore na katoloso ea Async e ka re thusa joang ho ntlafatsa liphetho tse kaholimo. Ho ngola mananeo a asynchronous, katoloso e fana ka API e thehiloeng ho li-coroutines, tseo re tla li sebelisa. Re fumana ka matla hore palo e nepahetseng ea li-coroutines bakeng sa tikoloho ea rona ke 25:

Ho potlakisa lihokelo tsa PHP bakeng sa Tarantool ho sebelisa Async, Swoole le Parallel
"Hasa" ts'ebetso ea 10,000 ho pholletsa le li-coroutines tse 25 'me u bone se etsahalang:

Ho potlakisa lihokelo tsa PHP bakeng sa Tarantool ho sebelisa Async, Swoole le Parallel
Palo ea ts'ebetso ka motsotsoana e eketsehile ka makhetlo a fetang 3 bakeng sa tarantool-php/client!

Ka bomalimabe, sehokelo sa PECL ha sea qala ka ext-async.

Ho thoe'ng ka SQL?

Ho potlakisa lihokelo tsa PHP bakeng sa Tarantool ho sebelisa Async, Swoole le Parallel
Joalo ka ha u bona, ka mokhoa oa asynchronous phapang lipakeng tsa protocol ea binary le SQL e bile ka har'a moeli oa phoso.

Swoole

Hape re fumana palo e nepahetseng ea li-coroutines, lekhetlong lena bakeng sa Swoole:
Ho potlakisa lihokelo tsa PHP bakeng sa Tarantool ho sebelisa Async, Swoole le Parallel
Ha re emiseng ho 25. Ha re pheteng leqheka le ts'oanang le ka katoloso ea Async - abela ts'ebetso ea 10,000 lipakeng tsa li-coroutine tse 25. Ntle le moo, re tla eketsa tlhahlobo e 'ngoe eo ho eona re tla arola mosebetsi oohle ka lits'ebetso tse peli tse peli (ke hore, ts'ebetso e' ngoe le e 'ngoe e tla etsa ts'ebetso ea 2 ho li-coroutine tse 5,000). Mekhoa e tla etsoa ho sebelisoa SwooleProcess.

Liphetho:

Ho potlakisa lihokelo tsa PHP bakeng sa Tarantool ho sebelisa Async, Swoole le Parallel
Swole e bonts'a sephetho se tlase hanyenyane ha se bapisoa le Async ha se tsamaisoa ka mokhoa o le mong, empa ka mekhoa ea 2 setšoantšo se fetoha haholo (nomoro ea 2 ha ea khethoa ka tšohanyetso; mochine oa ka, e ne e le mekhoa ea 2 e bontšang sephetho se setle ka ho fetisisa).

Ka tsela, katoloso ea Async e boetse e na le API ea ho sebetsa ka lits'ebetso, empa moo ha kea ka ka hlokomela phapang leha e le efe ho tloha ho sebetsa li-benchmarks ka mokhoa o le mong kapa ho feta (ho ka etsahala hore ebe ke senyehile kae-kae).

SQL vs binary protocol:

Ho potlakisa lihokelo tsa PHP bakeng sa Tarantool ho sebelisa Async, Swoole le Parallel
Joalo ka Async, phapang lipakeng tsa ts'ebetso ea binary le SQL e felisitsoe ka mokhoa oa asynchronous.

Ho tšoana

Kaha katoloso ea Parallel ha e bue ka li-coroutines, empa e mabapi le likhoele, a re lekanyeng palo e nepahetseng ea likhoele tse tšoanang:

Ho potlakisa lihokelo tsa PHP bakeng sa Tarantool ho sebelisa Async, Swoole le Parallel
E lekana le 16 mochining oaka. Ha re tsamaise li-benchmarks ho likhoele tse 16 tse bapileng:

Ho potlakisa lihokelo tsa PHP bakeng sa Tarantool ho sebelisa Async, Swoole le Parallel
Joalokaha u bona, sephetho se betere ho feta ka li-extensions tsa asynchronous (ho sa bale Swoole e sebetsang lits'ebetsong tse 2). Hlokomela hore bakeng sa sehokelo sa PECL, ts'ebetso ea Update le Upsert ha e na letho. Sena se bakoa ke taba ea hore ts'ebetso ena e hlolehile ka phoso - ha ke tsebe hore na e ne e le phoso ea ext-parallel, ext-tarantool, kapa ka bobeli.

Joale ha re bapiseng ts'ebetso ea SQL:

Ho potlakisa lihokelo tsa PHP bakeng sa Tarantool ho sebelisa Async, Swoole le Parallel
Hlokomela ho tšoana le kerafo bakeng sa likhokahano tse sebetsang ka mokhoa o lumellanang?

Mmoho

'Me qetellong, ha re akaretseng liphetho tsohle ka graph e le' ngoe ho bona setšoantšo se akaretsang sa likeketso tse lekiloeng. Ha re kenyeng teko e le 'ngoe e ncha chate, eo re so kang re e etsa - ha re tsamaiseng li-coroutines tsa Async ka ho bapa re sebelisa Parallel*. Mohopolo oa ho kopanya likeketso tse kaholimo o se o ntse o le teng ho ile ha buisanoa ka eona bangoli, empa ha ho tumellano e fihletsoeng, u tla tlameha ho e etsa u le mong.

* Ho ne ho sa khonehe ho qala li-coroutines tsa Swoole ka Parallel; ho bonahala eka likeketso tsena ha li lumellane.

Kahoo, liphetho tsa ho qetela:

Ho potlakisa lihokelo tsa PHP bakeng sa Tarantool ho sebelisa Async, Swoole le Parallel

Ho e-na phetheha

Ka maikutlo a ka, liphetho li ile tsa fetoha tse loketseng, 'me ka mabaka a itseng ke na le bonnete ba hore sena ha se moeli! Ho sa tsotellehe hore na u lokela ho etsa qeto ea sena morerong oa sebele u le mong, ke tla re feela ho 'na e ne e le teko e thahasellisang e u lumellang hore u hlahlobe hore na u ka "petetsa" bokae ho tsoa ho sehokelo sa TCP se lumellanang ka boiteko bo fokolang. Haeba u na le maikutlo a ho ntlafatsa li-benchmarks, ke tla thabela ho nahana ka kopo ea hau ea ho hula. Khoutu eohle e nang le litaelo tsa ho qala le liphetho li phatlalatsoa ka thoko bobolokelo.

Source: www.habr.com

Eketsa ka tlhaloso