A’ luathachadh luchd-ceangail PHP airson Tarantool a’ cleachdadh Async, Swoole agus Parallel

A’ luathachadh luchd-ceangail PHP airson Tarantool a’ cleachdadh Async, Swoole agus Parallel

Ann an eag-shiostam PHP tha dà cheangal ann an-dràsta airson a bhith ag obair leis an t-seirbheisiche Tarantool - is e seo an leudachadh oifigeil PECL tarantool/tarantool-php, sgrìobhta ann an C, agus tarantool-php/client, sgrìobhte ann am PHP. Is mise ùghdar an tè mu dheireadh.

San artaigil seo, bu mhath leam toraidhean deuchainn coileanaidh an dà leabharlann a cho-roinn agus sealltainn mar as urrainn dhut, le glè bheag de dh’ atharrachaidhean air a ’chòd, àrdachadh coileanaidh 3-5 a choileanadh (air deuchainnean synthetigeach!).

Dè a nì sinn deuchainn?

Nì sinn deuchainn air an fheadhainn a chaidh ainmeachadh gu h-àrd sioncronach luchd-ceangail a 'ruith asyncronach, ann an co-shìnte, agus asyncronously-co-shìnte. 🙂 Chan eil sinn cuideachd airson suathadh ri còd an luchd-ceangail iad fhèin. Tha grunn leudachaidhean rim faighinn an-dràsta gus na tha thu ag iarraidh a choileanadh:

  • Sluagh - frèam asyncronach àrd-choileanadh airson PHP. Air a chleachdadh le fuamhairean eadar-lìn leithid Alibaba agus Baidu. Bho dhreach 4.1.0 tha modh draoidheachd air nochdadh SwooleRuntime :: cuir an comasCoroutine(), a leigeas leat “leabharlannan lìonra PHP sioncronaich a thionndadh gu feadhainn asyncronach le aon loidhne de chòd.”
  • Bha Async gu o chionn ghoirid na leudachadh gealltanach airson obair asyncronach ann am PHP. Carson gus o chionn ghoirid? Gu mì-fhortanach, airson adhbhar nach eil fios agam, chuir an t-ùghdar às an stòr agus chan eil fios dè a thachair don phròiseact san àm ri teachd. Feumaidh mi a chleachdadh le aon bho forcaichean. Coltach ri Swoole, leigidh an leudachadh seo leat do bhriogais a thionndadh air adhart gu furasta le flick den dùirn gus asyncronach a chomasachadh le bhith a’ cur an àite buileachadh àbhaisteach sruthan TCP agus TLS leis na dreachan asyncronach aca. Tha seo air a dhèanamh leis an roghainn “async.tcp = 1".
  • Co-shìnte - leudachadh gu math ùr bhon Joe Watkins ainmeil, ùghdar leabharlannan leithid phpdbg, apcu, pthreads, pcov, uopz. Tha an leudachadh a’ toirt seachad API airson ioma-snàithlean ann am PHP agus tha e air a shuidheachadh an àite pthreads. Is e cuingealachadh mòr air an leabharlann nach obraich e ach leis an tionndadh ZTS (Zend Thread Safe) de PHP.

Ciamar a nì sinn deuchainn?

Nach cuir sinn eisimpleir Tarantool air bhog le logadh sgrìobhadh air adhart ciorramach (wal_mode = gin) agus barrachd bufair lìonraidh (leughaidh = 1 * 1024 * 1024). Bidh a 'chiad roghainn a' cur às do obair leis an diosg, bidh an dàrna roghainn ga dhèanamh comasach barrachd iarrtasan a leughadh bho bhufair an t-siostaim obrachaidh agus mar sin a 'lùghdachadh an àireamh de ghlaisean siostam.

Airson slatan-tomhais a bhios ag obair le dàta (cuir a-steach, cuir às, leughadh, msaa), mus tòisich thu air a’ shlat-tomhais, thèid àite memtx (ath) a chruthachadh, anns am bi na prìomh luachan clàr-amais air an cruthachadh le gineadair de luachan iomlan òrdaichte . (sreath).
Tha an rùm DDL a’ coimhead mar seo:

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

Ma tha feum air, mus ruith thu an slat-tomhais, tha an t-àite air a lìonadh le 10,000 tuples den fhoirm

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

Gheibhear a-steach do thuples le bhith a’ cleachdadh prìomh luach air thuaiream.

Tha an slat-tomhais fhèin na aon iarrtas don fhrithealaiche, a thèid a chuir gu bàs 10,000 uair (ar-a-mach), a tha, an uair sin, air an cur gu bàs ann an ath-aithrisean. Bithear ag ath-aithris gus am bi a h-uile gluasad ùine eadar 5 iterations taobh a-staigh mearachd iomchaidh de 3% *. Às deidh seo, thèid an toradh cuibheasach a ghabhail. Tha stad 1 diog eadar ath-aithrisean gus casg a chuir air a’ phròiseasar bho bhith a’ smeòrach. Tha neach-cruinneachaidh sgudail Lua à comas ro gach tionndadh agus feumaidh e tòiseachadh às deidh dha a bhith deiseil. Tha am pròiseas PHP air a chuir air bhog a-mhàin leis na leudachaidhean a tha riatanach airson a’ shlat-tomhais, le buffering toraidh air a chomasachadh agus an neach-cruinneachaidh sgudail ciorramach.

* Faodar an àireamh de thionndadh, iterations agus stairsneach mearachd atharrachadh anns na roghainnean slat-tomhais.

Àrainneachd deuchainn

Chaidh na toraidhean a chaidh fhoillseachadh gu h-ìosal a dhèanamh air siostam obrachaidh MacBookPro (2015) - Fedora 30 (dreach kernel 5.3.8-200.fc30.x86_64). Chaidh Tarantool a chuir air bhog ann an docker leis a’ pharamadair "--network host".

Tionndaidhean pacaid:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, tog a872fc2f86
PHP: 7.3.11 (cli) (air a thogail: 22 Dàmhair 2019 08:11:04)
tarantool / neach-dèiligidh: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ paiste airson 7.3)*
ext-msgpack: 2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
taobh a-muigh: 1.1.3

* Gu mì-fhortanach, chan eil an ceanglaiche oifigeil ag obair le dreach PHP> 7.2. Gus an leudachadh air PHP 7.3 a chur ri chèile agus a ruith, bha agam ri cleachdadh paiste.

Toraidhean

Modh sioncronaich

Bidh protocol Tarantool a’ cleachdadh cruth binary MessagePack gus teachdaireachdan sreathach. Anns a ’cheangal PECL, tha sreathachadh falaichte gu domhainn ann an doimhneachd an leabharlainn agus a’ toirt buaidh air a ’phròiseas còdaidh bho chòd neach-cleachdaidh chan eil e coltach gu bheil e comasach. Tha ceanglaiche PHP fìor, air an làimh eile, a 'toirt comas dhut am pròiseas còdaidh a ghnàthachadh le bhith a' leudachadh a 'chòdaiche àbhaisteach no le bhith a' cleachdadh do bhuileachadh fhèin. Tha dà encoders rim faighinn a-mach às a’ bhogsa, tha aon stèidhichte air msgpack/msgpack-php (leudachadh oifigeil MessagePack PECL), tha am fear eile air rybakit/msgpack (ann am PHP fìor).

Mus dèan sinn coimeas eadar luchd-ceangail, tomhaisidh sinn coileanadh encoders MessagePack airson an ceanglaiche PHP agus ann an deuchainnean eile cleachdaidh sinn am fear a sheallas an toradh as fheàrr:

A’ luathachadh luchd-ceangail PHP airson Tarantool a’ cleachdadh Async, Swoole agus Parallel
Ged a tha an dreach PHP (Pure) nas ìsle na an leudachadh PECL ann an luaths, ann am pròiseactan fìor bhithinn fhathast a’ moladh a chleachdadh rybakit/msgpack, oir anns an leudachadh oifigeil MessagePack chan eil an sònrachadh cruth air a chuir an gnìomh ach gu ìre (mar eisimpleir, chan eil taic ann airson seòrsachan dàta àbhaisteach, às aonais sin cha bhith e comasach dhut Deicheach a chleachdadh - seòrsa dàta ùr a chaidh a thoirt a-steach ann an Tarantool 2.3) agus tha a àireamh eile duilgheadasan (a’ toirt a-steach cùisean co-chòrdalachd le PHP 7.4). Uill, san fharsaingeachd, tha coltas gu bheil am pròiseact air a thrèigsinn.

Mar sin, dèanamaid tomhas air coileanadh luchd-ceangail ann am modh sioncronaich:

A’ luathachadh luchd-ceangail PHP airson Tarantool a’ cleachdadh Async, Swoole agus Parallel
Mar a chithear bhon ghraf, tha an ceanglaiche PECL (Tarantool) a 'sealltainn coileanadh nas fheàrr an coimeas ris a' cheangail PHP (Client). Ach chan eil seo na iongnadh, leis gu bheil an dàrna fear, a bharrachd air a bhith air a chuir an gnìomh ann an cànan nas slaodaiche, a’ dèanamh barrachd obrach: tha rud ùr air a chruthachadh le gach gairm iarrtas и freagairt (a thaobh Tagh - cuideachd Slatan-tomhais, agus a thaobh Ùrachadh/Upsert ― obrachaidhean), buidhnean fa leth Ceangal, Pacair и Handler bidh iad cuideachd a’ cur os-cionn. Gu follaiseach, thig sùbailteachd aig prìs. Ach, san fharsaingeachd, tha an eadar-theangair PHP a’ nochdadh deagh choileanadh, ged a tha eadar-dhealachadh ann, chan eil e cudromach agus, is dòcha, bidh e eadhon nas lugha nuair a bhios tu a’ cleachdadh ro-luchdachadh ann am PHP 7.4, gun luaidh air JIT ann am PHP 8.

Rachamaid air adhart. Chuir Tarantool 2.0 taic ri SQL. Feuchaidh sinn ri gnìomhan Tagh, Cuir a-steach, Ùrachadh agus Sguab às a’ cleachdadh protocol SQL agus coimeas a dhèanamh eadar na toraidhean leis na co-ionannachdan noSQL (dìneach):

A’ luathachadh luchd-ceangail PHP airson Tarantool a’ cleachdadh Async, Swoole agus Parallel
Chan eil toraidhean SQL glè dhrùidhteach (leig dhomh do chuimhneachadh gu bheil sinn fhathast a’ dèanamh deuchainn air modh sioncronaich). Ach, cha bhithinn troimh-chèile mu dheidhinn seo ro-làimh; Tha taic SQL fhathast ga leasachadh gu gnìomhach (an ìre mhath o chionn ghoirid, mar eisimpleir, chaidh taic a chuir ris aithrisean ullaichte) agus, a’ breithneachadh leis an liosta cùisean, thèid an einnsean SQL tro ghrunn optimizations san àm ri teachd.

Async

Uill, a-nis chì sinn mar as urrainn don leudachadh Async ar cuideachadh gus na toraidhean gu h-àrd a leasachadh. Gus prògraman asyncronach a sgrìobhadh, tha an leudachadh a’ toirt seachad API stèidhichte air coroutines, a chleachdas sinn. Tha sinn a’ faighinn a-mach gu empirigeach gur e 25 an àireamh as fheàrr de coroutines airson na h-àrainneachd againn:

A’ luathachadh luchd-ceangail PHP airson Tarantool a’ cleachdadh Async, Swoole agus Parallel
“Sgaoil” 10,000 gnìomhachd thairis air 25 coroutines agus faic dè thachras:

A’ luathachadh luchd-ceangail PHP airson Tarantool a’ cleachdadh Async, Swoole agus Parallel
Chaidh an àireamh de ghnìomhachdan gach diog suas còrr is 3 tursan airson tarantool-php/client!

Gu mì-fhortanach, cha do thòisich an ceanglaiche PECL le ext-async.

Dè mu dheidhinn SQL?

A’ luathachadh luchd-ceangail PHP airson Tarantool a’ cleachdadh Async, Swoole agus Parallel
Mar a chì thu, ann am modh asyncronach thàinig an eadar-dhealachadh eadar am protocol binary agus SQL taobh a-staigh iomall mearachd.

Sluagh

A-rithist gheibh sinn a-mach an àireamh as fheàrr de coroutines, an turas seo airson Swoole:
A’ luathachadh luchd-ceangail PHP airson Tarantool a’ cleachdadh Async, Swoole agus Parallel
Stadamaid aig 25. Leig leinn an aon chleas a dhèanamh a-rithist agus a tha leis an leudachadh Async - sgaoil 10,000 gnìomhachd eadar 25 coroutines. A bharrachd air an sin, cuiridh sinn deuchainn eile ris anns an roinn sinn an obair gu lèir ann an 2 dà phròiseas (is e sin, nì gach pròiseas 5,000 gnìomhachd ann an 25 coroutines). Thèid pròiseasan a chruthachadh a’ cleachdadh Pròiseas Sluagh.

Toraidhean:

A’ luathachadh luchd-ceangail PHP airson Tarantool a’ cleachdadh Async, Swoole agus Parallel
Tha Swole a’ nochdadh toradh beagan nas ìsle an taca ri Async nuair a thèid a ruith ann an aon phròiseas, ach le pròiseasan 2 bidh an dealbh ag atharrachadh gu mòr (cha deach an àireamh 2 a thaghadh le cothrom; air an inneal agam, b’ e pròiseasan 2 a bh’ ann a sheall an toradh as fheàrr).

Co-dhiù, tha API aig an leudachadh Async cuideachd airson a bhith ag obair le pròiseasan, ach an sin cha do mhothaich mi eadar-dhealachadh sam bith bho bhith a’ ruith slatan-tomhais ann an aon phròiseas no barrachd (tha e comasach gun do rinn mi bùrach an àiteigin).

SQL vs protocol binary:

A’ luathachadh luchd-ceangail PHP airson Tarantool a’ cleachdadh Async, Swoole agus Parallel
Coltach ri Async, tha an eadar-dhealachadh eadar gnìomhachd binary agus SQL air a chuir às ann am modh asyncronach.

Co-shìnte

Leis nach ann mu dheidhinn coroutines a tha an leudachadh Co-shìnte, ach mu dheidhinn snàithleanan, tomhais sinn an àireamh as fheàrr de snàithleanan co-shìnte:

A’ luathachadh luchd-ceangail PHP airson Tarantool a’ cleachdadh Async, Swoole agus Parallel
Tha e 16 air an inneal agam. Feuch an ruith sinn slatan-tomhais ceangail air 16 snàithleanan co-shìnte:

A’ luathachadh luchd-ceangail PHP airson Tarantool a’ cleachdadh Async, Swoole agus Parallel
Mar a chì thu, tha an toradh eadhon nas fheàrr na le leudachadh asyncronach (gun a bhith a ’cunntadh Swoole a’ ruith air 2 phròiseas). Thoir an aire, airson a’ cheangail PECL, gu bheil na h-obraichean Update and Upsert falamh. Tha seo air sgàth gun do dh’ fhàilnich na h-obraichean sin le mearachd - chan eil fhios agam an e coire ext-co-shìnte, ext-tarantool, no an dà chuid a bh’ ann.

A-nis dèanamaid coimeas eadar coileanadh SQL:

A’ luathachadh luchd-ceangail PHP airson Tarantool a’ cleachdadh Async, Swoole agus Parallel
Mothaich gu bheil e coltach ris a’ ghraf airson luchd-ceangail a’ ruith gu sioncronaich?

Còmhla

Agus mu dheireadh, leig dhuinn geàrr-chunntas a dhèanamh air na toraidhean gu lèir ann an aon ghraf gus an dealbh iomlan airson na leudachaidhean deuchainn fhaicinn. Nach cuir sinn dìreach aon deuchainn ùr ris a’ chairt, rud nach do rinn sinn fhathast - ruithidh sinn Async coroutines aig an aon àm a’ cleachdadh Co-shìnte *. Tha am beachd a bhith ag amalachadh na leudachain gu h-àrd mar-thà chaidh a dheasbad ùghdaran, ach cha deach co-aontachd a ruighinn, feumaidh tu fhèin a dhèanamh.

* Cha robh e comasach coroutines Swoole a chuir air bhog le Parallel; tha e coltach gu bheil na leudachain sin neo-fhreagarrach.

Mar sin, na toraidhean deireannach:

A’ luathachadh luchd-ceangail PHP airson Tarantool a’ cleachdadh Async, Swoole agus Parallel

An àite a bhith co-dhùnadh

Nam bheachd-sa, bha na toraidhean gu math airidh air, agus airson adhbhar air choireigin tha mi cinnteach nach e seo an ìre as àirde! Co-dhiù a dh’ fheumas tu seo a cho-dhùnadh ann am fìor phròiseact dhut fhèin a-mhàin, cha bhith mi ag ràdh ach gur e deuchainn inntinneach a bh’ ann dhòmhsa a leigeas leat measadh a dhèanamh air an ìre as urrainn dhut “a bhrùthadh” a-mach à ceanglaiche TCP sioncronaich le glè bheag oidhirp. Ma tha beachdan agad airson slatan-tomhais a leasachadh, bidh mi toilichte beachdachadh air an iarrtas tarraing agad. Tha a h-uile còd le stiùireadh cur air bhog agus toraidhean air fhoillseachadh ann am fear air leth tasgaidh.

Source: www.habr.com

Cuir beachd ann