Kufulumizitsa zolumikizira za PHP za Tarantool pogwiritsa ntchito Async, Swoole ndi Parallel

Kufulumizitsa zolumikizira za PHP za Tarantool pogwiritsa ntchito Async, Swoole ndi Parallel

Mu chilengedwe cha PHP pali zolumikizira ziwiri zogwirira ntchito ndi seva ya Tarantool - uku ndiye kukulitsa kwa PECL. tarantool/tarantool-php, olembedwa mu C, ndi tarantool-php/client, yolembedwa mu PHP. Ndine wolemba zomaliza.

M'nkhaniyi, ndikufuna kugawana zotsatira za kuyesedwa kwa ntchito zamalaibulale onse awiri ndikuwonetsa momwe, ndi kusintha kochepa pa code, mungathe kukwaniritsa kuwonjezeka kwa 3-5 (pa mayeso opangira!).

Tiyesa chiyani?

Tidzayesa zomwe tatchulazi synchronous zolumikizira asynchronously, mu kufanana, ndi asynchronously-kufanana. πŸ™‚ Sitikufunanso kukhudza ma code a zolumikizira okha. Pano pali zowonjezera zingapo zomwe zilipo kuti mukwaniritse zomwe mukufuna:

  • Swoole ― mawonekedwe apamwamba asynchronous a PHP. Amagwiritsidwa ntchito ndi zimphona zapaintaneti monga Alibaba ndi Baidu. Chiyambireni mtundu wa 4.1.0 njira yamatsenga yawonekera SwooleRuntime ::enableCoroutine(), zomwe zimakupatsani mwayi "kusintha malaibulale amtundu wa PHP kukhala osasinthika okhala ndi mzere umodzi wamakhodi."
  • Async inali mpaka posachedwa kukulitsa kolimbikitsa kwa ntchito ya asynchronous mu PHP. Chifukwa chiyani mpaka posachedwa? Tsoka ilo, pazifukwa zosadziwika kwa ine, wolemba adachotsa zosungirako ndipo tsogolo la polojekitiyo silikudziwika bwino. Ndiyenera kugwiritsa ntchito m'modzi kuchokera kumafoloko. Monga Swoole, kukulitsa uku kumakupatsani mwayi woyatsa mathalauza anu mosavuta ndikugwedezeka kwa dzanja kuti mutsegule ma asynchrony posintha kukhazikitsa kwa TCP ndi mitsinje ya TLS ndi mitundu yawo yosasinthika. Izi zimachitika pogwiritsa ntchito njira "async.tcp = 1".
  • Zofanana ― kuwonjezera kwatsopano kuchokera kwa Joe Watkins wodziwika bwino, wolemba malaibulale monga phpdbg, apcu, pthreads, pcov, uopz. Kukulaku kumapereka API yowerengera zambiri mu PHP ndipo imayikidwa m'malo mwa pthreads. Cholepheretsa chachikulu chalaibulale ndikuti imangogwira ntchito ndi mtundu wa ZTS (Zend Thread Safe) wa PHP.

Tiyesa bwanji?

Tiyeni tiyambitse chitsanzo cha Tarantool choletsa kudula mitengo (kutsogolo)wal_mode = palibe) ndikuwonjezera buffer ya netiweki (werengani patsogolo = 1 * 1024 * 1024). Njira yoyamba idzachotsa ntchito ndi diski, yachiwiri imapangitsa kuti muzitha kuwerenga zopempha zambiri kuchokera ku buffer ya opareshoni ndipo potero muchepetse chiwerengero cha mafoni.

Pazizindikiro zomwe zimagwira ntchito ndi data (kuyika, kufufuta, kuwerenga, ndi zina), musanayambe benchmark, malo a memtx adzapangidwa (re) kupangidwanso, momwe ma index oyambira amapangidwa ndi jenereta wamitengo yoyitanidwa. (kutsatizana).
Danga la DDL likuwoneka motere:

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

Ngati kuli kofunikira, musanagwiritse ntchito benchmark, malowa amadzazidwa ndi zilembo 10,000 za fomuyo.

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

Ma tuples amapezeka pogwiritsa ntchito mtengo wachinsinsi.

Benchmark palokha ndi pempho limodzi kwa seva, lomwe limachitidwa nthawi za 10,000 (zosintha), zomwe, zimachitidwa mobwerezabwereza. Kubwereza kumabwerezedwa mpaka nthawi zonse zopatuka pakati pa kubwereza kwa 5 zili mkati mwa cholakwika chovomerezeka cha 3% *. Pambuyo pa izi, zotsatira zapakati zimatengedwa. Pali kupuma kwachiwiri kwa 1 pakati pa kubwereza kuti purosesa isagwedezeke. Wotolera zinyalala wa Lua amakhala wolemala asanabwerezenso ndipo amakakamizika kuyamba akamaliza. Ndondomeko ya PHP imayambitsidwa kokha ndi zowonjezera zofunika pa benchmark, ndikutulutsa kotulutsa kumathandizidwa ndipo wotolera zinyalala wolemala.

* Chiwerengero cha zosinthika, zobwerezabwereza ndi zolakwika zitha kusinthidwa pazosintha za benchmark.

Malo oyesera

Zotsatira zosindikizidwa pansipa zidapangidwa pa MacBookPro (2015), makina opangira - Fedora 30 (kernel version 5.3.8-200.fc30.x86_64). Tarantool idakhazikitsidwa mu docker yokhala ndi parameter "--network host".

Zomasulira phukusi:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, pangani a872fc2f86
PHP: 7.3.11 (cli) (yomangidwa: Oct 22 2019 08:11:04)
tarantool / kasitomala: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ chigamba cha 7.3)*
ext-msgpack: 2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
zofananira: 1.1.3

* Tsoka ilo, cholumikizira chovomerezeka sichigwira ntchito ndi mtundu wa PHP> 7.2. Kuti ndiphatikize ndikuwonjezera kukulitsa pa PHP 7.3, ndimayenera kugwiritsa ntchito chigamba.

Zotsatira

Synchronous mode

Protocol ya Tarantool imagwiritsa ntchito mawonekedwe a binary MessagePack kusanja mauthenga. Mu cholumikizira cha PECL, kusanja kumabisika mozama mulaibulale ndipo kumakhudza njira yolembera kuchokera ku code ya userland. sizikuwoneka zotheka. Cholumikizira choyera cha PHP, m'malo mwake, chimakupatsani mwayi wosinthira makonda anu pokulitsa encoder yokhazikika kapena kugwiritsa ntchito kwanu. Pali ma encoder awiri omwe akupezeka m'bokosilo, imodzi idakhazikitsidwa msgpack/msgpack-php (chiwongolero cha MessagePack PECL), chinacho chili rybakit/msgpack (mu PHP yoyera).

Tisanafanizire zolumikizira, tiyesa momwe ma encoder a MessagePack a cholumikizira cha PHP ndipo pamayesero ena tidzagwiritsa ntchito yomwe ikuwonetsa zotsatira zabwino kwambiri:

Kufulumizitsa zolumikizira za PHP za Tarantool pogwiritsa ntchito Async, Swoole ndi Parallel
Ngakhale mtundu wa PHP (Pure) ndi wocheperako pakuwonjeza kwa PECL mu liwiro, muma projekiti enieni ndingalimbikitsebe kugwiritsa ntchito. rybakit/msgpack, chifukwa mu MessagePack yowonjezera yovomerezeka mawonekedwe amtundu amangogwiritsidwa ntchito pang'ono (mwachitsanzo, palibe chithandizo cha mitundu ya deta, popanda zomwe simungathe kugwiritsa ntchito Decimal - mtundu watsopano wa deta womwe unayambitsidwa mu Tarantool 2.3) ndipo uli ndi chiwerengero cha ena mavuto (kuphatikiza zovuta zofananira ndi PHP 7.4). Chabwino, kawirikawiri, polojekitiyi ikuwoneka yosiyidwa.

Chifukwa chake, tiyeni tiwone momwe zolumikizira zimagwirira ntchito:

Kufulumizitsa zolumikizira za PHP za Tarantool pogwiritsa ntchito Async, Swoole ndi Parallel
Monga momwe tawonera pa graph, cholumikizira cha PECL (Tarantool) chikuwonetsa magwiridwe antchito bwino poyerekeza ndi cholumikizira cha PHP (Client). Koma izi sizosadabwitsa, chifukwa chomalizachi, kuwonjezera pa kukhazikitsidwa pang'onopang'ono, chimagwira ntchito yochulukirapo: chinthu chatsopano chimapangidwa ndi kuyitana kulikonse. pempho ΠΈ Poyankha (pankhani ya Select - also Zotsatira, komanso pankhani ya Update/Upsert ― ntchito), magulu osiyana Kulumikizana, Chonyamula ΠΈ Gwiritsani ntchito nawonso amawonjezera shuga. Mwachiwonekere, kusinthasintha kumabwera pamtengo. Komabe, kawirikawiri, womasulira wa PHP akuwonetsa ntchito yabwino, ngakhale pali kusiyana, ndizochepa ndipo, mwinamwake, zidzakhala zochepa kwambiri pogwiritsira ntchito preloading mu PHP 7.4, osatchula JIT mu PHP 8.

Tiyeni tipitirire. Tarantool 2.0 idawonjezera chithandizo cha SQL. Tiyeni tiyese kuchita Select, Insert, Update and Delete operations pogwiritsa ntchito SQL protocol ndikuyerekeza zotsatira ndi zofanana za noSQL (binary):

Kufulumizitsa zolumikizira za PHP za Tarantool pogwiritsa ntchito Async, Swoole ndi Parallel
Zotsatira za SQL sizosangalatsa kwambiri (ndiroleni ndikukumbutseni kuti tikuyesa njira yofananira). Komabe, sindingakhumudwe nazo izi pasadakhale; Thandizo la SQL likadali pakukula kwachangu (posachedwa, mwachitsanzo, thandizo linawonjezeredwa. mawu okonzekera) ndi, kuweruza ndi mndandanda nkhani, injini ya SQL idzakonzedwanso zingapo mtsogolomo.

async

Chabwino, tsopano tiyeni tiwone momwe kuwonjezera kwa Async kungatithandizire kukonza zotsatira pamwambapa. Kulemba mapulogalamu asynchronous, kufalikira kumapereka API yochokera ku coroutines, yomwe tidzagwiritsa ntchito. Tikuwona motsimikiza kuti kuchuluka kwa ma coroutines achilengedwe ndi 25:

Kufulumizitsa zolumikizira za PHP za Tarantool pogwiritsa ntchito Async, Swoole ndi Parallel
"Falitsa" ntchito 10,000 kudutsa ma coroutines 25 ndikuwona zomwe zimachitika:

Kufulumizitsa zolumikizira za PHP za Tarantool pogwiritsa ntchito Async, Swoole ndi Parallel
Chiwerengero cha ntchito pa sekondi chinawonjezeka ndi nthawi 3 kwa tarantool-php/client!

Zachisoni, cholumikizira cha PECL sichinayambe ndi ext-async.

Nanga bwanji SQL?

Kufulumizitsa zolumikizira za PHP za Tarantool pogwiritsa ntchito Async, Swoole ndi Parallel
Monga mukuwonera, mumayendedwe asynchronous kusiyana pakati pa binary protocol ndi SQL kudakhala m'mphepete mwa zolakwika.

Swoole

Apanso tikupeza kuchuluka koyenera kwa ma coroutines, nthawi ino a Swoole:
Kufulumizitsa zolumikizira za PHP za Tarantool pogwiritsa ntchito Async, Swoole ndi Parallel
Tiyeni tiyime pa 25. Tiyeni tibwereze chinyengo chofanana ndi chowonjezera cha Async - kugawa ntchito 10,000 pakati pa 25 coroutines. Kuphatikiza apo, tiwonjezeranso mayeso ena omwe tidzagawanitsa ntchito yonse munjira ziwiri (ndiko kuti, njira iliyonse idzachita ma 2 mu ma coroutines 5,000). Njira zitha kupangidwa pogwiritsa ntchito SwooleProcess.

Zotsatira:

Kufulumizitsa zolumikizira za PHP za Tarantool pogwiritsa ntchito Async, Swoole ndi Parallel
Swole ikuwonetsa zotsatira zotsika pang'ono poyerekeza ndi Async ikayendetsedwa munjira imodzi, koma ndi njira za 2 chithunzicho chimasintha kwambiri (chiwerengero cha 2 sichinasankhidwe mwangozi; pamakina anga, zinali njira za 2 zomwe zidawonetsa zotsatira zabwino).

Mwa njira, kukulitsa kwa Async kulinso ndi API yogwira ntchito ndi njira, koma pamenepo sindinazindikire kusiyana kulikonse pakuyendetsa ma benchmark munjira imodzi kapena zingapo (ndizotheka kuti ndidasokoneza kwinakwake).

SQL vs binary protocol:

Kufulumizitsa zolumikizira za PHP za Tarantool pogwiritsa ntchito Async, Swoole ndi Parallel
Monga ndi Async, kusiyana pakati pa binary ndi SQL ntchito kumachotsedwa mumayendedwe asynchronous.

Zofanana

Popeza kufalikira kwa Parallel sikukukhudza ma coroutines, koma za ulusi, tiyeni tiyese kuchuluka kwa ulusi wofananira:

Kufulumizitsa zolumikizira za PHP za Tarantool pogwiritsa ntchito Async, Swoole ndi Parallel
Ndilofanana ndi 16 pamakina anga. Tiyeni tiyendetse ma benchmark olumikizira pa ulusi 16 wofanana:

Kufulumizitsa zolumikizira za PHP za Tarantool pogwiritsa ntchito Async, Swoole ndi Parallel
Monga mukuwonera, zotsatira zake ndizabwinoko kuposa zowonjezera zowonjezera (osawerengera Swoole ikuyenda panjira ziwiri). Dziwani kuti cholumikizira cha PECL, Ntchito Zosintha ndi Upsert zilibe kanthu. Izi ndichifukwa choti machitidwewa adalephera ndi cholakwika - sindikudziwa ngati linali vuto la ext-parallel, ext-tarantool, kapena zonse ziwiri.

Tsopano tiyeni tifanizire magwiridwe antchito a SQL:

Kufulumizitsa zolumikizira za PHP za Tarantool pogwiritsa ntchito Async, Swoole ndi Parallel
Mukuwona kufanana ndi graph ya zolumikizira zomwe zikuyenda molumikizana?

Pamodzi

Ndipo potsiriza, tiyeni tifotokoze mwachidule zotsatira zonse mu graph imodzi kuti tiwone chithunzi chonse cha zowonjezera zoyesedwa. Tiyeni tiwonjeze kuyesa kwatsopano ku tchati, komwe sitinachitebe - tiyeni tiyendetse ma Async coroutines mofananira pogwiritsa ntchito Parallel*. Lingaliro la kuphatikiza zowonjezera pamwambapa lili kale zinakambidwa olemba, koma palibe mgwirizano womwe unafikiridwa, muyenera kuchita nokha.

* Sizinali zotheka kukhazikitsa ma Swoole coroutines ndi Parallel; zikuwoneka kuti zowonjezerazi sizigwirizana.

Choncho, zotsatira zomaliza:

Kufulumizitsa zolumikizira za PHP za Tarantool pogwiritsa ntchito Async, Swoole ndi Parallel

M'malo mapeto

M'malingaliro anga, zotsatira zake zidakhala zoyenerera, ndipo pazifukwa zina ndikutsimikiza kuti izi si malire! Kaya mukufunika kusankha izi mu polojekiti yeniyeni nokha, ndingonena kuti kwa ine kunali kuyesa kosangalatsa komwe kumakupatsani mwayi woyesa "kufinya" kuchokera ku cholumikizira cha TCP cholumikizira mosavutikira. Ngati muli ndi malingaliro okweza ma benchmarks, ndikhala wokondwa kulingalira zomwe mukufuna kukoka. Ma code onse okhala ndi malangizo oyambitsa ndi zotsatira amasindikizidwa mosiyana nkhokwe.

Source: www.habr.com

Kuwonjezera ndemanga