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!).
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".
* 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:
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:
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):
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:
"Alatsaho" ny hetsika 10,000 manerana ny coroutine 25 ary jereo izay mitranga:
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?
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:
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:
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:
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:
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:
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:
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.