Na-eme ngwa ngwa njikọ PHP maka Tarantool site na iji Async, Swoole na Parallel

Na-eme ngwa ngwa njikọ PHP maka Tarantool site na iji Async, Swoole na Parallel

Na gburugburu ebe obibi PHP enwere njikọ abụọ maka ịrụ ọrụ na sava Tarantool - nke a bụ ndọtị PECL gọọmentị. tarantool/tarantool-php, nke edere na C, na tarantool-php/onye ahịa, dere na PHP. Abụ m onye edemede nke ikpeazụ.

N'isiokwu a, ọ ga-amasị m ịkesa nsonaazụ nke nyocha arụmọrụ nke ụlọ akwụkwọ abụọ ahụ ma gosi otú, na obere mgbanwe na koodu, ị nwere ike nweta mmụba arụmọrụ 3-5 (na nyocha sịntetik!).

Kedu ihe anyị ga-anwale?

Anyị ga-anwale ndị a kpọtụrụ aha n'elu mekọrịta njikọ na-agba ọsọ asynchronously, n'usoro, na asynchronously-ndari. 🙂 Anyị achọghịkwa imetụ koodu nke njikọ aka ha aka. Enwere ọtụtụ ndọtị dị ugbu a iji nweta ihe ịchọrọ:

  • Swoole - Asynchronous framework na-arụ ọrụ dị elu maka PHP. Ndị dike ịntanetị dị ka Alibaba na Baidu na-eji. Kemgbe ụdị 4.1.0, usoro anwansi apụtala SwooleRuntime:: mee kaCoroutine(), nke na-enye gị ohere “ịgbanwe ọba akwụkwọ netwọkụ PHP mekọrịta ka ọ bụrụ nke nwere otu ahịrị koodu.”
  • Async bụ ruo n'oge na-adịbeghị anya ndọtị na-ekwe nkwa maka ọrụ asynchronous na PHP. Gịnị mere ruo n'oge na-adịbeghị anya? N'ụzọ dị mwute, maka ihe kpatara amaghị m, onye edemede ahụ ehichapụrụ ebe nchekwa ahụ na ọdịnihu nke ọrụ ahụ amabeghị. Aga m eji ya otu site ndụdụ. Dịka Swoole, ndọtị a na-enye gị ohere iji mkpịsị aka aka gbanye uwe ogologo ọkpa gị n'ụzọ dị mfe iji mee ka asynchrony nwee ike site na iji ụdị asynchronous ha dochie ọkọlọtọ mmejuputa iwu TCP na iyi TLS. A na-eme nke a site na nhọrọ "async.tcp = 1".
  • Yiri - ndọtị ọhụrụ pụtara nke ọma sitere na Joe Watkins a ma ama, onye dere akwụkwọ ọba akwụkwọ dị ka phpdbg, apcu, pthreads, pcov, uopz. Mgbakwunye ahụ na-enye API maka multithreading na PHP ma debe ya ka ọ bụrụ nnọchi maka pthreads. Mmachi dị ịrịba ama nke ọba akwụkwọ ahụ bụ na ọ na-arụ ọrụ naanị na ụdị ZTS (Zend Thread Safe) nke PHP.

Kedu ka anyị ga-esi nwalee?

Ka anyị bido ihe atụ Tarantool nwere nkwarụ ide ihe n'ihu (wal_mode = onweghị) na ụbara nchekwa netwọkụ (ọgụgụ isi = 1 * 1024 * 1024). Nhọrọ nke mbụ ga-ewepụ ọrụ na diski ahụ, nke abụọ ga-eme ka o kwe omume ịgụkwu arịrịọ sitere na ebe nchekwa sistemụ ma si otú a belata ọnụ ọgụgụ nke oku usoro.

Maka akara akara na-arụ ọrụ na data (ntinye, ihichapụ, ịgụ, wdg), tupu ịmalite akara ngosi, a ga-emepụta oghere memtx, bụ nke onye na-emepụta ụkpụrụ integer nyere iwu na-emepụta ụkpụrụ index bụ isi. (usoro).
Oghere DDL dị ka nke a:

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

Ọ bụrụ na ọ dị mkpa, tupu ịgba ọsọ benchmark, ohere ahụ juputara na 10,000 tuples nke ụdị.

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

A na-enweta tuples site na iji uru igodo enweghị usoro.

Ihe nrịbama n'onwe ya bụ otu arịrịọ maka ihe nkesa ahụ, nke a na-eme ugboro 10,000 (mgbanwe), nke, n'aka nke ya, na-eme ya n'usoro. A na-emegharị ugboro ugboro ruo mgbe ọ bụla ndahie n'etiti 5 n'ime njehie anabatara nke 3%*. Mgbe nke a gasịrị, a na-ewere nkezi nsonaazụ. Enwere nkwụsịtụ 1 nke abụọ n'etiti ntugharị iji gbochie onye nrụpụta ka ọ ghara ịnwụ. Ndị na-anakọta ihe mkpofu Lua nwere nkwarụ tupu a na-amanye ya ibido ma ọ mechaa. A na-ebido usoro PHP naanị site na ndọtị dị mkpa maka benchmark, na-enwe ike imepụta ihe na onye na-ekpofu ihe nwere nkwarụ.

* Enwere ike ịgbanwe ọnụọgụ mgbanwe, ntugharị na ụzọ mperi na ntọala benchmark.

Nyocha gburugburu

Emere nsonaazụ ndị e bipụtara n'okpuru na MacBookPro (2015), sistemụ arụmọrụ - Fedora 30 (ụdị kernel 5.3.8-200.fc30.x86_64). A malitere Tarantool na docker na paramita "--network host".

Ụdị ngwugwu:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, wuo a872fc2f86
PHP: 7.3.11 (cli) (wuru: Ọktoba 22, 2019 08:11:04)
tarantool/onye ahịa: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ patch maka 7.3)*
ext-msgpack: 2.0.3
ext-async: 0.3.0-8c1da46
: 4.4.12
Mkpokọta: 1.1.3

* Ọ dị nwute, njikọ gọọmentị anaghị arụ ọrụ na ụdị PHP> 7.2. Iji chịkọta ma mee ndọtị na PHP 7.3, aghaghị m iji kwachie.

Результаты

Ụdị mmekọrịta

Protocol Tarantool na-eji usoro ọnụọgụ abụọ Mpempe ozi ka serialize ozi. Na njikọ PECL, serialization zoro ezo n'ime omimi nke ọbá akwụkwọ ma na-emetụta usoro ngbanwe site na koodu onye ọrụ. adịghị ka o kwere omume. Njikọ PHP dị ọcha, n'ụzọ megidere nke ahụ, na-enye ikike ịhazi usoro ngbanwe site na ịgbatị ọkọlọtọ ọkọlọtọ ma ọ bụ site na iji mmejuputa nke gị. Enwere koodu ntinye abụọ dị na igbe ahụ, otu dabere na ya msgpack/msgpack-php (mgbatị OziPack PECL ọrụ), nke ọzọ dị rybakit/msgpack (na PHP dị ọcha).

Tupu atụnyere njikọ, anyị ga-atụle arụmọrụ nke MessagePack encoders maka PHP njikọ na n'ihu ule anyị ga-eji nke na-egosi kacha mma n'ihi:

Na-eme ngwa ngwa njikọ PHP maka Tarantool site na iji Async, Swoole na Parallel
Ọ bụ ezie na ụdị PHP (dị ọcha) dị ala na ndọtị PECL na ọsọ, na ezigbo ọrụ m ka ga-akwado iji ya. rybakit/msgpack, n'ihi na na mgbasa ozi MessagePack ndọtị a na-emejuputa nkọwapụta usoro naanị (dịka ọmụmaatụ, enweghị nkwado maka ụdị data omenala, na-enweghị nke ị gaghị enwe ike iji Decimal - ụdị data ọhụrụ ewebatara na Tarantool 2.3) ma nwee a. ọnụ ọgụgụ nke ndị ọzọ nsogbu (gụnyere okwu ndakọrịta na PHP 7.4). Ọfọn, n'ozuzu, ọrụ ahụ na-ele anya gbahapụrụ.

Yabụ, ka anyị tụọ arụmọrụ nke njikọ na ọnọdụ mmekọrịta:

Na-eme ngwa ngwa njikọ PHP maka Tarantool site na iji Async, Swoole na Parallel
Dị ka enwere ike ịhụ na eserese ahụ, njikọ PECL (Tarantool) na-egosi arụmọrụ ka mma ma e jiri ya tụnyere njikọ PHP (Client). Ma nke a abụghị ihe mgbagwoju anya, n'ihi na nke ikpeazụ, na mgbakwunye na imejuputa ya n'asụsụ dị nwayọọ, na-arụ ọrụ ọzọ: a na-emepụta ihe ọhụrụ na oku ọ bụla. arịrịọ и Response (n'ihe banyere Họrọ - nakwa Nhazi, na n'ihe gbasara Mmelite/Nwelite - arụmọrụ), ihe dị iche iche Connection, Ihe ngwugwu и Handler ha na-agbakwụnyekwa n'elu. N'ụzọ doro anya, mgbanwe na-abịa na ọnụ ahịa. Otú ọ dị, n'ozuzu, onye ntụgharị PHP na-egosi arụmọrụ dị mma, ọ bụ ezie na e nwere ọdịiche, ọ bụ ihe na-abaghị uru na, ikekwe, ọ ga-adị ntakịrị mgbe ị na-eji preloading na PHP 7.4, ọ bụghị ikwu banyere JIT na PHP 8.

Ka anyị gaa n'ihu. Tarantool 2.0 gbakwunyere nkwado maka SQL. Ka anyị nwaa ịrụ ọrụ Họrọ, Fanye, melite na Hichapụ site na iji usoro SQL wee tulee nsonaazụ ya na noSQL (ọnụọgụ abụọ) dakọtara:

Na-eme ngwa ngwa njikọ PHP maka Tarantool site na iji Async, Swoole na Parallel
Nsonaazụ SQL adịghị adọrọ mmasị (ka m chetara gị na anyị ka na-anwale ụdị mmekọrịta). Agbanyeghị, agaghị m ewe iwe banyere nke a tupu oge eruo; Nkwado SQL ka na-arụsi ọrụ ike (na nso nso a, dịka ọmụmaatụ, agbakwunyere nkwado. okwu akwadoro) na, na-ekpe ikpe site na ndepụta mbipụta, engine SQL ga-enweta ọtụtụ njikarịcha n'ọdịnihu.

Njikọ

Ọ dị mma, ugbu a ka anyị hụ ka ndọtị Async nwere ike isi nyere anyị aka melite nsonaazụ dị n'elu. Iji dee mmemme asynchronous, ndọtị ahụ na-enye API dabere na coroutines, nke anyị ga-eji. Anyị na-achọpụta n'ụzọ doro anya na ọnụ ọgụgụ kacha mma nke coroutines maka gburugburu anyị bụ 25:

Na-eme ngwa ngwa njikọ PHP maka Tarantool site na iji Async, Swoole na Parallel
“Gbasaa” arụmọrụ 10,000 gafee 25 coroutines wee hụ ihe na-eme:

Na-eme ngwa ngwa njikọ PHP maka Tarantool site na iji Async, Swoole na Parallel
Ọnụ ọgụgụ nke arụmọrụ kwa sekọnd mụbara karịa 3 ugboro maka tarantool-php/onye ahịa!

N'ụzọ dị mwute, njikọ PECL ejighị ext-async malite.

Kedu maka SQL?

Na-eme ngwa ngwa njikọ PHP maka Tarantool site na iji Async, Swoole na Parallel
Dịka ị na-ahụ, na ọnọdụ asynchronous ọdịiche dị n'etiti ọnụọgụ abụọ protocol na SQL ghọrọ n'ime oke njehie.

Swoole

Ọzọ anyị na-achọpụta ọnụ ọgụgụ kacha mma nke coroutines, oge a maka Swoole:
Na-eme ngwa ngwa njikọ PHP maka Tarantool site na iji Async, Swoole na Parallel
Ka anyị kwụsị na 25. Ka anyị kwugharịa otu aghụghọ ahụ dị ka na ndọtị Async - kesaa ọrụ 10,000 n'etiti 25 coroutines. Na mgbakwunye, anyị ga-agbakwunye ule ọzọ nke anyị ga-ekewa ọrụ niile n'ime usoro abụọ 2 (ya bụ, usoro ọ bụla ga-arụ ọrụ 5,000 na 25 coroutines). A ga-emepụta usoro site na iji Usoro Swoole.

Nsonaazụ:

Na-eme ngwa ngwa njikọ PHP maka Tarantool site na iji Async, Swoole na Parallel
Swole na-egosi nsonaazụ dị ntakịrị ma e jiri ya tụnyere Async mgbe ọ na-agba ọsọ n'otu usoro, ma na usoro 2, foto ahụ na-agbanwe nke ọma (ọnụọgụ 2 ahọrọghị ya na mberede; na igwe m, ọ bụ usoro 2 gosipụtara nsonaazụ kacha mma).

Site n'ụzọ, ndọtị Async nwekwara API maka ịrụ ọrụ na usoro, ma n'ebe ahụ, ahụghị m ihe ọ bụla dị iche na-agba ọsọ benchmarks na otu ma ọ bụ karịa usoro (ọ ga-ekwe omume na m mebiri ebe).

SQL vs ọnụọgụ abụọ protocol:

Na-eme ngwa ngwa njikọ PHP maka Tarantool site na iji Async, Swoole na Parallel
Dị ka ọ dị na Async, a na-ewepụ ọdịiche dị n'etiti ọnụọgụ abụọ na ọrụ SQL na ọnọdụ asynchronous.

Yiri

Ebe ọ bụ na ndọtị Parallel abụghị maka coroutines, kama gbasara eri, ka anyị tụle ọnụ ọgụgụ kacha mma nke eri yiri ya:

Na-eme ngwa ngwa njikọ PHP maka Tarantool site na iji Async, Swoole na Parallel
Ọ hà 16 na igwe m. Ka anyị mee njikọ njikọ na eri 16 yiri ya:

Na-eme ngwa ngwa njikọ PHP maka Tarantool site na iji Async, Swoole na Parallel
Dịka ị pụrụ ịhụ, nsonaazụ ya dị mma karịa na ndọtị asynchronous (anaghị agụta Swoole na-agba ọsọ na usoro 2). Rịba ama na maka njikọ PECL, ọrụ Mmelite na Upsert enweghị ihe ọ bụla. Nke a bụ n'ihi na arụmọrụ ndị a dara na njehie - amaghị m ma ọ bụ kpatara ext-parallel, ext-tarantool, ma ọ bụ ha abụọ.

Ugbu a, ka anyị tulee arụmọrụ SQL:

Na-eme ngwa ngwa njikọ PHP maka Tarantool site na iji Async, Swoole na Parallel
Rịba ama myirịta ya na eserese maka njikọ njikọ na-agbakọ ọnụ?

Ọnụ

N'ikpeazụ, ka anyị chịkọta nsonaazụ niile n'otu eserese iji hụ foto n'ozuzu maka ndọtị a nwalere. Ka anyị tinye naanị otu ule ọhụrụ na eserese ahụ, nke anyị emebeghị - ka anyị jiri Parallel * mee Async coroutines n'otu oge. Echiche nke ijikọta ndọtị ndị dị n'elu adịlarị a tụlere Ndị na-ede akwụkwọ, mana enweghị nkwekọrịta ọ bụla, ị ga-eme ya n'onwe gị.

* Ọ gaghị ekwe omume ịmalite Swoole coroutines na Parallel; ọ dị ka ndọtị ndị a ekwekọghị.

Yabụ, nsonaazụ ikpeazụ:

Na-eme ngwa ngwa njikọ PHP maka Tarantool site na iji Async, Swoole na Parallel

Kama nkwubi okwu

N'uche nke m, nsonaazụ ya wee bụrụ ihe kwesịrị ekwesị, na n'ihi ihe ụfọdụ m ji n'aka na nke a abụghị njedebe! Ma ịchọrọ ikpebi nke a na ezigbo ọrụ naanị maka onwe gị, naanị m ga-ekwu na maka m ọ bụ nnwale na-atọ ụtọ nke na-enye gị ohere inyocha ego ole ị nwere ike “ịhapụ” site na njikọ TCP na-emekọrịta ihe na obere mbọ. Ọ bụrụ na ị nwere echiche maka ịkwalite akara ngosi, m ga-enwe obi ụtọ ịtụle arịrịọ ịdọrọ gị. A na-ebipụta koodu niile nwere ntuziaka mmalite na nsonaazụ ya na iche ebe nchekwa.

isi: www.habr.com

Tinye a comment