Manafaingana ny mpampitohy PHP ho an'ny Tarantool mampiasa Async, Swoole ary Parallel

Manafaingana ny mpampitohy PHP ho an'ny Tarantool mampiasa Async, Swoole ary Parallel

Ao amin'ny ecosystem PHP dia misy mpampitohy roa amin'izao fotoana izao hiara-miasa amin'ny mpizara Tarantool - ity no fanitarana PECL ofisialy tarantool/tarantool-php, voasoratra amin'ny C, ary tarantool-php/client, voasoratra amin'ny PHP. Izaho no mpanoratra ity farany.

Amin'ity lahatsoratra ity dia tiako ny hizara ny valin'ny fitsapana ny fahombiazan'ny tranomboky roa ary hampiseho ny fomba, miaraka amin'ny fiovana kely amin'ny code, azonao atao ny mampitombo ny fampisehoana 3-5 (amin'ny test synthetic!).

Inona no hozahantsika?

Hitsapa ireo voalaza etsy ambony ireo isika synchronous connectors mandeha asynchronously, parallèle, ary asynchronously-parallel. 🙂 Tsy te hikasika ny kaodin'ny mpampitohy ihany koa izahay. Misy fanitarana maromaro azo alaina amin'izao fotoana izao mba hahatratrarana izay tadiavinao:

  • Swoole - rafitra asynchronous mahomby ho an'ny PHP. Ampiasain'ireo goavambe amin'ny Internet toa an'i Alibaba sy Baidu. Hatramin'ny version 4.1.0 dia nisy fomba mahagaga niseho SwooleRuntime::enableCoroutine(), izay mamela anao "hanova ny tranokalan'ny tambajotra PHP synchronous ho asynchronous miaraka amin'ny kaody iray."
  • Async dia fanitarana tena nampanantenaina ho an'ny asa asynchronous amin'ny PHP. Nahoana no vao haingana? Indrisy anefa, noho ny antony tsy fantatro, nofafan'ny mpanoratra ny tahiry ary tsy fantatra mazava ny hoavin'ilay tetikasa. Tsy maintsy mampiasa azy aho ny avy amin'ny forks. Tahaka an'i Swoole, ity fanitarana ity dia ahafahanao mamadika mora foana ny patalohanao amin'ny alàlan'ny fikitihana ny hatotanana mba hahafahan'ny asynchrony amin'ny fanoloana ny fampiharana mahazatra ny TCP sy TLS stream amin'ny dikan-teny asynchronous. Izany dia atao amin'ny alalan'ny safidy "async.tcp = 1".
  • mitovy - fanitarana vao haingana avy amin'i Joe Watkins fanta-daza, mpanoratra ny tranomboky toy ny phpdbg, apcu, pthreads, pcov, uopz. Ny fanitarana dia manome API ho an'ny multithreading amin'ny PHP ary napetraka ho solon'ny pthreads. Ny fetra lehibe amin'ny tranomboky dia ny hoe tsy miasa afa-tsy amin'ny PHP version ZTS (Zend Thread Safe) an'ny PHP.

Ahoana no hitsapantsika?

Andao hanomboka ohatra Tarantool miaraka amin'ny fanoratana-ahead logging kilemaina (wal_mode = tsy misy) ary nitombo ny buffer tambajotra (vakiana = 1 * 1024 * 1024). Ny safidy voalohany dia hanafoana ny asa miaraka amin'ny kapila, ny faharoa dia ahafahana mamaky fangatahana bebe kokoa avy amin'ny buffer rafitra miasa ary noho izany dia manamaivana ny isan'ny antso an-tariby.

Ho an'ny mari-pamantarana izay miasa miaraka amin'ny angon-drakitra (fampidirana, famafana, famakiana, sns.), Alohan'ny hanombohana ny mari-pamantarana, dia hisy habaka memtx (re) hamboarina, izay namoronan'ny mpamorona ny soatoavina integer voafaritry ny soatoavina fototra voalohany. (sequence).
Ny habaka DDL dia toy izao:

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

Raha ilaina, alohan'ny hampandehanana ny mari-pamantarana, ny habaka dia feno 10,000 tuple amin'ny endrika.

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

Ny Tuples dia miditra amin'ny fampiasana sanda fanalahidy kisendrasendra.

Ny benchmark mihitsy dia fangatahana tokana ho an'ny mpizara, izay tanterahina in-10,000 (revolisiona), izay, ho setrin'izany, dia tanterahina amin'ny iterations. Averina ny famerimberenana mandra-pahatongan'ny fivilian-potoana rehetra eo anelanelan'ny famerimberenana 5 ao anatin'ny fahadisoana azo ekena 3%*. Aorian'izany dia alaina ny vokatra antonony. Misy fiatoana 1 segondra eo anelanelan'ny famerimberenana mba hisakanana ny processeur amin'ny throttling. Ny mpanangom-pako an'i Lua dia kilemaina alohan'ny fandefasana tsirairay ary voatery manomboka rehefa vita izany. Ny fizotry ny PHP dia atomboka miaraka amin'ny fanitarana ilaina ho an'ny mari-pamantarana, miaraka amin'ny famoahana buffering azo atao ary ny mpanangona fako dia kilemaina.

* Ny isan'ny revolisiona, ny famerimberenana ary ny tokonam-baravaran'ny fahadisoana dia azo ovaina amin'ny toe-javatra benchmark.

Tontolo fitsapana

Ny valiny navoaka eto ambany dia natao tamin'ny MacBookPro (2015), rafitra fiasa - Fedora 30 (kernel version 5.3.8-200.fc30.x86_64). Tarantool dia natomboka tao amin'ny docker miaraka amin'ny parameter "--network host".

Dikan'ny fonosana:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, manangana a872fc2f86
PHP: 7.3.11 (cli) (naorina: Oct 22 2019 08:11:04)
tarantool / mpanjifa: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ patch ho an'ny 7.3)*
ext-msgpack: 2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
ext-parallèle: 1.1.3

* Mampalahelo fa tsy mandeha amin'ny PHP version> 7.2 ny mpampitohy ofisialy. Mba hanangonana sy hampandehanana ny fanitarana amin'ny PHP 7.3 dia tsy maintsy nampiasa aho damba.

vokatra

Fomba synchronous

Ny protocol Tarantool dia mampiasa endrika binary MessagePack mba hanao serialize hafatra. Ao amin'ny mpampitohy PECL, ny serialization dia miafina lalina ao amin'ny halalin'ny trano famakiam-boky ary misy fiantraikany amin'ny fizotry ny fanodinana avy amin'ny kaody userland. toa tsy azo atao. Ny mpampitohy PHP madio, mifanohitra amin'izany, dia manome ny fahafahana mampifanaraka ny fizotry ny fanodinana amin'ny alàlan'ny fanitarana ny encoder mahazatra na amin'ny fampiasana ny fampiharana anao manokana. Misy encoders roa azo alaina ivelan'ny boaty, mifototra amin'ny iray msgpack/msgpack-php (fanitarana ofisialy MessagePack PECL), mandeha ny iray hafa rybakit/msgpack (amin'ny PHP madio).

Alohan'ny fampitahana ny mpampitohy dia handrefesana ny fahombiazan'ny encoders MessagePack ho an'ny mpampitohy PHP ary amin'ny fitsapana fanampiny dia hampiasa ilay mampiseho vokatra tsara indrindra izahay:

Manafaingana ny mpampitohy PHP ho an'ny Tarantool mampiasa Async, Swoole ary Parallel
Na dia ambany noho ny fanitarana PECL aza ny dikan-teny PHP (Madio), amin'ny tetikasa tena izy dia mbola manoro hevitra ny hampiasa azy aho. rybakit/msgpack, satria ao amin'ny fanitarana ofisialy MessagePack dia ampiharina amin'ny ampahany ihany ny famaritana ny format (ohatra, tsy misy fanohanana ireo karazana angon-drakitra manokana, raha tsy misy izany dia tsy afaka mampiasa Decimal ianao - karazana data vaovao nampidirina tao amin'ny Tarantool 2.3) ary manana isan'ny hafa OLANA (ao anatin'izany ny olana mifanaraka amin'ny PHP 7.4). Eny ary, amin'ny ankapobeny, ny tetikasa dia toa nilaozana.

Noho izany, andeha horefesina ny fahombiazan'ny connectors amin'ny fomba synchronous:

Manafaingana ny mpampitohy PHP ho an'ny Tarantool mampiasa Async, Swoole ary Parallel
Araka ny hita amin'ny grafika, ny mpampitohy PECL (Tarantool) dia mampiseho fampisehoana tsara kokoa raha oharina amin'ny mpampitohy PHP (Client). Saingy tsy mahagaga izany, satria ity farany ity, ankoatra ny fampiharana amin'ny fiteny miadana kokoa, dia manao asa bebe kokoa: misy zavatra vaovao noforonina isaky ny antso. Request и Response (raha ny Select - koa mason-tsivana, ary raha ny Update/Upsert ― asa), sampana misaraka Connection, packers и Handler izy ireo koa manampy ny overhead. Mazava ho azy fa misy vidiny ny flexibility. Na izany aza, amin'ny ankapobeny, ny mpandika teny PHP dia mampiseho fampisehoana tsara, na dia misy aza ny fahasamihafana, dia tsy misy dikany izany ary, angamba, dia ho kely kokoa rehefa mampiasa ny preloading amin'ny PHP 7.4, tsy lazaina intsony ny JIT amin'ny PHP 8.

Andao handroso. Tarantool 2.0 dia nampiditra fanohanana SQL. Andao hiezaka ny hanao Select, Insert, Update ary Delete amin'ny alàlan'ny protocol SQL ary ampitahao ny valiny amin'ny mitovy amin'ny noSQL (binary):

Manafaingana ny mpampitohy PHP ho an'ny Tarantool mampiasa Async, Swoole ary Parallel
Ny valin'ny SQL dia tsy dia mahavariana loatra (mamelà ahy hampahatsiahy anao fa mbola manandrana ny fomba synchronous izahay). Na izany aza, tsy ho tezitra amin'izany aho alohan'ny fotoana; Ny fanohanana SQL dia mbola eo amin'ny fampandrosoana mavitrika (vao haingana, ohatra, ny fanohanana dia nampiana fanambarana voaomana) ary, raha tsaraina amin'ny lisitra olana, ny motera SQL dia handalo fanatsarana maromaro amin'ny ho avy.

async

Eny ary, andeha hojerentsika ny fomba ahafahan'ny fanitarana Async manampy antsika hanatsara ny valiny etsy ambony. Mba hanoratana programa tsy mifanaraka, ny fanitarana dia manome API mifototra amin'ny coroutines, izay hampiasainay. Hitantsika amin'ny fomba fijery fa ny isan'ny coroutine tsara indrindra ho an'ny tontolo iainantsika dia 25:

Manafaingana ny mpampitohy PHP ho an'ny Tarantool mampiasa Async, Swoole ary Parallel
"Alatsaho" ny hetsika 10,000 manerana ny coroutine 25 ary jereo izay mitranga:

Manafaingana ny mpampitohy PHP ho an'ny Tarantool mampiasa Async, Swoole ary Parallel
Nitombo in-3 mahery ny isan'ny asa isan-tsegondra ho an'ny tarantool-php/client!

Mampalahelo fa tsy nanomboka tamin'ny ext-async ny mpampitohy PECL.

Ahoana ny amin'ny SQL?

Manafaingana ny mpampitohy PHP ho an'ny Tarantool mampiasa Async, Swoole ary Parallel
Araka ny hitanao, amin'ny fomba asynchronous ny fahasamihafana misy eo amin'ny protocol binary sy SQL dia nanjary tao anatin'ny sisin'ny fahadisoana.

Swoole

Hitantsika indray ny isan'ny coroutine tsara indrindra, amin'ity indray mitoraka ity ho an'i Swoole:
Manafaingana ny mpampitohy PHP ho an'ny Tarantool mampiasa Async, Swoole ary Parallel
Andao ajanona amin'ny 25. Aleo avereno ilay fika mitovy amin'ny amin'ny fanitarana Async - mizara hetsika 10,000 eo anelanelan'ny coroutine 25. Ho fanampin'izany dia hanampy fitsapana hafa izay hizarantsika ny asa rehetra ho dingana roa roa (izany hoe, ny dingana tsirairay dia hanao hetsika 2 amin'ny coroutines 5,000). Ny dingana dia hoforonina amin'ny fampiasana SwooleProcess.

valiny:

Manafaingana ny mpampitohy PHP ho an'ny Tarantool mampiasa Async, Swoole ary Parallel
Swole dia mampiseho vokatra ambany kely raha oharina amin'ny Async rehefa mandeha amin'ny dingana iray, fa miaraka amin'ny dingana 2 dia miova be ny sary (ny isa 2 dia tsy voafidy ho azy; amin'ny masiniko, dia dingana 2 no nampiseho ny vokatra tsara indrindra).

Raha ny tokony ho izy, ny fanitarana Async dia manana API ho an'ny fiasana amin'ny fizotrany, saingy tao aho dia tsy nahatsikaritra ny fahasamihafana amin'ny fampandehanana benchmarks amin'ny dingana iray na maromaro (mety ho nikorontana tany ho any aho).

SQL vs protocol binary:

Manafaingana ny mpampitohy PHP ho an'ny Tarantool mampiasa Async, Swoole ary Parallel
Tahaka ny amin'ny Async, ny tsy fitovian'ny asa binary sy SQL dia esorina amin'ny fomba asynchronous.

mitovy

Satria ny fanitarana Parallel dia tsy momba ny coroutines, fa momba ny kofehy, andao handrefesana ny isa tsara indrindra amin'ny kofehy mifanandrify:

Manafaingana ny mpampitohy PHP ho an'ny Tarantool mampiasa Async, Swoole ary Parallel
Mitovy amin'ny 16 amin'ny masiniko izany. Andeha hojerentsika ny mari-pamantarana mpampitohy amin'ny kofehy 16 mifanitsy:

Manafaingana ny mpampitohy PHP ho an'ny Tarantool mampiasa Async, Swoole ary Parallel
Araka ny hitanao dia tsara kokoa ny vokatra raha oharina amin'ny fanitarana asynchronous (tsy manisa an'i Swoole mandeha amin'ny dingana 2). Mariho fa ho an'ny mpampitohy PECL, ny hetsika Update sy Upsert dia foana. Izany dia noho ny tsy fahombiazan'ireo hetsika ireo - tsy fantatro raha ny hadisoan'ny ext-parallel, ext-tarantool, na izy roa.

Andeha isika hampitaha ny fahombiazan'ny SQL:

Manafaingana ny mpampitohy PHP ho an'ny Tarantool mampiasa Async, Swoole ary Parallel
Mariho ny fitoviana amin'ny tabilao ho an'ny mpampitohy mandeha synchronous?

miara-

Ary farany, andao hamintina ny valiny rehetra amin'ny grafika iray hahitana ny sary ankapobeny ho an'ireo fanitarana voasedra. Andeha isika hanampy fitsapana vaovao iray monja amin'ny tabilao, izay mbola tsy vitantsika - andao hampandeha ny coroutine Async mifanitsy amin'ny fampiasana Parallel*. Ny hevitra hampidirana ireo fanitarana etsy ambony dia efa noresahina mpanoratra, fa tsy nisy marimaritra iraisana, ianao no tsy maintsy manao izany.

* Tsy azo natao ny nanangana coroutine Swoole miaraka amin'ny Parallel; toa tsy mifanaraka ireo fanitarana ireo.

Noho izany, ny vokatra farany:

Manafaingana ny mpampitohy PHP ho an'ny Tarantool mampiasa Async, Swoole ary Parallel

Raha tokony ny famaranana

Raha ny hevitro dia tena mendrika ny vokatra, ary noho ny antony sasany dia azoko antoka fa tsy izany no fetra! Na mila manapa-kevitra ho an'ny tenanao irery ianao amin'ny tetikasa tena izy, dia holazaiko fotsiny fa ho ahy dia fanandramana mahaliana izay ahafahanao manombatombana hoe ohatrinona no azonao atao ny "manery" amin'ny mpampitohy TCP synchronous miaraka amin'ny ezaka kely. Raha manana hevitra hanatsarana ny mari-pamantarana ianao, dia ho faly aho handinika ny fangatahanao. Ny kaody rehetra miaraka amin'ny toromarika momba ny fandefasana sy ny valiny dia avoaka amin'ny fizarana iray repository.

Source: www.habr.com

Add a comment