αα
αααα»αααααααααα’αααΌ PHP αα
αα
α»ααααααααΆαα§αααααααααΆααααΈααααααΆααααααΎααΆαααΆαα½ααααΆαααΈααα Tarantool - αααααΊααΆααααααααααα PECL ααααΌαααΆα
αα
αααα»αα’αααααααα αααα»αα
ααα
αααααααααααααααααΆαααααΎαααααααΆαα’αα»αααααααααααΆαααααΆααααΈα αα·ααααα αΆαααΈααααααΆαα½αααΉαααΆαααααΆααααααΌααα·α
αα½α
αααα»αα
ααααααΌα α’αααα’αΆα
αααααα
ααΆαααΌαααΆαααΎαα‘αΎαααααΆαα’αα»αααα 3-5 (αα
ααΎααΆαααααΎαααααααααα!).
ααΎααΎαααΉαααΆαααααα’αααΈ?
ααΎαααΉαααΆαααααα’αααΈαααααΆααααααΆααααΆαααΎ ααααΆααααα α§αααααααααΆααααααΎαααΆααααα’ααααΆα ααααααααΆ αα·αα’ααααΆα-αααΆαααΆα‘ααα π ααΎααααα·αα ααααααααααΌαααααα§αααααααααΆαααααα½αα―ααααα αα αα α»ααααααααΆααααααααααααααΆα αααΎααααα’αΆα ααααΆαααΎααααΈαααααα ααΆαααΌαα’αααΈαααα’αααα ααααΆαα
Swoole - ααααααααα asynchronous ααααΎαααΆαααααααααααΆαα PHP α ααααΎααααααα»αα αα»αα’ααΈαααΊαα·αααααααΌα ααΆ Alibaba αα·α Baidu α α αΆααααΆααααΈαααα 4.1.0 αα·ααΈααΆααααααααααααααΆααααα αΆααααα½α SwooleRuntime ::enableCoroutine()αααα’αα»ααααΆαα±ααα’ααα "ααααααααααααΆααααααααΆα PHP αααααααΎααααΆααααααα ααΆα’ααααΆαααΆαα½αααΌααααα½αα"- αα αΌαααααααααααααΈαααα Async ααΊααΆααααααααααααααααααααα½ααααααΆααααΆαααΆαα’ααααΆααα
αααα»α PHP α α ααα»α’αααΈαα αΌαααααααααααααΈαααα? ααΆα’αα»αα αααααΆααα ααα»ααααααααα»ααα·αααααΆαα α’ααααα·ααααααΆααα»αααααΆαα α αΎααααααΆαααΆα’ααΆααααααααααααΊαα·αα
αααΆααααΆααα αααα»αααΉαααααΌαααααΎααΆα
αα½α ααΈααα ααΌα Swoole αααααα·ααΈαααααααααα’αα»ααααΆαα±ααα’αααααΎαααααααα’αααααΆααααΆαααΆααααα½ααααααααΎαααααΎααααΈααΎαααααΎαααΆαα’ααααΆαααααααα½αααΆαα’αα»αααααααααααΆαααααΆαααααΆα TCP αα·α TLS ααΆαα½αααΉαααααα’ααααΆααααααα½αααα αααααααΌαααΆαααααΎααΆαααααααααΎα "async.tcp = 1"α αααΆαααΆα‘αα - αααααααααααααααΈααααα»αααα·αααααΈ Joe Watkins ααααααΈ α’ααααα·αααααααααααΆαααααΌα ααΆ phpdbg, apcu, pthreads, pcov, uopz α ααααααααααααααααααΌα API αααααΆαα multithreading αα αααα»α PHP α αΎαααααΌαααΆαααΆαααααα½ααααααΆαα pthreads α ααααααααααααΆαααααααααΆαααααΊααΆααΆααααΎαααΆαααααΆαα½ααααα ZTS (Zend Thread Safe) αα PHP ααα»αααααα
ααΎααΎαααΉαααααΎααααααααααααααΆ?
αααα αΆααααααΎααααααα·ααΈ Tarantool ααΆαα½αααΉαααΆααααααααΆαα»ααα»ααα·α (wal_mode = ααααΆα) αα·αααΆαααΎαα‘αΎααααααΆαααααααα’αΆαααα (readahead = 1 * 1024 * 1024) αααααΎαααΈαα½αααΉααα»αααααΆααααΆαααΆαααΆαα½αααΈα ααΈααΈαααΉαααααΎα±ααααΆα’αΆα α’αΆαααααΎααααααααΈααα·ααααααα’αΆααααααααααααααααα·ααααα·ααΆα α αΎααααα ααα»αααααΆαααααααα ααα½αααααΆαα α ααααααααα
αααααΆααααααααααααΎαααΆαααΆαα½ααα·αααααα (ααΆααααα
αΌα ααΆααα»α ααΆαα’αΆαα (ααααΆαα) α
α
ααααα 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 tuples αααααααα
{id, "tuplΠ΅_<id>"}
Tuples ααααΌαααΆαα αΌαααααΎαααααααΎαααααααα αααααα
αααααααΆααααα½αααΆααΊααΆααααΎαααα½ααα ααΆαααααΆαααΈααα αααααααΌαααΆαααααα·ααααα· 10,000 αα (ααα·αααααα) ααααα αααα»ααααααααΌαααΆαααααα·ααααα·αααααααα ααΆαβααααΎβαααααβααααΌαβααΆαβααααΎβα‘αΎαβαα·αβαα αΌαβααΆααβααβαααααΆαβαααααβαααβαααΆαβααΆαβααααΎβα‘αΎαβαα·α 5 ααΊβαααα·αβαααα»αβααα α»αβαααβα’αΆα βααα½αβααβααΆα 3%*α αααααΆααααΈαααααααααααΆαααααααααΌαααΆαααα ααΆαααΆαααα’αΆα 1 αα·ααΆααΈαααΆαααΆαααααΎαααααααααΎααααΈααΆαααΆααα½αααααΆαααΈααΆααα·αααΎαα α’ααααααααΌαααααΆααααα Lua ααααΌαααΆααα·ααα»ααααααααΎαααΆαα‘αΎααα·αααΈαα½αα α αΎαααααΌαααΆααααααα±ααα αΆααααααΎααααααΆααααΈααΆαααα ααα ααααΎαααΆα PHP ααααΌαααΆαααΆααα±ααααααΎαααΆαααααΆαα½αααααααααααααααα αΆαααΆα ααααααΆααααα αααααΆαααααΎαααΆαααα·ααααααα’αΆαααααααααα α αΎαα§ααααααααααΌαααααΆαααααΌαααΆααα·αα
* α ααα½αααααα·αααααα ααΆαααααΎααααααα αα·αααααα·αααααα α»αα’αΆα ααααΌαααΆαααααΆααααααΌααα αααα»αααΆαααααααααα
ααα·ααΆααΆαααΆααααα
αααααααααααΆαααααα»αααααΆααααααααααΌαααΆαααααΎα‘αΎααα
ααΎ MacBookPro (2015) ααααααααααααα·ααααα·ααΆα - Fedora 30 (ααααααΊααα 5.3.8-200.fc30.x86_64) α Tarantool ααααΌαααΆαααΆααα±ααααααΎαααΆααα
αααα»α docker ααΆαα½αααΉααααΆαααΆαααααα "--network host"
.
αααααααα ααα
Tarantool: 2.3.0-115-g5ba5ed37e
Dockerα 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 (+ αααααααααΆαα 7.3)*
ext-msgpackα α’.α .α£
ext-asyncα 0.3.0-8c1da46
ext-swooleα α€.α€.α‘α’
ext-parallelα α‘.α‘.α£
* ααΆα’αα»αα α§αααααααααΆααααααΌαααΆααα·αααααΎαααΆαααΆαα½ααααα PHP > 7.2 ααα ααΎααααΈα
ααααα αα·αααααΎαααΆαααααααααααααα
ααΎ PHP 7.3 αααα»αααααΌαααααΎ
Π Π΅Π·ΡΠ»ΡΡΠ°ΡΡ
ααααααααΎααααΆααααα
αα·ααΈααΆα Tarantool ααααΎαααααααααααΈα
αα»ααααααααααααα§αααααααααΆαα ααΎαααΉαααΆαααααααααααΎαααΆααααααααα·ααΈα’αα·αααΌα MessagePack αααααΆααα§αααααααααΆαα PHP α αΎααα αααα»αααΆαααααΎαααααααααααααα ααΎαααΉαααααΎα§αααααααααααα αΆαααααααααα’αααα»αα
αααααΈααΆαααα PHP (Pure) ααΆαααΆαααααααααααα PECL αααα»αααααΏαααααα αααα»ααααααααα·α αααα»ααα
ααααααΆαα±ααααααΎααΆ
ααΌα αααα α αΌαααΎαααΆαααααααααααΎαααΆαααααα§αααααααααΆαααααα»αααααααααΆαααααα
ααΌα
αααα’αΆα
ααΎαααΎαααΈααααΆα αα α§αααααααααΆαα PECL (Tarantool) αααα αΆαααααΎαααΆααααααΎαααΆαααΎαααααααααα
ααΉαα§αααααααααΆαα PHP (α’αα·αα·αα) α ααα»ααααααααα·ααααααΆααΏααα½αα±ααααααΆααααα’αΎαααααα ααααααααααΆ αααααααααα ααααααααΈααΎααΆαα’αα»ααααααΆααΆααΆααΊα ααΆαα·αααΆααααΎαααΆαααΆαα
αααΎαααΆααα»αα ααααα»ααααΈααααΌαααΆααααααΎαααΆαα½αααΉαααΆαα α
ααΈαα½ααα ααααΎααα»α ΠΈ ααΆαααααΎααα (αααα»αααααΈααααΎαααΎα - αααααα αααααααα·αα·α
ααααα αΎααααα»αααααΈα’αΆααααα/α’αΆααααα - ααααα·ααααα·ααΆα) α’αααααΆαααΆα
ααααα‘αα ααΆααααααΆαα, ααΆαααΊ ΠΈ αααααα·ααΈαααααααΆα αα½αααααααααααααΈααΎαααααα ααΆααααααα ααΆαααααααααΆααααααα»αααααααα½αα αααααΆαααΆαααΆαααααααΆααΌαα
α’ααααααααα PHP αααα αΆαααΈααααΎαααΆαααα’αααααΈααΆααΆαααΆααα»ααααααααααΆαααααααΆαα·αααααΆααααα αΎααααα ααααΆαα·α
ααΆααα
αααααααΎααΆααααα»αααΆαα»ααα
αααα»α PHP 7.4 αα·αααααα·ααΆαααΈ JIT αα
αααα»α PHP 8 ααα
ααααααααα αα»ααααα Tarantool 2.0 ααΆαααααααααΆαααΆαααααααααΆαα SQL α αααααααΆααΆαα’αα»ααααααααα·ααααα·ααΆαααααΎαααΎα αααα αΌα ααααΎαα αα α»ααααααααΆα αα·ααα»ααααααααΎαα·ααΈααΆα SQL α αΎαααααααααααααααααΆαα½αααΉαααααΌα noSQL (αααααααααααααΈα)α
αααααα SQL αα·ααα½αα±ααα
αΆααα’αΆααααααααααΆαααα (αααα»αααΌαααααΉαα’αααααΆααΎααααα»αααΆαααααααααααααΆααααα) α ααααααΆαααΆααααα αααα»αααΉααα·αααΆαααΆαααα
α·αααα
ααααααΏαααααα»ααααααααΆαα ααΆαααΆαααα SQL αα
αααααα·ααααααααΆαα’αα·ααααααααααα (α§ααΆα αααααααΈαααα ααΆαααΆααααααααΌαααΆααααααα
α’ααααΆα
α₯α‘αΌααααααΌαααΎαααΈαααααααααααααααααα Async α’αΆα αα½αααΎααααααα’ααααααααΆαααΎα ααΎααααΈααααααααααα·ααΈα’ααααΆα αααααα·ααΈαααααααααααααΌα API ααα’ααααΎ coroutines αααααΎαααΉαααααΎα ααΎαααααΎαααΆαααααααααΆα ααα½αααααα’αααααΎααα coroutines αααααΆααααα·ααααΆαααααααΎαααΊ 25:
"ααΈαααΆαααΆα" ααααα·ααααα·ααΆα 10,000 αα
ααΌααΆαα 25 αααααΆαα α αΎαααΎαααΆααΆαα’αααΈααΎαα‘αΎαα
α
ααα½αααααααα·ααααα·ααΆααααα»ααα½ααα·ααΆααΈααΆαααΎαα‘αΎαα
αααΎαααΆα 3 αααααααΆαα
ααΆα’αα»αα α§αααααααααΆαα PECL αα·αααΆαα αΆααααααΎαααΆαα½α ext-async ααα
α α»α SQL αα·α?
ααΌα
αααα’αααα’αΆα
ααΎααα
αααα»αααααα’ααααΆαααΆααα»αααααΆαααΆααα·ααΈααΆααααααααααααααΈα αα·α SQL ααΆαααααΆαααΆααα α»αα
Swoole
ααΆααααΈαααααααααΎαααααΎαα
ααα½αααααα’αααααΎααα coroutines ααΎαααααααααΆαα Swooleα
ααααααααααΉααααα 25α α
αΌαααΎααα·ααΆαα‘αΎααα·αααΌααααα·α
ααΌα
ααααΆααΆαα½αααΉαααααααααααα Async - α
ααα
αΆαααααα·ααααα·ααΆα 10,000 αααΆα 25 coroutinesα ααΎαααΈαααααα ααΎαααΉαααααααααΆαααΆααααααα½αααα αααααΎαααΉααααα
ααααΆαααΆαααΆααα’ααααΆ 2 ααααΎαααΆαααΈα (αααααΊααααΎαααΆαααΈαα½ααααΉαα’αα»αααα 5,000 ααααα·ααααα·ααΆααααα»α 25 coroutines)α ααααΎαααΆαααΉαααααΌαααΆααααααΎααααααααΎ ααααΎαααΆα Swoole.
ααααααα
Swole αααα αΆαααααααααΆαααΆαααααα·α
ααΎαααααααααα
ααΉα Async αα
αααααααΎαααΆααααα»αααααΎαααΆααα½α ααα»ααααααΆαα½αααΉαααααΎαααΆα 2 ααΌαααΆαααααΆααααααΌααααΆαααααΆαα (ααα 2 αα·αααααΌαααΆαααααΎαααΎααααα
ααααααα αα
ααΎαααΆαααΈααααααααα»α ααΆααΊααΆααααΎαααΆα 2 ααααααα αΆαααααααααα’αααα»α)α
ααααα·ααΈααα ααααααααααα Async ααααΆα API αααααΆααααααΎααΆαααΆαα½αααααΎαααΆαααααα ααα»αααααα ααΈααα αααα»ααα·αααΆαααααααααΆααααΈααΆααα»αααααΆααΆαα½αααΈααΆαααααΎαααΆαααααα αααα»αααααΎαααΆααα½α α¬α αααΎααα (ααΆα’αΆα αα αα½α αααααΆαααα»ααααααααααα ααααααααΆαα½α)α
SQL vs binary protocol:
ααΌα
ααΉα Async ααΆααα»αααααΆαααΆαααααα·ααααα·ααΆααααααΈα αα·α SQL ααααΌαααΆααα»αα
αααααα»αααααα’ααααΆαα
αααΆαααΆα‘αα
αααααΆαααααααααααα Parallel αα·αααααα·ααΆαα’αααΈ coroutines αα ααα»ααααα’αααΈ threads α αΌαααΆααα ααα½αααααα’αααααΎααα threads αααΆαααΆα‘ααα
ααΆααΊ 16 αα
ααΎαααΆαααΈααααααααα»αα αααααααΎαααΆαα
ααα»α
αααααΆααα§αααααααααΆαααα
ααΎ 16 αααααααΆαααΆα‘ααα
ααΌα
αααα’αααα’αΆα
ααΎαααΎα ααααααααΊαααααΎαααΆαααΆαα½αααΉααααααααααααα’ααααΆα (αα·αααΆαααααα
αΌα Swoole αααααααΎαααΆαααΎααααΎαααΆα 2)α α
αααΆαααΆαααααΆααα§αααααααααΆαα PECL ααααα·ααααα·ααΆαα’αΆααααα αα·αα’αΆαααααααΊαααα αααααΊαααααΆαααααΆααα·ααααααΆααααα·ααααα·ααΆαααΆαααααααΆααααΆαααααΆαα½αααΉαααα α»ααα½α - αααα»ααα·αααΉαααΆααΎααΆααΆααα α»ααα ext-parallel, ext-tarantool α¬ααΆααααΈαα
α₯α‘αΌαααΎαααααααααααΆαα’αα»αααα SQLα
ααααααααΆααααΆαααααααααααΆααΆαα½αααααΆα αααααααΆααα§αααααααααΆαααααααααΎαααΆααααα»ααααααααΆαααααΆ?
αα½αααααΆ
α αΎαα
α»αααααα ααΌαααααααααααααααΆααα’αααααα»αααααΆα αααα½α ααΎααααΈααΎαααΌαααΆααα½ααααααΆααααααααααααααααααΆαααΆαααααα ααΌαααααααααΆαααΆαααααααααΈαα½ααα
αααα»αααΆααΆααααααΎααα·αααΆααααΆαααααΎαα
α‘αΎα ααΎαααΉαααααΎαααΆα Async coroutines ααααααααΆαααααααΎ Parallel*α αααα·αααααΆααα½ααααα
αΌααααααααααααααΆαααΎααΊααΆααα½α
α αΎα
* ααΆαα·αα’αΆα αα αα½α αααααα»αααΆαααΎαααααΎαααΆα Swoole coroutines ααΆαα½α Parallel ααΆα αΆααααΌα ααΆααΆαααααααααααααΆααααααα·αααααααΆα
ααΌα ααααααααααα α»ααααααα
αααα½αα±ααααΆαααααα·ααααΆααα½α
ααΆααααα·ααααααααα»α ααααααααΆααααααα
ααΆααααα·αα α αΎααααααΆααα ααα»αααα½αα
ααα½ααααα»αααααΆααααΆααααα·ααααααΆαααααααααα! αα·αααΆα’αααααααΌαααΆαααΆααααααα
α
α·αααααααα
αααα»ααααααααα·αααααΆαααααααΆαααααααα½αα’ααααα αααα»αααΉααα·ααΆαααΆαααααΆαααααα»α ααΆααΆααΆααα·ααααααα½αα±ααα
αΆααα’αΆαααααααααα’αα»ααααΆαα±ααα’αααααΆααααααααΆααΎα’αααα’αΆα
"α
ααααΆα
α" α
ααααΈα§αααααααααΆαα TCP ααααααααΆααΆαα½αααΉαααΆααα·αααααααΉαααααααα·α
αα½α
αααα»αα ααααα·αααΎα’αααααΆααααα·ααααααΆααααΆααααααα’αααααααΆα αααα»αααΉαααΈαααΆααααα»αααΆααα·α
αΆαααΆααααΎαααΆαααααα’αααα αααααΌαααΆααα’αααααααΆαααΆαααααΆα αα·αααααααααααΌαααΆαααααα»ααααααα‘αα
ααααα: www.habr.com