เบเบฒเบ™เป€เบฅเบฑเปˆเบ‡เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PHP เบชเปเบฒเบฅเบฑเบš Tarantool เป‚เบ”เบเปƒเบŠเป‰ Async, Swoole เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ™

เบเบฒเบ™เป€เบฅเบฑเปˆเบ‡เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PHP เบชเปเบฒเบฅเบฑเบš Tarantool เป‚เบ”เบเปƒเบŠเป‰ Async, Swoole เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ™

เปƒเบ™เบฅเบฐเบšเบปเบšเบ™เบดเป€เบงเบ” PHP เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบกเบตเบชเบญเบ‡เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡ Tarantool - เบ™เบตเป‰เปเบกเปˆเบ™เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบ PECL เบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™ tarantool/tarantool-php, เบ‚เบฝเบ™เปƒเบ™ C, เปเบฅเบฐ tarantool-php/เบฅเบนเบเบ„เป‰เบฒ, เบ‚เบฝเบ™เปƒเบ™ PHP. เบ‚เป‰เบญเบเป€เบ›เบฑเบ™เบœเบนเป‰เบ‚เบฝเบ™เบ‚เบญเบ‡เบเบธเบเบชเบธเบ”เบ—เป‰เบฒเบ.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบขเบฒเบเปเบšเปˆเบ‡เบ›เบฑเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เบญเบ‡เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบ—เบฑเบ‡เบชเบญเบ‡เปเบฅเบฐเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบงเบดเบ—เบตเบเบฒเบ™, เบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบซเบ™เป‰เบญเบเบชเบธเบ”เบ‚เบญเบ‡เบฅเบฐเบซเบฑเบ”, เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบšเบฑเบ™เบฅเบธ 3-5 เบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™ (เปƒเบ™โ€‹เบเบฒเบ™โ€‹เบ—เบปเบ”โ€‹เบชเบญเบšโ€‹เบชเบฑเบ‡โ€‹เป€เบ„เบฒเบฐโ€‹!).

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ—เบปเบ”เบชเบญเบšเบซเบเบฑเบ‡?

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ—เบปเบ”เบชเบญเบšเบชเบดเปˆเบ‡เบ—เบตเปˆเบเปˆเบฒเบงเบกเบฒเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡ synchronous เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเปเบšเบšเบšเปเปˆเบŠเบดเป‰เบ‡เป‚เบ„เบ™, เบ‚เบฐเปœเบฒเบ™, เปเบฅเบฐเบ‚เบฐเปœเบฒเบ™เปเบšเบšเบšเปเปˆเบเบปเบ‡เบเบฑเบ™. ๐Ÿ™‚ เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบšเปเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™เปเบ•เบฐเบฅเบฐเบซเบฑเบ”เบ‚เบญเบ‡เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเป€เบญเบ‡. เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™เบกเบตเบซเบผเบฒเบเบชเปˆเบงเบ™เบ‚เบฐเบซเบเบฒเบเบ—เบตเปˆเบกเบตเบขเบนเปˆเป€เบžเบทเปˆเบญเบšเบฑเบ™เบฅเบธเบชเบดเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™:

  • เบšเบงเบก - เบเบญเบš asynchronous เบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบชเบนเบ‡เบชเปเบฒเบฅเบฑเบš PHP. เปƒเบŠเป‰เป‚เบ”เบเบเบฑเบเปƒเบซเบเปˆเบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”เป€เบŠเบฑเปˆเบ™ Alibaba เปเบฅเบฐ Baidu. เบ•เบฑเป‰เบ‡โ€‹เปเบ•เปˆโ€‹เบชเบฐโ€‹เบšเบฑเบš 4.1.0 เบงเบดโ€‹เบ—เบตโ€‹เบเบฒเบ™ magic เป„เบ”เป‰โ€‹เบ›เบฒโ€‹เบเบปเบ”โ€‹เบ‚เบถเป‰เบ™โ€‹ SwooleRuntime::enableCoroutine(), เป€เบŠเบดเปˆเบ‡เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ” "เบ›เปˆเบฝเบ™เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เป€เบ„เบทเบญเบ‚เปˆเบฒเบ PHP synchronous เบเบฑเบš asynchronous เบ—เบตเปˆเบกเบตเบฅเบฐเบซเบฑเบ”เบซเบ™เบถเปˆเบ‡เปเบ–เบง."
  • Async เปเบกเปˆเบ™เบˆเบปเบ™เบเปˆเบงเบฒเบšเปเปˆเบ”เบปเบ™เบกเบฒเบ™เบตเป‰เป€เบ›เบฑเบ™เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบ—เบตเปˆเบ”เบตเบซเบผเบฒเบเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบ asynchronous เปƒเบ™ PHP. เป€เบ›เบฑเบ™เบซเบเบฑเบ‡เบˆเบปเบ™เบเปˆเบงเบฒเบšเปเปˆเบ”เบปเบ™เบกเบฒเบ™เบตเป‰? เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบชเปเบฒเบฅเบฑเบšเป€เบซเบ”เบœเบปเบ™เบ—เบตเปˆเบ‚เป‰เบญเบเบšเปเปˆเบฎเบนเป‰, เบœเบนเป‰เบ‚เบฝเบ™เป„เบ”เป‰เบฅเบถเบš repository เปเบฅเบฐเบŠเบฐเบ•เบฒเบเปเบฒเปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”เบ‚เบญเบ‡เป‚เบ„เบ‡เบเบฒเบ™เปเบกเปˆเบ™เบšเปเปˆเบˆเบฐเปเบˆเป‰เบ‡. เบ‚เป‰เบญเบเบˆเบฐเบ•เป‰เบญเบ‡เปƒเบŠเป‰เบกเบฑเบ™ เป‚เบ”เบเบซเบ™เบถเปˆเบ‡ เบˆเบฒเบเบชเป‰เบญเบก. เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบš Swoole, เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบ™เบตเป‰เบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบ›เบตเบ”เบเบฒเบ‡เป€เบเบ‡เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป„เบ”เป‰เบขเปˆเบฒเบ‡เบ‡เปˆเบฒเบเบ”เบฒเบเบ”เป‰เบงเบเบเบฒเบ™ flick เบ‚เบญเบ‡ wrist เป€เบžเบทเปˆเบญเป€เบฎเบฑเบ”เปƒเบซเป‰ asynchrony เป‚เบ”เบเบเบฒเบ™เบ—เบปเบ”เปเบ—เบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ‚เบญเบ‡ TCP เปเบฅเบฐ TLS streams เบเบฑเบšเบชเบฐเบšเบฑเบš asynchronous เบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒ. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบฎเบฑเบ”เป„เบ”เป‰เป‚เบ”เบเบœเปˆเบฒเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบ "async.tcp = 1"
  • เบ‚เบฐเบซเบ™เบฒเบ™ - เป€เบ›เบฑเบ™เบชเปˆเบงเบ™เบ‚เบฐเบซเบเบฒเบเบ—เบตเปˆเบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เปƒเบซเบกเปˆเบˆเบฒเบ Joe Watkins เบ—เบตเปˆเบกเบตเบŠเบทเปˆเบชเบฝเบ‡, เบœเบนเป‰เบ‚เบฝเบ™เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เป€เบŠเบฑเปˆเบ™ phpdbg, apcu, pthreads, pcov, uopz. เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบชเบฐเบซเบ™เบญเบ‡ API เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™ multithreading เปƒเบ™ PHP เปเบฅเบฐเบ–เบทเบเบˆเบฑเบ”เบ•เปเบฒเปเบซเบ™เปˆเบ‡เป€เบ›เบฑเบ™เบเบฒเบ™เบ—เบปเบ”เปเบ—เบ™เบชเปเบฒเบฅเบฑเบš pthreads. เบ‚เปเป‰เบˆเปเบฒเบเบฑเบ”เบ—เบตเปˆเบชเปเบฒเบ„เบฑเบ™เบ‚เบญเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เปเบกเปˆเบ™เบงเปˆเบฒเบกเบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš ZTS (Zend Thread Safe) เบชเบฐเบšเบฑเบšเบ‚เบญเบ‡ PHP.

เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ—เบปเบ”เบชเบญเบšเปเบ™เบงเปƒเบ”?

เปƒเบซเป‰เป€เบ›เบตเบ”เบ•เบปเบงเบขเปˆเบฒเบ‡ Tarantool เบ”เป‰เบงเบเบเบฒเบ™เบ›เบดเบ”เบšเบฑเบ™เบ—เบถเบเบเบฒเบ™เบ‚เบฝเบ™เบฅเปˆเบงเบ‡เปœเป‰เบฒ (wal_mode = เบšเปเปˆเบกเบต) เปเบฅเบฐโ€‹เบเบฒเบ™โ€‹เป€เบžเบตเปˆเบกโ€‹เบ‚เบถเป‰เบ™โ€‹เบ‚เบญเบ‡โ€‹เป€เบ„เบทเบญโ€‹เบ‚เปˆเบฒเบ buffer (readahead = 1 * 1024 * 1024). เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เปเบฒเบญเบดเบ”เบˆเบฐเบฅเบปเบšเบฅเป‰เบฒเบ‡เบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเปเบœเปˆเบ™, เบ—เบตเบชเบญเบ‡เบˆเบฐเป€เบฎเบฑเบ”เปƒเบซเป‰เบชเบฒเบกเบฒเบ”เบญเปˆเบฒเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบˆเบฒเบ buffer เบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เปเบฅเบฐเบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™เบˆเบถเปˆเบ‡เบซเบผเบธเบ”เบœเปˆเบญเบ™เบˆเปเบฒเบ™เบงเบ™เบเบฒเบ™เป‚เบ—เบ‚เบญเบ‡เบฅเบฐเบšเบปเบš.

เบชเปเบฒเบฅเบฑเบš benchmarks เบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ‚เปเป‰เบกเบนเบ™ (เบเบฒเบ™เปเบŠเบ, เบเบฒเบ™เบฅเบถเบš, เบเบฒเบ™เบญเปˆเบฒเบ™, เปเบฅเบฐเบญเบทเปˆเบ™เป†), เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ 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}})

เบ–เป‰เบฒเบˆเปเบฒเป€เบ›เบฑเบ™, เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ benchmark, เบŠเปˆเบญเบ‡เปเบกเปˆเบ™เป€เบ•เบฑเบกเป„เบ›เบ”เป‰เบงเบ 10,000 tuples เบ‚เบญเบ‡เปเบšเบšเบŸเบญเบก.

{id, "tuplะต_<id>"}

Tuples เปเบกเปˆเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡เป‚เบ”เบเปƒเบŠเป‰เบ„เปˆเบฒเบฅเบฐเบซเบฑเบ”เบชเบธเปˆเบก.

benchmark เบ•เบปเบงเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เปเบกเปˆเบ™เบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบ”เบฝเบงเบเบฑเบšเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ, เป€เบŠเบดเปˆเบ‡เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ” 10,000 เป€เบ—เบทเปˆเบญ (เบเบฒเบ™เบ›เบฐเบ•เบดเบงเบฑเบ”), เป€เบŠเบดเปˆเบ‡, เปƒเบ™เบ—เบฒเบ‡เบเบฑเบšเบเบฑเบ™, เบ–เบทเบเบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™ iterations. เบเบฒเบ™เบŠเปเป‰เบฒเบ„เบทเบ™เบˆเบฐเบ–เบทเบเป€เบฎเบฑเบ”เบŠเป‰เบณเบˆเบปเบ™เบเปˆเบงเบฒเบเบฒเบ™เบšเปˆเบฝเบ‡เป€เบšเบ™เบ‚เบญเบ‡เป€เบงเบฅเบฒเบ—เบฑเบ‡เปเบปเบ”เบฅเบฐเบซเบงเปˆเบฒเบ‡ 5 เบเบฒเบ™เบŠเปเป‰เบฒเบ„เบทเบ™เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”เบ—เบตเปˆเบเบญเบกเบฎเบฑเบšเป„เบ”เป‰เบ‚เบญเบ‡ 3%*. เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบตเป‰, เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบชเบฐเป€เบฅเปˆเบเปเบกเปˆเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”. เบกเบตเบเบฒเบ™เบขเบธเบ”เบŠเบปเปˆเบงเบ„เบฒเบง 1 เบงเบดเบ™เบฒเบ—เบตเบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบŠเปเป‰เบฒเบ„เบทเบ™เป€เบžเบทเปˆเบญเบ›เป‰เบญเบ‡เบเบฑเบ™เบšเปเปˆเปƒเบซเป‰เป‚เบ›เบฃเป€เบŠเบ”เป€เบŠเบตเบˆเบฒเบเบเบฒเบ™เบ›เบดเบ”เบฅเป‰เบญเบก. เบœเบนเป‰เป€เบเบฑเบšเบ‚เบตเป‰เป€เบซเบเบทเป‰เบญเบ‚เบญเบ‡ Lua เปเบกเปˆเบ™เบžเบดเบเบฒเบ™เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเป€เบฎเบฑเบ”เบŠเป‰เปเบฒเบญเบตเบเบ„เบฑเป‰เบ‡เปเบฅเบฐเบ–เบทเบเบšเบฑเบ‡เบ„เบฑเบšเปƒเบซเป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบซเบผเบฑเบ‡เบˆเบฒเบเบกเบฑเบ™เบชเปเบฒเป€เบฅเบฑเบ”. เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ PHP เบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบงเบžเบฝเบ‡เปเบ•เปˆเบกเบตเบชเปˆเบงเบ™เบ‚เบฐเบซเบเบฒเบเบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™เบชเปเบฒเบฅเบฑเบš benchmark, เบ”เป‰เบงเบเบเบฒเบ™เบ›เบดเบ”เบเบฒเบ™เป‚เบซเบผเบ”เบœเบปเบ™เบœเบฐเบฅเบดเบ”เปเบฅเบฐเป€เบ„เบทเปˆเบญเบ‡เป€เบเบฑเบšเบ‚เบตเป‰เป€เบซเบเบทเป‰เบญเบ–เบทเบเบ›เบดเบ”.

* เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ‚เบญเบ‡โ€‹เบเบฒเบ™โ€‹เบ›เบฐโ€‹เบ•เบดโ€‹เบงเบฑเบ”โ€‹, iterations เปเบฅเบฐโ€‹เบฅเบฐโ€‹เบ”เบฑเบšโ€‹เบ„เบงเบฒเบกโ€‹เบœเบดเบ”โ€‹เบžเบฒเบ”โ€‹เบชเบฒโ€‹เบกเบฒเบ”โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เบเบฒเบ™โ€‹เบ›เปˆเบฝเบ™โ€‹เปเบ›เบ‡โ€‹เปƒเบ™โ€‹เบเบฒเบ™โ€‹เบ•เบฑเป‰เบ‡โ€‹เบ„เปˆเบฒโ€‹เบกเบฒเบ”โ€‹เบ•เบฐโ€‹เบ–เบฒเบ™โ€‹.

เบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบเบฒเบ™เบ—เบปเบ”เบชเบญเบš

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบˆเบฑเบ”เบžเบตเบกเบกเบฒเบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰เปเบกเปˆเบ™เป€เบฎเบฑเบ”เบขเบนเปˆเปƒเบ™ MacBookPro (2015), เบฅเบฐเบšเบปเบšเบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™ - Fedora 30 (kernel version 5.3.8-200.fc30.x86_64). Tarantool เบ–เบทเบเป€เบ›เบตเบ”เบ•เบปเบงเปƒเบ™ docker เบเบฑเบšเบžเบฒเบฅเบฒเบกเบดเป€เบ•เบต "--network host".

เบฅเบธเป‰เบ™เปเบžเบฑเบเป€เบเบ”:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, build 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 เบชเปเบฒเบฅเบฑเบš 7.3)*
ext-msgpack: 2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
ext-parallel: 1.1.3

* เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™เบšเปเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš PHP เบฎเบธเปˆเบ™> 7.2. เป€เบžเบทเปˆเบญเบฅเบงเบšเบฅเบงเบกเปเบฅเบฐเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบขเบนเปˆเปƒเบ™ PHP 7.3, เบ‚เป‰เบญเบเบ•เป‰เบญเบ‡เปƒเบŠเป‰ เป€เบžเบตเป‰เบก.

ะ ะตะทัƒะปัŒั‚ะฐั‚ั‹

เป‚เปเบ” synchronous

เป‚เบ›เป‚เบ•เบ„เบญเบ™ Tarantool เปƒเบŠเป‰เบฎเบนเบšเปเบšเบšเบ–เบฒเบ™เบชเบญเบ‡ MessagePack เป€เบžเบทเปˆเบญ serialize เบ‚เปเป‰เบ„เบงเบฒเบก. เปƒเบ™เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PECL, serialization เบ–เบทเบเป€เบŠเบทเปˆเบญเบ‡เป„เบงเป‰เปƒเบ™เบ„เบงเบฒเบกเป€เบฅเบดเบเบ‚เบญเบ‡เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เปเบฅเบฐเบœเบปเบ™เบเบฐเบ—เบปเบšเบ•เปเปˆเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบˆเบฒเบเบฅเบฐเบซเบฑเบ” userland. เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰. เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PHP เบšเปเบฅเบดเบชเบธเบ”, เปƒเบ™เบ—เบฒเบ‡เบเบปเบ‡เบเบฑเบ™เบ‚เป‰เบฒเบก, เบชเบฐเบซเบ™เบญเบ‡เบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบ›เบฑเบšเปเบ•เปˆเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เป‚เบ”เบเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบ•เบปเบงเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบซเบผเบทเป‚เบ”เบเบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡เบ—เปˆเบฒเบ™เป€เบญเบ‡. เบกเบตเบชเบญเบ‡เบ•เบปเบงเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบ—เบตเปˆเบกเบตเบขเบนเปˆเบญเบญเบเบˆเบฒเบเบเปˆเบญเบ‡, เบซเบ™เบถเปˆเบ‡เปเบกเปˆเบ™เบญเบตเบ‡เปƒเบชเปˆ msgpack/msgpack-php (เบชเปˆเบงเบ™เบ‚เบฐเบซเบเบฒเบ MessagePack PECL เบ—เบตเปˆเป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™), เบญเบฑเบ™เบญเบทเปˆเบ™เปเบกเปˆเบ™เป€เบ›เบตเบ”เบขเบนเปˆ rybakit/msgpack (เปƒเบ™ PHP เบšเปเบฅเบดเบชเบธเบ”).

เบเปˆเบญเบ™เบ—เบตเปˆเบˆเบฐเบ›เบฝเบšเบ—เบฝเบšเบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบงเบฑเบ”เปเบ—เบเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ‚เบญเบ‡เบ•เบปเบงเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ” MessagePack เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PHP เปเบฅเบฐเปƒเบ™เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบ•เปเปˆเป„เบ›เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเบ™เปเบฒเปƒเบŠเป‰เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”:

เบเบฒเบ™เป€เบฅเบฑเปˆเบ‡เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PHP เบชเปเบฒเบฅเบฑเบš Tarantool เป‚เบ”เบเปƒเบŠเป‰ Async, Swoole เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ™
เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบชเบฐเบšเบฑเบš PHP (Pure) เบ•เปˆเปเบฒเบเบงเปˆเบฒเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบ PECL เปƒเบ™เบ„เบงเบฒเบกเป„เบง, เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ•เบปเบงเบˆเบดเบ‡เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบเบฑเบ‡เปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เปƒเบŠเป‰เบกเบฑเบ™. rybakit/msgpack, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเปƒเบ™เบ™เบฒเบกเบชเบฐเบเบธเบ™ MessagePack เบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™, เบเบฒเบ™เบเปเบฒเบ™เบปเบ”เบฎเบนเบšเปเบšเบšเปเบกเปˆเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบšเบฒเบ‡เบชเปˆเบงเบ™เป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™ (เบ•เบปเบงเบขเปˆเบฒเบ‡, เบšเปเปˆเบกเบตเบเบฒเบ™เบฎเบญเบ‡เบฎเบฑเบšเบ›เบฐเป€เบžเบ”เบ‚เปเป‰เบกเบนเบ™เปเบšเบšเบเปเบฒเบ™เบปเบ”เป€เบญเบ‡, เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ—เบตเปˆเบ—เปˆเบฒเบ™เบˆเบฐเบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰ Decimal - เบ›เบฐเป€เบžเบ”เบ‚เปเป‰เบกเบนเบ™เปƒเบซเบกเปˆเบ—เบตเปˆเบ™เปเบฒเบชเบฐเป€เบซเบ™เบตเปƒเบ™ Tarantool 2.3) เปเบฅเบฐเบกเบต. เบˆเปเบฒโ€‹เบ™เบงเบ™โ€‹เบ‚เบญเบ‡โ€‹เบ„เบปเบ™โ€‹เบญเบทเปˆเบ™โ€‹ เบšเบฑเบ™เบซเบฒ (เบฅเบงเบกเบ—เบฑเบ‡เบšเบฑเบ™เบซเบฒเบ„เบงเบฒเบกเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰เบเบฑเบš PHP 7.4). เบ”เบต, เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›, เป‚เบ„เบ‡เบเบฒเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ–เบทเบเบ›เบฐเบ–เบดเป‰เบกเป„เบงเป‰.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เปƒเบซเป‰เบงเบฑเบ”เปเบ—เบเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบ‚เบญเบ‡เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปƒเบ™เบฎเบนเบšเปเบšเบš synchronous:

เบเบฒเบ™เป€เบฅเบฑเปˆเบ‡เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PHP เบชเปเบฒเบฅเบฑเบš Tarantool เป‚เบ”เบเปƒเบŠเป‰ Async, Swoole เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ™
เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบซเบฑเบ™เป„เบ”เป‰เบˆเบฒเบเบเบฒเบŸ, เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PECL (Tarantool) เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบ”เบตเบเบงเปˆเบฒเป€เบกเบทเปˆเบญเบ—เบฝเบšเบเบฑเบšเบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PHP (เบฅเบนเบเบ„เป‰เบฒ). เปเบ•เปˆเบ™เบตเป‰เบšเปเปˆเปเบ›เบเปƒเบˆ, เป€เบžเบฒเบฐเบงเปˆเบฒเบญเบฑเบ™เบชเบธเบ”เบ—เป‰เบฒเบ, เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เปƒเบ™เบžเบฒเบชเบฒเบ—เบตเปˆเบŠเป‰เบฒเบฅเบปเบ‡, เบ•เบปเบงเบˆเบดเบ‡เปเบฅเป‰เบงเบเบฑเบ‡เป€เบฎเบฑเบ”เบงเบฝเบเบซเบผเบฒเบเบ‚เบถเป‰เบ™: เบงเบฑเบ”เบ–เบธเปƒเบซเบกเปˆเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เบเบฑเบšเปเบ•เปˆเบฅเบฐเบเบฒเบ™เป‚เบ—. เบเบฒเบ™เบฎเป‰เบญเบ‡เบ‚เป ะธ เบเบฒเบ™เบ•เบญเบšเบชเบฐเบซเบ™เบญเบ‡ (เปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡ Select - เบเบฑเบ‡ Criteria, เปเบฅเบฐเปƒเบ™เบเปเบฅเบฐเบ™เบตเบ‚เบญเบ‡เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡ / Upsert - เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™), เบซเบ™เปˆเบงเบเบ‡เบฒเบ™เปเบเบเบ•เปˆเบฒเบ‡เบซเบฒเบ เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ, Packer ะธ Handler เบžเบงเบเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเบเบฑเบ‡เป€เบžเบตเปˆเบก overhead. เปเบ™เปˆเบ™เบญเบ™, เบ„เบงเบฒเบกเบเบทเบ”เบซเบเบธเปˆเบ™เบกเบฒเปƒเบ™เบฅเบฒเบ„เบฒ. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเปˆเบ•เบฒเบก, เป‚เบ”เบเบ—เบปเปˆเบงเป„เบ›เปเบฅเป‰เบง, เบ™เบฒเบเบžเบฒเบชเบฒ PHP เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เป€เบ–เบดเบ‡เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ—เบตเปˆเบ”เบต, เป€เบ–เบดเบ‡เปเบกเปˆเบ™เบงเปˆเบฒเบกเบตเบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบเบฑเบ™, เบกเบฑเบ™เบšเปเปˆเบชเปเบฒเบ„เบฑเบ™เปเบฅเบฐเบšเบฒเบ‡เบ—เบตเบญเบฒเบ”เบกเบตเบซเบ™เป‰เบญเบเบฅเบปเบ‡เป€เบกเบทเปˆเบญเปƒเบŠเป‰ preloading เปƒเบ™ PHP 7.4, เบšเปเปˆเป„เบ”เป‰เบเปˆเบฒเบงเป€เบ–เบดเบ‡ JIT เปƒเบ™ PHP 8.

เปƒเบซเป‰เบเป‰เบฒเบงเบ•เปเปˆเป„เบ›. Tarantool 2.0 เป€เบžเบตเปˆเบกเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบชเปเบฒเบฅเบฑเบš SQL. เปƒเบซเป‰เบžเบฐเบเบฒเบเบฒเบกเบ›เบฐเบ•เบดเบšเบฑเบ” Select, Insert, Update เปเบฅเบฐDelete เป‚เบ”เบเปƒเบŠเป‰เป‚เบ›เบฃเป‚เบ•เบ„เป SQL เปเบฅเบฐเบ›เบฝเบšเบ—เบฝเบšเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบเบฑเบš noSQL (binary) เบ—เบฝเบšเป€เบ—เบปเปˆเบฒ:

เบเบฒเบ™เป€เบฅเบฑเปˆเบ‡เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PHP เบชเปเบฒเบฅเบฑเบš Tarantool เป‚เบ”เบเปƒเบŠเป‰ Async, Swoole เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ™
เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš SQL เปเบกเปˆเบ™เบšเปเปˆเบ›เบฐเบ—เบฑเบšเปƒเบˆเบซเบผเบฒเบ (เปƒเบซเป‰เบ‚เป‰เบญเบเป€เบ•เบทเบญเบ™เป€เบˆเบปเป‰เบฒเบงเปˆเบฒเบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบ—เบปเบ”เบชเบญเบšเป‚เบซเบกเบ” synchronous). เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบˆเบฐเบšเปเปˆเบฎเบนเป‰เบชเบถเบเป€เบชเบเปƒเบˆเบเบฑเบšเป€เบฅเบทเปˆเบญเบ‡เบ™เบตเป‰เบเปˆเบญเบ™เป€เบงเบฅเบฒ; เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ SQL เบเบฑเบ‡เบขเบนเปˆเบžเบฒเบเปƒเบ•เป‰เบเบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบขเปˆเบฒเบ‡เบซเป‰เบฒเบงเบซเบฑเบ™ (เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบšเปเปˆเบ”เบปเบ™เบกเบฒเบ™เบตเป‰, เบ•เบปเบงเบขเปˆเบฒเบ‡, เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เป„เบ”เป‰เบ–เบทเบเป€เบžเบตเปˆเบก. เบ–เบฐเปเบซเบผเบ‡เบเบฒเบ™เบ—เบตเปˆเบเบฐเบเบฝเบก) เปเบฅเบฐ, เบ•เบฑเบ”เบชเบดเบ™เป‚เบ”เบเบšเบฑเบ™เบŠเบตเบฅเบฒเบเบŠเบทเปˆ เบšเบฑเบ™เบซเบฒ, เป€เบ„เบทเปˆเบญเบ‡เบˆเบฑเบ SQL เบˆเบฐเบœเปˆเบฒเบ™เบเบฒเบ™เป€เบžเบตเปˆเบกเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบˆเปเบฒเบ™เบงเบ™เบซเบ™เบถเปˆเบ‡เปƒเบ™เบญเบฐเบ™เบฒเบ„เบปเบ”.

เบšเปเปˆเบเบปเบ‡เบเบฑเบ™

เปเบฅเป‰เบง, เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เป€เบšเบดเปˆเบ‡เบงเบดเบ—เบตเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบ Async เบชเบฒเบกเบฒเบ”เบŠเปˆเบงเบเบžเบงเบเป€เบฎเบปเบฒเบ›เบฑเบšเบ›เบธเบ‡เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡. เป€เบžเบทเปˆเบญเบ‚เบฝเบ™เป‚เบ›เบผเปเบเบผเบก asynchronous, เบชเปˆเบงเบ™เบ‚เบฐเบซเบเบฒเบเปƒเบซเป‰ API เป‚เบ”เบเบญเบตเบ‡เปƒเบชเปˆ coroutines, เป€เบŠเบดเปˆเบ‡เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปƒเบŠเป‰. เบžเบงเบเป€เบฎเบปเบฒเบ„เบปเป‰เบ™เบžเบปเบšเบงเปˆเบฒเบˆเปเบฒเบ™เบงเบ™ coroutines เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เบชเปเบฒเบฅเบฑเบšเบชเบฐเบžเบฒเบšเปเบงเบ”เบฅเป‰เบญเบกเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปเบกเปˆเบ™ 25:

เบเบฒเบ™เป€เบฅเบฑเปˆเบ‡เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PHP เบชเปเบฒเบฅเบฑเบš Tarantool เป‚เบ”เบเปƒเบŠเป‰ Async, Swoole เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ™
"เปเบœเปˆ" 10,000 เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เปƒเบ™เบ—เบปเปˆเบง 25 coroutines เปเบฅเบฐเป€เบšเบดเปˆเบ‡เบชเบดเปˆเบ‡เบ—เบตเปˆเป€เบเบตเบ”เบ‚เบถเป‰เบ™:

เบเบฒเบ™เป€เบฅเบฑเปˆเบ‡เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PHP เบชเปเบฒเบฅเบฑเบš Tarantool เป‚เบ”เบเปƒเบŠเป‰ Async, Swoole เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ™
เบˆเปเบฒเบ™เบงเบ™เบ‚เบญเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบ•เปเปˆเบงเบดเบ™เบฒเบ—เบตเป€เบžเบตเปˆเบกเบ‚เบถเป‰เบ™เบซเบผเบฒเบเบเปˆเบงเบฒ 3 เป€เบ—เบทเปˆเบญเบชเปเบฒเบฅเบฑเบš tarantool-php/เบฅเบนเบเบ„เป‰เบฒ!

เปเบ•เปˆเบซเบ™เป‰เบฒเป€เบชเบเบ”เบฒเบ, เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PECL เบšเปเปˆเป„เบ”เป‰เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบ”เป‰เบงเบ ext-async.

SQL เปเบกเปˆเบ™เบซเบเบฑเบ‡?

เบเบฒเบ™เป€เบฅเบฑเปˆเบ‡เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PHP เบชเปเบฒเบฅเบฑเบš Tarantool เป‚เบ”เบเปƒเบŠเป‰ Async, Swoole เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ™
เบ”เบฑเปˆเบ‡เบ—เบตเปˆเป€เบˆเบปเป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบซเบฑเบ™เป„เบ”เป‰, เปƒเบ™เบฎเบนเบšเปเบšเบš asynchronous เบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบฅเบฐเบซเบงเปˆเบฒเบ‡ binary protocol เปเบฅเบฐ SQL เป„เบ”เป‰เบเบฒเบเป€เบ›เบฑเบ™เบขเบนเปˆเปƒเบ™เบ‚เบญเบšเบ‚เบญเบ‡เบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ”.

เบšเบงเบก

เบญเบตเบเป€เบ—เบทเปˆเบญเบซเบ™เบถเปˆเบ‡เบžเบงเบเป€เบฎเบปเบฒเบŠเบญเบเบซเบฒเบˆเปเบฒเบ™เบงเบ™เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡ coroutines, เป€เบงเบฅเบฒเบ™เบตเป‰เบชเปเบฒเบฅเบฑเบš Swoole:
เบเบฒเบ™เป€เบฅเบฑเปˆเบ‡เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PHP เบชเปเบฒเบฅเบฑเบš Tarantool เป‚เบ”เบเปƒเบŠเป‰ Async, Swoole เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ™
เปƒเบซเป‰เบขเบธเบ”เป€เบŠเบปเบฒเบขเบนเปˆเบ—เบตเปˆ 25. เปƒเบซเป‰เป€เบฎเบฑเบ”เบŠเป‰เปเบฒเบญเบตเบ trick เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบชเปˆเบงเบ™เบ‚เบฐเบซเบเบฒเบ Async - เปเบˆเบเบขเบฒเบ 10,000 เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบฅเบฐเบซเบงเปˆเบฒเบ‡ 25 coroutines. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเป€เบžเบตเปˆเบกเบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบญเบตเบเบญเบฑเบ™เบซเบ™เบถเปˆเบ‡เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบˆเบฐเปเบšเปˆเบ‡เบงเบฝเบเบ—เบฑเบ‡เบซเบกเบปเบ”เบญเบญเบเป€เบ›เบฑเบ™ 2 เบชเบญเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ (เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เปเบ•เปˆเบฅเบฐเบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบˆเบฐเบ›เบฐเบ•เบดเบšเบฑเบ” 5,000 เปƒเบ™ 25 coroutines). เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบˆเบฐเบ–เบทเบเบชเป‰เบฒเบ‡เบ‚เบทเป‰เบ™เป‚เบ”เบเปƒเบŠเป‰ เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ Swoole.

เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบš:

เบเบฒเบ™เป€เบฅเบฑเปˆเบ‡เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PHP เบชเปเบฒเบฅเบฑเบš Tarantool เป‚เบ”เบเปƒเบŠเป‰ Async, Swoole เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ™
Swole เบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ•เปˆเปเบฒเป€เบฅเบฑเบเบ™เป‰เบญเบเป€เบกเบทเปˆเบญเบ—เบฝเบšเบเบฑเบš Async เป€เบกเบทเปˆเบญเบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™เปƒเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบฐเบšเบงเบ™เบเบฒเบ™, เปเบ•เปˆเบกเบต 2 เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบฎเบนเบšเบžเบฒเบšเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบขเปˆเบฒเบ‡เบซเบผเบงเบ‡เบซเบผเบฒเบ (เบˆเปเบฒเบ™เบงเบ™ 2 เบšเปเปˆเป„เบ”เป‰เบ–เบทเบเป€เบฅเบทเบญเบเป‚เบ”เบเบšเบฑเบ‡เป€เบญเบตเบ™; เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบกเบฑเบ™เปเบกเปˆเบ™ 2 เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบ—เบตเปˆเบชเบฐเปเบ”เบ‡เปƒเบซเป‰เป€เบซเบฑเบ™เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”).

เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบ Async เบเบฑเบ‡เบกเบต API เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเบ‚เบฐเบšเบงเบ™เบเบฒเบ™, เปเบ•เปˆเบขเบนเปˆเบ—เบตเปˆเบ™เบฑเป‰เบ™เบ‚เป‰เบญเบเบšเปเปˆเป„เบ”เป‰เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เปƒเบ”เป†เบˆเบฒเบเบเบฒเบ™เปเบฅเปˆเบ™เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เปƒเบ™เบ‚เบฐเบšเบงเบ™เบเบฒเบ™เบซเบ™เบถเปˆเบ‡เบซเบผเบทเบซเบผเบฒเบ (เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เป„เบ”เป‰เบงเปˆเบฒเบ‚เป‰เบญเบเบชเบฑเบšเบชเบปเบ™เบขเบนเปˆเบšเปˆเบญเบ™เปƒเบ”เบšเปˆเบญเบ™เบซเบ™เบถเปˆเบ‡).

SQL vs binary protocol:

เบเบฒเบ™เป€เบฅเบฑเปˆเบ‡เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PHP เบชเปเบฒเบฅเบฑเบš Tarantool เป‚เบ”เบเปƒเบŠเป‰ Async, Swoole เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ™
เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบš Async, เบ„เบงเบฒเบกเปเบ•เบเบ•เปˆเบฒเบ‡เบฅเบฐเบซเบงเปˆเบฒเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™ binary เปเบฅเบฐ SQL เบ–เบทเบเบฅเบปเบšเบฅเป‰เบฒเบ‡เปƒเบ™เบฎเบนเบšเปเบšเบš asynchronous.

เบ‚เบฐเบซเบ™เบฒเบ™

เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบ‚เบฐเบซเบ™เบฒเบ™เบšเปเปˆเปเบกเปˆเบ™เบเปˆเบฝเบงเบเบฑเบš coroutines, เปเบ•เปˆเบเปˆเบฝเบงเบเบฑเบšเบเบฐเบ—เบนเป‰, เปƒเบซเป‰เบžเบงเบเป€เบฎเบปเบฒเบงเบฑเบ”เปเบ—เบเบˆเปเบฒเบ™เบงเบ™เบ—เบตเปˆเบ”เบตเบ—เบตเปˆเบชเบธเบ”เบ‚เบญเบ‡เบเบฐเบ—เบนเป‰เบ‚เบฐเบซเบ™เบฒเบ™:

เบเบฒเบ™เป€เบฅเบฑเปˆเบ‡เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PHP เบชเปเบฒเบฅเบฑเบš Tarantool เป‚เบ”เบเปƒเบŠเป‰ Async, Swoole เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ™
เบกเบฑเบ™เป€เบ—เบปเปˆเบฒเบเบฑเบš 16 เปƒเบ™เป€เบ„เบทเปˆเบญเบ‡เบ‚เบญเบ‡เบ‚เป‰เบญเบ. เบกเบฒเปƒเบŠเป‰เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเปƒเบ™ 16 เบเบฐเบ—เบนเป‰เบ‚เบฐเปœเบฒเบ™เบเบฑเบ™:

เบเบฒเบ™เป€เบฅเบฑเปˆเบ‡เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PHP เบชเปเบฒเบฅเบฑเบš Tarantool เป‚เบ”เบเปƒเบŠเป‰ Async, Swoole เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ™
เบ”เบฑเปˆเบ‡เบ—เบตเปˆเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เป€เบšเบดเปˆเบ‡เป€เบซเบฑเบ™เป„เบ”เป‰, เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปเบกเปˆเบ™เบ”เบตเบเปˆเบงเบฒเบเบฑเบšเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบ asynchronous (เบšเปเปˆเบ™เบฑเบš Swoole เปเบฅเปˆเบ™เบขเบนเปˆเปƒเบ™ 2 เบ‚เบฐเบšเบงเบ™เบเบฒเบ™). เปƒเบซเป‰เบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PECL, เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™เบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เปเบฅเบฐ Upsert เปเบกเปˆเบ™เบซเบงเปˆเบฒเบ‡เป€เบ›เบปเปˆเบฒ. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบ™เบทเปˆเบญเบ‡เบกเบฒเบˆเบฒเบเบ„เบงเบฒเบกเบˆเบดเบ‡เบ—เบตเปˆเบงเปˆเบฒเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‡เบฒเบ™เป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบฅเบปเป‰เบกเป€เบซเบฅเบงเบเบฑเบšเบ„เบงเบฒเบกเบœเบดเบ”เบžเบฒเบ” - เบ‚เป‰เบญเบเบšเปเปˆเบฎเบนเป‰เบงเปˆเบฒเบกเบฑเบ™เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบœเบดเบ”เบ‚เบญเบ‡ ext-parallel, ext-tarantool, เบซเบผเบทเบ—เบฑเบ‡เบชเบญเบ‡.

เบ•เบญเบ™เบ™เบตเป‰เปƒเบซเป‰เบ›เบฝเบšเบ—เบฝเบšเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ” SQL:

เบเบฒเบ™เป€เบฅเบฑเปˆเบ‡เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PHP เบชเปเบฒเบฅเบฑเบš Tarantool เป‚เบ”เบเปƒเบŠเป‰ Async, Swoole เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ™
เบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบ„เบงเบฒเบกเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบšเบเบฒเบŸเบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบ synchronously?

เบฎเปˆเบงเบกเบเบฑเบ™

เปเบฅเบฐเบชเบธเบ”เบ—เป‰เบฒเบ, เปƒเบซเป‰เบชเบฐเบซเบผเบธเบšเบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ—เบฑเบ‡เบซเบกเบปเบ”เปƒเบ™เบซเบ™เบถเปˆเบ‡เบเบฒเบŸเป€เบžเบทเปˆเบญเป€เบšเบดเปˆเบ‡เบžเบฒเบšเบฅเบงเบกเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบ—เบตเปˆเบ—เบปเบ”เบชเบญเบš. เปƒเบซเป‰เป€เบžเบตเปˆเบกเบžเบฝเบ‡เปเบ•เปˆเบซเบ™เบถเปˆเบ‡เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเปƒเบซเบกเปˆเปƒเบ™เบ•เบฒเบ•เบฐเบฅเบฒเบ‡, เป€เบŠเบดเปˆเบ‡เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เบšเปเปˆเป„เบ”เป‰เป€เบฎเบฑเบ”เป€เบ—เบทเปˆเบญ - เปƒเบซเป‰เบ”เปเบฒเป€เบ™เบตเบ™เบเบฒเบ™ Async coroutines เปƒเบ™เบ‚เบฐเบซเบ™เบฒเบ™เป‚เบ”เบเปƒเบŠเป‰ Parallel *. เปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡เบเบฒเบ™เบ›เบฐเบชเบปเบกเบ›เบฐเบชเบฒเบ™เบเบฒเบ™เบ‚เบฐเบซเบเบฒเบเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡เปเบกเปˆเบ™เปเบฅเป‰เบง เป„เบ”เป‰เบ–เบทเบเบ›เบถเบเบชเบฒเบซเบฒเบฅเบท เบœเบนเป‰เบ‚เบฝเบ™, เปเบ•เปˆเบšเปเปˆเบกเบตเบเบฒเบ™เบ•เบปเบเบฅเบปเบ‡เป€เบซเบฑเบ™เบ”เบต, เบ—เปˆเบฒเบ™เบˆเบฐเบ•เป‰เบญเบ‡เป€เบฎเบฑเบ”เบกเบฑเบ™เป€เบญเบ‡.

* เบกเบฑเบ™เป€เบ›เบฑเบ™เป„เบ›เบšเปเปˆเป„เบ”เป‰เบ—เบตเปˆเบˆเบฐเป€เบ›เบตเบ” Swoole coroutines เบเบฑเบš Parallel; เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบชเปˆเบงเบ™เบ‚เบฐเบซเบเบฒเบเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบšเปเปˆเป€เบ‚เบปเป‰เบฒเบเบฑเบ™เป„เบ”เป‰.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบชเบธเบ”เบ—เป‰เบฒเบ:

เบเบฒเบ™เป€เบฅเบฑเปˆเบ‡เบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ PHP เบชเปเบฒเบฅเบฑเบš Tarantool เป‚เบ”เบเปƒเบŠเป‰ Async, Swoole เปเบฅเบฐเบ‚เบฐเบซเบ™เบฒเบ™

เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™เบเบฒเบ™เบชเบฐเบซเบฅเบธเบšเป„เบ”เป‰

เปƒเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบ, เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบชเบปเบกเบ„เบงเบ™, เปเบฅเบฐเบ”เป‰เบงเบเป€เบซเบ”เบœเบปเบ™เบšเบฒเบ‡เบขเปˆเบฒเบ‡เบ‚เป‰เบญเบเปเบ™เปˆเปƒเบˆเบงเปˆเบฒเบ™เบตเป‰เบšเปเปˆเปเบกเปˆเบ™เบ‚เบญเบšเป€เบ‚เบ”เบˆเปเบฒเบเบฑเบ”! เบšเปเปˆเบงเปˆเบฒเบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบ™เบตเป‰เปƒเบ™เป‚เบ„เบ‡เบเบฒเบ™เบ—เบตเปˆเปเบ—เป‰เบˆเบดเบ‡เบชเปเบฒเบฅเบฑเบšเบ•เบปเบงเบ—เปˆเบฒเบ™เป€เบญเบ‡, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบžเบฝเบ‡เปเบ•เปˆเบˆเบฐเป€เบงเบปเป‰เบฒเบงเปˆเบฒเบชเปเบฒเบฅเบฑเบšเบ‚เป‰เบญเบเบกเบฑเบ™เป€เบ›เบฑเบ™เบเบฒเบ™เบ—เบปเบ”เบฅเบญเบ‡เบ—เบตเปˆเบซเบ™เป‰เบฒเบชเบปเบ™เปƒเบˆเบ—เบตเปˆเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบ›เบฐเป€เบกเบตเบ™เบงเปˆเบฒเบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ” "เบšเบตเบš" เบญเบญเบเบˆเบฒเบเบ•เบปเบงเป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ TCP เบ—เบตเปˆเบกเบตเบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเบซเบ™เป‰เบญเบเบ—เบตเปˆเบชเบธเบ”. เบ–เป‰เบฒเบ—เปˆเบฒเบ™เบกเบตเปเบ™เบงเบ„เบงเบฒเบกเบ„เบดเบ”เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฑเบšเบ›เบธเบ‡เบ”เบฑเบ”เบŠเบฐเบ™เบต, เบ‚เป‰เบญเบเบˆเบฐเบเบดเบ™เบ”เบตเบ—เบตเปˆเบˆเบฐเบžเบดเบˆเบฒเบฅเบฐเบ™เบฒเบ„เปเบฒเบฎเป‰เบญเบ‡เบ‚เปเบเบฒเบ™เบ”เบถเบ‡เบ‚เบญเบ‡เป€เบˆเบปเป‰เบฒ. เบฅเบฐโ€‹เบซเบฑเบ”โ€‹เบ—เบฑเบ‡โ€‹เบซเบกเบปเบ”โ€‹เบ—เบตเปˆโ€‹เบกเบตโ€‹เบ„เปเบฒโ€‹เปเบ™เบฐโ€‹เบ™เปเบฒโ€‹เบเบฒเบ™โ€‹เป€เบ›เบตเบ”โ€‹เบ•เบปเบงโ€‹เปเบฅเบฐโ€‹เบœเบปเบ™โ€‹เป„เบ”เป‰โ€‹เบฎเบฑเบšโ€‹เปเบกเปˆเบ™โ€‹เป„เบ”เป‰โ€‹เบ–เบทเบโ€‹เบˆเบฑเบ”โ€‹เบžเบตเบกโ€‹เบกเบฒโ€‹เปƒเบ™โ€‹เบเบฒเบ™โ€‹เปเบเบโ€‹เบ•เปˆเบฒเบ‡โ€‹เบซเบฒเบโ€‹ เบ„เบฑเบ‡เป€เบเบฑเบšเบกเป‰เบฝเบ™.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™