ืืืขืจืืช ืืืงืืืืืืช ืฉื PHP ืืฉื ื ืืืื ืฉื ื ืืืืจืื ืืขืืืื ืขื ืฉืจืช Tarantool - ืืืื ืืจืืื ืืจืฉืืืช ืฉื PECL
ืืืืืจ ืื, ืืจืฆืื ื ืืืืืง ืืช ืืชืืฆืืืช ืฉื ืืืืงืืช ืืืืฆืืขืื ืฉื ืฉืชื ืืกืคืจืืืช ืืืืจืืืช ืืืฆื, ืขื ืฉืื ืืืื ืืื ืืืืืื ืืงืื, ื ืืชื ืืืฉืื ืฉืืคืืจ ืฉื 3-5 ืืืฆืืขืื (ืืืืื ืื ืกืื ืชืืืื!).
ืื ื ืืืืง?
ื ืืืืง ืืช ืืื ืฉืืืืืจื ืืขืื ืกืื ืืจืื ื ืืืืจืื ืคืืขืืื ืืืืคื ืืกืื ืืจืื ื, ืืืงืืื ืื-ืกืื ืืจืื ื-ืืงืืื. ๐ ืื ืื ื ืื ืื ืจืืฆืื ืืืขืช ืืงืื ืฉื ืืืืืจืื ืขืฆืื. ืืฉ ืืจืืข ืืกืคืจ ืืจืืืืช ืืืื ืืช ืืื ืืืฉืื ืืช ืื ืฉืืชื ืจืืฆื:
ืกืืื โ ืืกืืจืช ืืกืื ืืจืื ืืช ืืขืืช ืืืฆืืขืื ืืืืืื ืขืืืจ PHP. ืืฉืืืืฉ ืขื ืืื ืขื ืงืืืช ืืื ืืจื ื ืืื ืขืืืืืื ืืืืืื. ืืื ืืจืกื 4.1.0 ืืืคืืขื ืฉืืืช ืงืกื SwooleRuntime::enableCoroutine(), ืืืืคืฉืจ ืื "ืืืืืจ ืกืคืจืืืช ืจืฉืช PHP ืกืื ืืจืื ืืืช ืืกืคืจืืืช ืืกืื ืืจืื ืืืช ืขื ืฉืืจืช ืงืื ืืืช."- Async ืืืืชื ืขื ืืืืจืื ื ืืจืืื ืืืืืื ืืืื ืืขืืืื ืืกืื ืืจืื ืืช ื-PHP. ืืื ืขื ืืืืจืื ื? ืืฆืขืจื, ืืกืืื ืฉืืื ื ืืืืขื ืื, ืืืืืจ ืืืง ืืช ืืืืืจ ืืืืจืื ืืขืชืืื ืฉื ืืคืจืืืงื ืืื ื ืืจืืจ. ืื ื ืืฆืืจื ืืืฉืชืืฉ ืื
ะพะดะฝะธะผ ืืืืืืืช. ืืืืื ื-Swoole, ืืจืืื ืื ืืืคืฉืจืช ืื ืืืคืขืื ืืงืืืช ืืช ืืืื ืกืืื ืืืืืฆืช ืืฃ ืืื ืืื ืืืคืฉืจ ืืกืื ืืจืื ืขื ืืื ืืืืคืช ืืืืฉืื ืืกืื ืืจืื ืฉื ืืจืื TCP ื-TLS ืืืจืกืืืช ืื-ืกืื ืืจืื ืืืช ืฉืืื. ืื ื ืขืฉื ืืืืฆืขืืช ืืืคืฉืจืืช "async.tcp = 1". ืืงืืื - ืืจืืื ืืืฉื ืืืื ืฉื ื'ื ืืืืงืื ืก ืืืืืข, ืืืืจื ืฉื ืกืคืจืืืช ืืื phpdbg, apcu, pthreads, pcov, uopz. ืืชืืกืฃ ืืกืคืง API ืืจืืืื ืืืืื ืฉืจืฉืืจ ื-PHP ืืืืืงื ืืชืืืืฃ ื-pthreads. ืืืืื ืืฉืืขืืชืืช ืฉื ืืกืคืจืืื ืืื ืฉืืื ืขืืืืช ืจืง ืขื ืืจืกืช ZTS (Zend Thread Safe) ืฉื PHP.
ืืื ื ืืืืง?
ืืืื ื ืฉืืง ืืืคืข ืฉื Tarantool ืขื ืจืืฉืื ืืชืืื ืงืืืื ืืืฉืืช (wal_mode = ืืื) ืืืืืจ ืจืฉืช ืืืืื (readahead = 1 * 1024 * 1024). ืืืคืฉืจืืช ืืจืืฉืื ื ืชืืื ืืช ืืขืืืื ืขื ืืืืกืง, ืืฉื ืืื ืชืืคืฉืจ ืืงืจืื ืืงืฉืืช ื ืืกืคืืช ืืืืืจ ืืขืจืืช ืืืคืขืื ืืืื ืืืืขืจ ืืช ืืกืคืจ ืงืจืืืืช ืืืขืจืืช.
ืขืืืจ ืื ืฆ'ืืจืงืื ืฉืขืืืืื ืขื ื ืชืื ืื (ืืืกืคื, ืืืืงื, ืงืจืืื ืืื'), ืืคื ื ืืชืืืช ื-benchmark, ืืืืฆืจ (ืืืืฉ) ืจืืื 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%*. ืืืืจ ืืื, ืืชืืฆืื ืืืืืฆืขืช ื ืืงืืช. ืืฉ ืืคืกืงื ืฉื ืฉื ืืื ืืืช ืืื ืืืืจืฆืืืช ืืื ืืื ืืข ืืืืขืื ืืืื ืืง. ืืกืคื ืืืฉืคื ืฉื ืืืื ืืืฉืืช ืืคื ื ืื ืืืืจืฆืื ืื ืืืฅ ืืืชืืื ืืืืจ ืกืืืื. ืชืืืื ื-PHP ืืืคืขื ืจืง ืขื ืืืจืืืืช ืื ืืืฆืืช ืืืืื ืืฉืืืืช ืืืฆืืขืื, ืืืฉืจ ืืืกืื ืคืื ืืืคืขื ืืืืกืฃ ืืืฉืคื ืืืฉืืช.
* ื ืืชื ืืฉื ืืช ืืช ืืกืคืจ ืืกืืืืืื, ืืืืืจืฆืืืช ืืกืฃ ืืฉืืืื ืืืืืจืืช ืืืืื.
ืกืืืืช ืืืืงื
ืืชืืฆืืืช ืฉืคืืจืกืื ืืืื ื ืขืฉื ื-MacBookPro (2015), ืืขืจืืช ืืคืขืื - Fedora 30 (ืืจืกืช ืืืื 5.3.8-200.fc30.x86_64). Tarantool ืืืฉืง ื-docker ืขื ืืคืจืืืจ "--network host"
.
ืืจืกืืืช ืืืืื:
Tarantool: 2.3.0-115-g5ba5ed37e
ืืืงืจ: 19.03.3, ืื ืืืช a872fc2f86
PHP: 7.3.11 (cli) (ื ืื ื: 22 ืืืืงืืืืจ 2019 08:11:04)
tarantool/client: 0.6.0
rybakit/msgpack: 0.6.1
ext-tarantool: 0.3.2 (+ ืชืืงืื ืขืืืจ 7.3)*
ext-msgpack: 2.0.3
ืืกืื ืืจืื ืืืฆืื ื: 0.3.0-8c1da46
ืืงืกื-wool: 4.4.12
ืืงืืื ืืืฆืื ื: 1.1.3
* ืืืจืื ืืฆืขืจ, ืืืืืจ ืืจืฉืื ืื ืขืืื ืขื ืืืจืกืช PHP > 7.2. ืืื ืืงืืคื ืืืืคืขืื ืืช ืืชืืกืฃ ื-PHP 7.3, ืืืืชื ืฆืจืื ืืืฉืชืืฉ
ืืืฆืืื
ืืฆื ืกืื ืืจืื ื
ืคืจืืืืงืื Tarantool ืืฉืชืืฉ ืืคืืจืื ืืื ืืจื
ืืคื ื ืืฉืืืืช ืืืืจืื, ื ืืืื ืืช ืืืืฆืืขืื ืฉื ืืงืืืื MessagePack ืขืืืจ ืืืืจ PHP ืืืืืืงืืช ื ืืกืคืืช ื ืฉืชืืฉ ืืื ืฉืืจืื ืืช ืืชืืฆืื ืืืืื ืืืืชืจ:
ืืืจืืช ืฉืืจืกืช ื-PHP (Pure) ื ืืืชื ืืืจืืืช PECL ืืืืืจืืช, ืืคืจืืืงืืื ืืืืชืืื ืขืืืื ืืืืชื ืืืืืฅ ืืืฉืชืืฉ ืื
ืื ืืืื ื ืืืื ืืช ืืืืฆืืขืื ืฉื ืืืืจืื ืืืฆื ืกืื ืืจืื ื:
ืืคื ืฉื ืืชื ืืจืืืช ืืืืจืฃ, ืืืืจ PECL (Tarantool) ืืฆืื ืืืฆืืขืื ืืืืื ืืืชืจ ืืืฉืืืื ืืืืืจ PHP (Client). ืืื ืื ืื ืืคืชืืข, ืืืชืืฉื ืืื ืฉืืืืจืื, ืื ืืกืฃ ืืืืืชื ืืืืฉื ืืฉืคื ืืืืืช ืืืชืจ, ืืืขืฉื ืขืืฉื ืืืชืจ ืขืืืื: ืืืืืืงื ืืืฉ ื ืืฆืจ ืขื ืื ืงืจืืื ืืงืฉ ะธ ืชึฐืืึผืึธื (ืืืงืจื ืฉื Select - ืื ืงืจืืืจืืื ืื, ืืืืงืจื ืฉื Update/Upsert - ืชืคืขืื), ืืฉืืืืช ื ืคืจืืืช ืืงืฉืจ, ืืืจื ะธ ืื ืืืจ ืื ืื ืืืกืืคืื ืชืงืืจื. ืืจืืจ ืฉืืืืืฉืืช ืืฉ ืืืืจ. ืขื ืืืช, ืืืืคื ืืืื, ืืชืืจืืื PHP ืืฆืื ืืืฆืืขืื ืืืืื, ืืืจืืช ืฉืืฉ ืืืื, ืืื ืืกืจ ืืฉืืขืืช ืืืืื ืืืื ืืคืืื ืคืืืช ืืขืช ืฉืืืืฉ ืืืขืื ื ืืืงืืืช ื-PHP 7.4, ืฉืื ืืืืจ ืขื JIT ื-PHP 8.
ืืื ื ืืฉืื ืืืื. Tarantool 2.0 ืืืกืืคื ืชืืืื ืขืืืจ SQL. ืืืื ื ื ืกื ืืืฆืข ืคืขืืืืช Select, Insert, Update and Delete ืืืืฆืขืืช ืคืจืืืืงืื SQL ืืืืฉืืืช ืืช ืืชืืฆืืืช ืขื ืืืงืืืืืช noSQL (ืืื ืืจืืืช):
ืชืืฆืืืช ื-SQL ืื ืืืื ืืจืฉืืืืช (ืชื ืื ืืืืืืจ ืื ืฉืื ืื ื ืขืืืื ืืืืงืื ืืฆื ืกืื ืืจืื ื). ืขื ืืืช, ืื ืืืืชื ืืชืขืฆืื ืืื ืืืขืื ืืืขื; ืชืืืืช SQL ืขืืืื ืืคืืชืื ืคืขืื (ืืืืจืื ื, ืืืฉื, ื ืืกืคื ืชืืืื
ืืกืื ืง
ืืืื, ืขืืฉืื ืืืื ื ืจืื ืืืฆื ืชืืกืฃ Async ืืืื ืืขืืืจ ืื ื ืืฉืคืจ ืืช ืืชืืฆืืืช ืืืขืื. ืืื ืืืชืื ืชืืื ืืืช ืืกืื ืืจืื ืืืช, ืืชืืกืฃ ืืกืคืง API ืืืืืกืก ืขื ืงืืจืืืื ืื, ืื ื ืฉืชืืฉ. ืื ื ืืืืื ืืืืคื ืืืคืืจื ืฉืืืกืคืจ ืืืืคืืืืื ืฉื ืงืืจืืืื ืื ืขืืืจ ืืกืืืื ืฉืื ื ืืื 25:
"ืคืืจ" 10,000 ืคืขืืืืช ืขื ืคื ื 25 ืงืืจืืชืื ืื ืืจืื ืื ืงืืจื:
ืืกืคืจ ืืคืขืืืืช ืืฉื ืืื ืืื ืืืืชืจ ืืคื 3 ืขืืืจ
ืืืจืื ืืฆืขืจ, ืืืืจ PECL ืื ืืชืืื ืขื ืืกืื ืืจืื ืืืฆืื ื.
ืื ืขื SQL?
ืืคื ืฉืืชื ืืืื ืืจืืืช, ืืืฆื ืืกืื ืืจืื ื ืืืืื ืืื ืืคืจืืืืงืื ืืืื ืืจื ื-SQL ืืคื ืืืืื ืืฉืืืื.
ืกืืื
ืฉืื ืื ื ืืืืื ืืช ืืืกืคืจ ืืืืคืืืืื ืฉื ืงืืจืืืื ืื, ืืคืขื ืขืืืจ Swoole:
ืืืื ื ืขืฆืืจ ื-25. ืืืื ื ืืืืจ ืขื ืืืชื ืืจืืง ืืื ืขื ืืจืืื Async - ื ืืืง 10,000 ืคืขืืืืช ืืื 25 ืงืืจืืืื ืื. ืื ืืกืฃ, ื ืืกืืฃ ืืืืงื ื ืืกืคืช ืื ื ืืืง ืืช ืื ืืขืืืื ื-2 ืฉื ื ืชืืืืืื (ืืืืืจ, ืื ืชืืืื ืืืฆืข 5,000 ืคืขืืืืช ื-25 ืงืืจืืืื ืื). ืชืืืืืื ืืืืืฆืจื ืืืืฆืขืืช SwooleProcess.
ืชืืฆืืืช:
Swole ืืฆืืื ืชืืฆืื ืืขื ื ืืืื ืืืชืจ ืืืฉืืืื ื-Async ืืฉืืื ืืืคืขืืช ืืชืืืื ืืื, ืืื ืขื 2 ืชืืืืืื ืืชืืื ื ืืฉืชื ื ืืฆืืจื ืืจืืืืช (ืืืกืคืจ 2 ืื ื ืืืจ ืืืงืจื; ืืืืื ื ืฉืื, ืืื ืืื 2 ืชืืืืืื ืฉืืจืื ืืช ืืชืืฆืื ืืืืื ืืืืชืจ).
ืืื, ืืชืืกืฃ Async ืืฉ ืื API ืืขืืืื ืขื ืชืืืืืื, ืืื ืฉื ืื ืืืื ืชื ืืฉืื ืืืื ืืืคืขืืช benchmarks ืืชืืืืืื ืืื ืื ืืืชืจ (ืืืชืื ืฉืคืืฉืืชื ืืืคืฉืื).
SQL ืืขืืืช ืคืจืืืืงืื ืืื ืืจื:
ืืื ื-Async, ืืืืื ืืื ืคืขืืืืช ืืื ืืจืืืช ื-SQL ืืชืืื ืืืฆื ืืกืื ืืจืื ื.
ืืงืืื
ืืืืืื ืฉืืืจืืื ืืืงืืืื ืืื ื ืขืืกืงืช ืืงืืจืืืื ืืช, ืืื ืืฉืจืฉืืจืื, ืืืื ื ืืืื ืืช ืืืกืคืจ ืืืืคืืืืื ืฉื ืืืืื ืืงืืืืื:
ืื ืฉืืื ื-16 ืืืืฉื ืฉืื. ืืื ื ืจืืฅ ื ืงืืืืช ืืืื ืฉื ืืืืจืื ืขื 16 ืคืชืืืื ืืงืืืืื:
ืืคื ืฉืืชื ืืืื ืืจืืืช, ืืชืืฆืื ืืคืืื ืืืื ืืืชืจ ืืืฉืจ ืขื ืืจืืืืช ืืกืื ืืจืื ืืืช (ืื ืกืืคืจ ืืช Swoole ืฉืคืืขื ืขื 2 ืชืืืืืื). ืฉืื ืื ืฉืขืืืจ ืืืืจ PECL, ืคืขืืืืช ืืขืืืื ืืืืขืืื ืจืืงืืช. ืื ื ืืืข ืืืขืืืื ืฉืคืขืืืืช ืืื ื ืืฉืื ืขื ืฉืืืื - ืื ื ืื ืืืืข ืื ืื ืืืืชื ืืฉืืชื ืฉื ext-parallel, ext-tarantool, ืื ืฉื ืืื.
ืืขืช ื ืฉืืื ืืช ืืืฆืืขื SQL:
ืฉืืชื ืื ืืืืืื ืขื ืืืจืฃ ืขืืืจ ืืืืจืื ืืคืืขืืื ืืืืคื ืกืื ืืจืื ื?
ืึทืึทื
ืืืืกืืฃ, ืืืื ื ืกืื ืืช ืื ืืชืืฆืืืช ืืืจืฃ ืืื ืืื ืืจืืืช ืืช ืืชืืื ื ืืืืืืช ืฉื ืืืจืืืืช ืฉื ืืืงื. ืืืื ื ืืกืืฃ ืจืง ืืืืงื ืืืช ืืืฉื ืืชืจืฉืื, ืฉืขืืืื ืื ืขืฉืื ื - ืืืื ื ืจืืฅ ืงืืจืืืื ืืช Async ืืืงืืื ืืืืฆืขืืช Parallel*. ืืจืขืืื ืืฉืื ืืช ืืืจืืืืช ืืขืื ืืืจ
* ืื ื ืืชื ืืื ืืืฉืืง Swoole coroutines ืขื Parallel; ื ืจืื ืฉืืจืืืืช ืืื ืืื ื ืชืืืืืช.
ืื ืืชืืฆืืืช ืืกืืคืืืช:
ืืืงืื ืืกืงื ื
ืืืขืชื ืืชืืฆืืืช ืืชืืจืจื ืืจืืืืืช ืืืื, ืืืฉืื ืื ืื ื ืืืื ืฉืื ืื ืืืืื! ืื ืืชื ืฆืจืื ืืืืืื ืืช ืื ืืคืจืืืงื ืืืืชื ืจืง ืืฉืืื ืขืฆืื, ืื ื ืจืง ืืืื ืฉืืฉืืืื ืื ืืื ื ืืกืื ืืขื ืืื ืฉืืืคืฉืจ ืื ืืืขืจืื ืืื ืืชื ืืืื "ืืกืืื" ืืืืืจ TCP ืกืื ืืจืื ื ืืืื ืืืื ืืืืฅ. ืื ืืฉ ืื ืจืขืืื ืืช ืืฉืืคืืจ ืืืืช ืืืื, ืืฉืื ืืฉืงืื ืืช ืืงืฉืช ืืืฉืืื ืฉืื. ืื ืืงืื ืขื ืืืจืืืช ืืคืขืื ืืชืืฆืืืช ืืชืคืจืกื ืื ืคืจื
ืืงืืจ: www.habr.com