á PHP áĽá-áá
áłá ááľáĽ á á áá áá ᨠTarantool á áááá áá áááľáŤáľ áááľ áááááá˝ á á - áá
áŚáá´ááá ᨠPECL á
áĽáŤ ááá˘
á áá
á˝áá ááľáĽ á¨áááąá á¤á°-ááťáááľ á¨á áááá áá¨áŤ áá¤áśá˝á ááŤáá áĽá á áŽáą áá á ááľá°á áááŚá˝ á˛á°á¨á á¨3-5 á¨á áááá áá᪠áĽáá´áľ ááááľ áĽáá°áá˝á ááłá¨áľ áĽááááá (á á°á á áŤá˝ áá¨áŤáá˝ áá!).
áá áĽááááŤáá?
á¨áá á¨á°á ááąáľá áĽáááľáťáá á¨á°ááłá°á áłáááłá°áᣠá áľáአáĽá á ááááłá°á-áľáአá¨áá°áŠ áááááá˝á˘ đ á á°á¨ááŞá á¨áááááášá áŽáľ áĽáŤáłá¸á áááŤáľ á áááááᢠá¨áááááľá áááááľ á á áá áá á ááŤáł á áĽáŤáá˝ á ááĄ-
áľáá - áPHP á¨áá°á á ááťá¸á áŤáá°ááłá°á ááááᢠáĽáá° á ááŁáŁ áĽá áŁááą áŁá á¨á˘áá°áááľ ááá áŠáŁááŤáá˝ áĽá á áá ááááᢠá¨áľáŞáľ 4.1.0 ááᎠá áľááłá áá´ áłááˇá SwooleRuntime::Coroutine() á ááâá¨á°ááłá°á á¨PHP á ááłá¨ áá¨áĽ á¤á°-ááťáááľá áá° á áá°ááłá°á á ááľ á¨áŽáľ ááľáá áĽáá˛ááአáŤáľá˝áááłáá˘- Async áĽáľá¨ á
áἠáá áľá¨áľ á PHP ááľáĽ áá°ááłá°á áĽáŤ á áŁá á°áľá á°áŞ á
áĽáŤ áá áᢠááá áĽáľá¨ á
áἠáá áľá¨áľ? áĽáá° á áááłá°á áá áĽá á ááááá ááááŤáľ á°áŤá˛á áá¨ááťáá á°áááá áĽá á¨ááŽáááą á¨áá°ááľ áĽáŁ áááł ááá
á áá°áá ᢠáá áá á ááĽá
á ááľ á¨ášáŤáá˝. áá áĽáá° áľááᣠáá á áĽáŤ áá°á ááá á¨TCP áĽá TLS áĽá¨áśá˝á áŁáá°ááłá°á áľáŞáśá˝ á áá°áŤáľ á°ááłáłáááľ áááááľ áąáŞáá á áĽá á áá á ááá áĽáá˛áŤá አáŤáľá˝áááłáᢠáá á¨áá°á¨áá á áááŤá áá "async.tcp = 1". á°ááłáłá - á¨áłááá á ááľáŞááľ á¨á°áá á á˛áľ á áĽáŤáŁ áĽáá° phpdbgᣠapcuᣠpthreadsᣠpcovᣠuopz áŤá á¤á°-ááťáááľ á°áŤá˛á˘ á áĽáŤá á PHP ááľáĽ áááá˛-áááá á¤áá á áŤáááŁá áĽá á phreads ááľá á°ááá§áᢠá¨á¤á° ááá ááą ááá áá°áĽ á¨áá áŤá ᨠZTS (Zend Thread Safe) á¨PHP áľáŞáľ áá áĽáť ááá ááá˘
áĽáá´áľ áĽááááŤáá?
á¨Tarantool ááłáá áĽááľááá áá°á áĽá ááá á°á°áááá (wal_mode = ááá) áĽá á¨á ááłá¨ áá¨áĽ ááľ áá¨áá (readhead = 1 * 1024 * 1024). á¨ááááŞáŤá á ááŤá á¨á˛áľá áá áľáŤá áŤáľáááłá, ááá°áá á¨áľááá° ááá ááľ á°á¨á᪠áĽáŤááá˝á áááá ἠáĽá á áá á á¨áľáááľ áĽáŞáá˝á ááĽá áááááľ áŤáľá˝áá.
á¨áá¨á áá ááá°áŠ áááłá¨áŞáŤáá˝ (ááľááŁáľáŁ áľá¨áᣠááŁáĽáŁ ááá°)ᣠáááłá¨áŞáŤáá á¨ááááá á ááľáŁ memtx áŚáł (áĽáá°áá) ááá áŤáᣠáá
á ááááš á¨áá¨á á áá áááá˝ á áłáá á¨á˘áá˛áá áĽá´áśá˝ áááŹá°á á¨á°áá አáá¸áᢠ(á
á°á á°á¨á°á)á˘
á¨á áá DDL áá
á áááľáááĄ-
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}})
á áľááá á¨áá, áááŞáŤáá á¨ááľáŹáą á ááľ, áŚáłá á 10,000 áąáá á áš á°áááˇá.
{id, "tuplĐľ_<id>"}
áąáááľ á áááá° ááá áĽá´áľ á áá áá áá°ááłáá˘
áááŞáŤá áŤáą 10,000 áá (á áĽáŽáśá˝) áááááá á¨á áááአáá á áĽáŤá áá ᣠáĽáąá á á°áŤá ᣠá áľáááá˝ áá¨ááááᢠá 5 áľáááážá˝ ááŤá¨á áŤáá á¨ááá áá ááŠááľ á°ááŁáááľ áŁáá á¨3% áľá á°áľ ááľáĽ áĽáľáŞáá áľá¨áľ áľáááážáš áá°ááááᢠá¨áá á áá á ááŤá áá¤áą ááá°áłá. á ááá áŽáááá°á áĽááłáá á°áĽáľ ááá¨áá¨á 1 á°á¨ááľ áŁáá áľ ááá á áľáááá˝ ááŤá¨á á áᢠá¨áá ááťáť á°áĽáłá˘ á¨áĽáŤááłááą áľáááá˝ á ááľ á°á°áááá áĽá á¨á°á ááá á áá ááááá ááá°áłáᢠá¨PHP áá°áą á¨áááá¨á ááááłá¨áŞáŤá á áľááá á áá ááŤáááŤáá˝ áĽáť ááᣠáá ááľ áááľ á áá áĽá ááťáť á°áĽáłá˘á á°á°ááááá˘
* á¨á áĽáŽáśá˝ áĽáᾠᣠáľáááážá˝ áĽá á¨áľá á°áľ áá°áŚá˝ á á¤áá˝ááá á áá áśá˝ ááľáĽ ááá¨áŠ áá˝ááá˘
á¨áá¨áŤ á áŤáŁá˘
á¨áá
á áłá˝ á¨áłá°ááľ áá¤áśá˝ á MacBookPro (2015) ᣠáŚááŹá˛áá á˛áľá°á - Fedora 30 (á¨á¨ááá áľáŞáľ 5.3.8-200.fc30.x86_64) áá á°á°ááááᢠáłáŤááśá á áśá¨á á°ááᨠá¨áááŞáŤá áá"--network host"
.
á¨áĽá á áľáŞáśá˝:
Tarantool: 2.3.0-115-g5ba5ed37e
áśá¨áᥠ19.03.3ᣠa872fc2f86 ááááĄ
PHPᥠ7.3.11 (cli) (á¨á°á°áŤáĄ áŚááśá á 22 2019 08áĄ11áĄ04)
tarantool / á°áá á: 0.6.0
rybakit/msgpackᥠ0.6.1
ext-tarantoolᥠ0.3.2 (+ patch for 7.3)*
ext-msgpackᥠ2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
ext-áľááŠáĄ 1.1.3
* áĽáá° á áááłá°á áá áŚáá´ááá áááá ᨠPHP áľáŞáľ> 7.2 áá á áá°áŤáᢠá
áĽáŤáá á PHP 7.3 áá ááá ááá áĽá áááľáŹáľáŁ áá áá áá á¨áĽá
áá¤áśá˝
á¨á°ááłá°á áááł
ᨠTarantool ááŽáśáŽá áááľáŽá˝ á
áá¸áľ áá ááá
áááááá˝á á¨ááááá á ááľ á¨áááĽááľ áá á˘ááŽá°áŽá˝á á ááťá¸á á PHP á áŤáŤáĽ áĽáááŤáá áĽá á ááŁá áá¨áŤáá˝ áááĄá áá¤áľ á¨ááŤáłá¨áá áĽáá ááááá˘
ááá áĽááłá ᨠPHP áľáŞáľ (ááá
) ᨠPECL ááŤáá፠á ááĽááľ áŤáá° á˘ááá ᣠá áĽááá°á ááŽáááśá˝ ááľáĽ á ááá áĽáá˛á ááá áľ áĽáááŤáá
áľááá á¨áááááá˝á á ááťá¸á á á°ááłá°á áááł áĽáááŤáĄ
á¨ááŤá áá áĽáá°ááłá¨á ᨠPECL á áŤáŤáĽ (Tarantool) ᨠPHP á áŤáŤáĽ (á°áá á) áá á˛ááłá°á á¨á°áťá á ááťá¸á áŤáłáŤáᢠáá áá
á áŤáľáááá ᣠá¨áááá ᣠá ááľáł ááá á¨áá°áá አá á°á¨á᪠ᣠá áĽáááą áĽá áľáŤáá˝á áá°áŤá-á áĽáŤááłááą áĽáŞ á á˛áľ ááá á°áá á¨á˘ áĽáŤá и áááľ (á áá¨áĽ ááłá - á°áá ááľáááľáĽá á ááá/ááłá°á፠áááł - ááááá˝), á¨á°áአá áŤááľ áááááľ, á áťá и á°ááŁáŁáŞ á á°á¨ááŞá á áá áá¨ááŤá. á°ááááááľ á áá áĽáá°ááᣠááá˝ ááᢠááá á á á ááá á¨PHP á°áááá áĽáŠ á ááťá¸á áŤáłáŤáᣠááá áĽááłá ááŠááľ á˘áááᣠáĽáá
áᣠá¨ááŁá á áá°áá áĽá ááááŁáľá á PHP 7.4 ááľáĽ ááľá ááŤá á˛á áá á¨á áá áŤáá° ááááᣠá PHP 8 ááľáĽ JIT áłáá ááľá˘
áĽáááĽáᢠTarantool 2.0 á SQL áľáá á áááᢠá¨SQL ááŽáśáŽáá á°á á áá áá¨áĽáŁ á áľááŁáŁ á ááá áĽá á°áá áľáŤáá˝á áááľáŤáľ áĽáááá áĽá áá¤áąá ᨠnoSQL (áááľáŽá˝) á áťáá˝ áá áĽáááłáľáá˘
á¨SQL áá¤áśáš á áŁá á áľá°áá á áá°áá (á ááá á¨á°ááłá°á áááłá áĽá¨áá¨áá áááá ááľáłááľá)ᢠáááᣠá áá
ááłá á áľááľá á áá¨áááᤠᨠSQL áľáá á ááá á áááľ áááľ áá áá (á á áááŤáááľ á á
áἠáá áááłá áľáá á°á¨ááŻáá˘
á ááá
á°á áᣠá áá á¨Async á áĽáŤ áĽáá´áľ á¨áá áŤááľá áá¤áśá˝ áááťáťá áĽáá°áá¨áłá áĽááᢠáŤáá°ááłá°á ááŽááŤáá˝á áááťáᣠá áĽáŤá á áŽáŽá˛á áá á¨á°áá á¨á° á¤áá á áá°áŁáᣠáĽáąá á¨ááá áááᢠáá áŤáŁá˘áŤá˝á á áŁá áĽáŠá á¨áŽááŚá˛áá˝ áĽááľ 25 áááá á á°á¨áŁá á°á¨áľá°áááĄ-
10,000 ááááá˝á á 25 áŽáŽááá˝ áá âáŤá°áŤáâ áĽá áá áĽáá°á°áá ᨠáááá¨áąáĄ-
á á´áŽááľ á¨ááááá˝ áĽáᾠᨠ3 áá á áá á¨ááŻá á
á ááŤáłáá áááłáŁ á¨PECL áááá á ext-async á áá°ááá¨áá˘
áľá SQLáľ?
áĽáá°áááá¨áąáľáŁ áŁáá°ááłá°á áááł á áááľáŽá˝ ááŽáśáŽá áĽá á SQL ááŤá¨á áŤáá ááŠááľ á áľá
á°áľ á
áłá ááľáĽ ááá˘
áľáá
á áá
áá á Swoole á áŁá áĽáŠáá á¨áŽáá˛áá˝ áĽááľ áĽáá°áá á ááá°áááĄ-
á 25 áá áĽááááá. á¨á á˛áá ááŤáá፠áá á°ááłáłá áá´á áĽááľááá - 10,000 áŚááŹá˝áá˝á á 25 áŽáŽááá˝ ááŤá¨á áŤá°áŤáŠ. á á°á¨ááŞá, áááá áľáŤáá˝ á 2 áááľ áá°áśá˝ á¨ááá¨ááá áľ áá áá°á áĽáá¨ááŤáá (áá
á áĽáŤááłááą áá°áľ á 5,000 áŽáŽááá˝ ááľáĽ 25 áľáŤáá˝á áŤá¨áááá). á áá áá áá°áśá˝ ááá áŤáᢠSwoole áá°áľ.
áá¤áśá˝
Swole á á ááľ áá°áľ ááľáĽ á˛ááľ á¨á á˛áá áá á˛ááťá¸á áľáá˝ áá
á°á áá¤áľ áŤáłáŤá, ááá áá á 2 áá°áśá˝ áľáá á á¨áá°á áááł ááá¨áŤá (ááĽá 2 á á ááŁá á áá°áá¨á á, á áĽá áá˝á áá, áĽáŠáá áá¤áľ áŤáłáŠ 2 áá°áśá˝ áá¸á).
á áááŤá˝á áá á¨á á˛áá á¤ááľá´áá˝á á¨áá°áśá˝ áá á áĽáŽ áááľáŤáľ á¤áá á á áá ᣠáá áĽá፠á á ááľ ááá á¨á፠á áá áá°áśá˝ ááľáĽ áááłá¨áŞáŤáá˝á á¨áááľ ááá ááŠááľ á ááľá°áááŠá (á ááľ áŚáł á á áá˝áź ááá áá˝áá)á˘
SQL vs áááľáŽá˝ ááŽáśáŽááĄ-
áá áĽáá° Asyncᣠá áááľáŽá˝ áĽá á SQL áŚááŹá˝áá˝ ááŤá¨á áŤáá ááŠááľ áŁáá°ááłá°á áááł ááááłáá˘
á°ááłáłá
áľáአááŤáááŤá áľá áŽáá˛áá˝ áłááá áľá ááŽá˝ áľááá áľáááááá á¨áľáአááŽá˝ áĽááľ áĽáááŤá˘
á áĽá áá˝á áá ᨠ16 áá áĽáŠá áá. á¨áááá áááŞáŤáá˝á á 16 áľáአááŽá˝ áá áĽááŤááľáĄ
áĽáá°áááá¨áąáľ, áá¤áą á¨á°ááłá°á á
áĽáŤáá˝ (áľáá á 2 áá°áśá˝ áá áĽá¨áŽá áłááá á) áĽááłá á¨á°áťá áá. á PECL á áŤáŤáĽ á¨ááá áĽá á¨ááłá°á፠áľáŤáá˝ áŁáś áááá¸áá áἠáá áᢠáá
á¨ááá áľ ááááŤáľ áĽááá
ááááá˝ á áľá
á°áľ áľááá°áłáŤáá¸á áá - ᨠext-parallelᣠext-tarantool ááá á¨áááąá áľá
á°áľ áááá á ááá
áá˘
á áá ᨠSQL á ááťá¸áá áĽáááłáľááĄ-
á á°ááłáłá áá ááááą áááááá˝ á¨ááŤá áá áŤááá á°ááłáłáááľ á áľá°áá?
á ááľ áá¨
áĽá á áá¨á¨áťá, ááá¨áŤ ááŤáááŤáá˝ á á ááá ááľáá ááá¨áľ áááá áá¤áśá˝ á á ááľ ááŤá áĽáá ááá. áĽáľáŤáá áŤáá°á¨áááá á ááľ á á˛áľ áá¨áŤ áá° áá áłá áĽáá¨áá - Parallel*á á áá áá Async coroutines á áľáአáĽááŤááľá˘ á¨áá áŤááľá ááŤáááŤáá˝ á¨ááááľ ááłáĽ ááľááá áá
* áľáá áŽáá˛áá˝á á Parallel ááľááá á áá°áťááᤠáĽááá á áĽáŤáá˝ á¨áááŁáŁá áááľááá˘
áľááá , á¨áá¨á¨áť áá¤áśá˝:
á¨áá ááá á ááľ áá°áá°ááŤ
á áĽá á áľá°áŤá¨áľ áá¤áśáš á áŁá áĽá ááá á°ááá°áá ᣠáĽá á áá ááááŤáľ áá
áá°áĽ áĽááłááá áĽááá á áá! áá
áá á áĽááá°á ááŽáááľ ááľáĽ ááŤáľá
áĽáť ááá°á áŤáľáááá
áĽáá°ááᣠááĽá áĽáť áá á¨áááᣠá¨á°ááłá°á TCP á áŤáŤáĽ á áľááš áĽá¨áľ áá áŤá
á âáááá
â áĽáá°ááľá˝á áááááá á¨ááŤáľá˝á á áľá°áłá˝ áá¨áŤ áá áᢠá¤áá˝áááŽá˝á áááťáťá ááłáŚá˝ áŤáááľáŁá¨áĽááľáá á¨ááłáĽ áĽáŤá á ááááἠá°áľá°á ááᢠá¨ááľáááŞáŤ áááŞáŤáá˝ áĽá áá¤áśá˝ áŤááľ ááá áŽáľ á á°áᨠáłáľáá
ááá: hab.com