УскоряСм PHP-ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ для Tarantool с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Async, Swoole ΠΈ Parallel

УскоряСм PHP-ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ для Tarantool с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Async, Swoole ΠΈ Parallel

Π’ экосистСмС PHP Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ сущСствуСт Π΄Π²Π° ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Π° для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с сСрвСром Tarantool ― это ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ PECL tarantool/tarantool-php, написанноС Π½Π° Π‘, ΠΈ tarantool-php/client, написанный Π½Π° PHP. Π― являюсь Π°Π²Ρ‚ΠΎΡ€ΠΎΠΌ послСднСго.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ я Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ ΠΏΠΎΠ΄Π΅Π»ΠΈΡ‚ΡŒΡΡ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ тСстирования ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΎΠ±Π΅ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ, ΠΊΠ°ΠΊ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Ρ… ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ Π² ΠΊΠΎΠ΄Π΅ ΠΌΠΎΠΆΠ½ΠΎ Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ 3-5 прироста ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ (Π½Π° синтСтичСский тСстах!).

Π§Ρ‚ΠΎ Π±ΡƒΠ΄Π΅ΠΌ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ?

Π‘ΡƒΠ΄Π΅ΠΌ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ упомянутыС Π²Ρ‹ΡˆΠ΅ синхронныС ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹, Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Π΅ асинхронно, ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ ΠΈ асинхронно-ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ. πŸ™‚ Π’Π°ΠΊΠΆΠ΅ ΠΌΡ‹ Π½Π΅ Ρ…ΠΎΡ‚ΠΈΠΌ Ρ‚Ρ€ΠΎΠ³Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ самих ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ². На Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ доступно нСсколько Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΡ… Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ ΠΆΠ΅Π»Π°Π΅ΠΌΠΎΠ³ΠΎ:

  • Swoole ― Π²Ρ‹ΡΠΎΠΊΠΎΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ асинхронный Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ для PHP. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Ρ‚Π°ΠΊΠΈΠΌΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚-Π³ΠΈΠ³Π°Π½Ρ‚Π°ΠΌΠΈ ΠΊΠ°ΠΊ Alibaba ΠΈ Baidu. Π‘ вСрсии 4.1.0 появился Π²ΠΎΠ»ΡˆΠ΅Π±Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ SwooleRuntime::enableCoroutine(), ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ Β«ΠΎΠ΄Π½ΠΎΠΉ строкой ΠΊΠΎΠ΄Π° ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚ΡŒ синхронныС сСтСвыС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ PHP Π² асинхронныС».
  • Async ― Π΄ΠΎ Π½Π΅Π΄Π°Π²Π½Π΅Π³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ вСсьма пСрспСктивноС Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ для асинхронной Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² PHP. ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π΄ΠΎ Π½Π΅Π΄Π°Π²Π½Π΅Π³ΠΎ? К соТалСнию, ΠΏΠΎ нСизвСстной ΠΌΠ½Π΅ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Π΅, Π°Π²Ρ‚ΠΎΡ€ ΡƒΠ΄Π°Π»ΠΈΠ» Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ ΠΈ дальнСйшая ΡΡƒΠ΄ΡŒΠ±Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Ρ‚ΡƒΠΌΠ°Π½Π½Π°. ΠŸΡ€ΠΈΠ΄Π΅Ρ‚ΡΡ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· Ρ„ΠΎΡ€ΠΊΠΎΠ². Как ΠΈ Swoole, это Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ позволяСт Π»Π΅Π³ΠΊΠΈΠΌ Π΄Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ΠΌ Ρ€ΡƒΠΊΠΈ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ Π±Ρ€ΡŽΠΊΠΈ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π°ΡΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½ΠΎΡΡ‚ΡŒ Π·Π°ΠΌΠ΅Π½ΠΎΠΉ стандартной Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ TCP ΠΈ TLS ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ² ΠΈΡ… асинхронными вСрсиями. ДСлаСтся это Ρ‡Π΅Ρ€Π΅Π· ΠΎΠΏΡ†ΠΈΡŽ «async.tcp = 1«.
  • Parallel ― довольно Π½ΠΎΠ²ΠΎΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ ΠΎΡ‚ нСбСзызвСстного Joe Watkins, Π°Π²Ρ‚ΠΎΡ€Π° Ρ‚Π°ΠΊΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ ΠΊΠ°ΠΊ phpdbg, apcu, pthreads, pcov, uopz. Π Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ прСдоставляСт API для ΠΌΠ½ΠΎΠ³ΠΎΠΏΠΎΡ‚ΠΎΡ‡Π½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π² PHP ΠΈ позиционируСтся ΠΊΠ°ΠΊ Π·Π°ΠΌΠ΅Π½Π° pthreads. БущСствСнным ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ являСтся Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с ZTS (Zend Thread Safe) вСрсиСй PHP.

Как Π±ΡƒΠ΄Π΅ΠΌ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ?

Запустим экзСмпляр Tarantool’Π° с ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΆΡƒΡ€Π½Π°Π»ΠΎΠΌ ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‰Π΅ΠΉ записи (wal_mode = none) ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌ сСтСвым Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ (readahead = 1 * 1024 * 1024). ΠŸΠ΅Ρ€Π²Π°Ρ опция ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ с диском, вторая β€” даст Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Ρ‹Ρ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ большС запросов ΠΈΠ· Π±ΡƒΡ„Π΅Ρ€Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы ΠΈ Ρ‚Π΅ΠΌ самым ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ количСство систСмных Π²Ρ‹Π·ΠΎΠ²ΠΎΠ².

Для Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚ с Π΄Π°Π½Π½Ρ‹ΠΌΠΈ (вставка, ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ ΠΈ Ρ‚.Π΄.) ΠΏΠ΅Ρ€Π΅Π΄ стартом Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ° Π±ΡƒΠ΄Π΅Ρ‚ (ΠΏΠ΅Ρ€Π΅)ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ memtx-спСйс, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ значСния ΠΏΠ΅Ρ€Π²ΠΈΡ‡Π½ΠΎΠ³ΠΎ индСкса ΡΠΎΠ·Π΄Π°ΡŽΡ‚ΡΡ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠΌ упорядочСнных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ†Π΅Π»Ρ‹Ρ… чисСл (sequence).
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 сСкунду, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π΄Π°Ρ‚ΡŒ процСссору ΡƒΠΉΡ‚ΠΈ Π² throttling. Π‘Π±ΠΎΡ€Ρ‰ΠΈΠΊ мусора Lua ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠ΅ΠΉ ΠΈ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ запускаСтся послС Π΅Π΅ Π·Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΡ. PHP-процСсс запускаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ΠΌΠΈ для Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ° Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ, с Π²ΠΊΠ»ΡŽΡ‡Π΅Π½Π½ΠΎΠΉ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ Π²Ρ‹Π²ΠΎΠ΄Π° ΠΈ Π²Ρ‹ΠΊΠ»ΡŽΡ‡Π΅Π½Π½Ρ‹ΠΌ сборщиком мусора.

* ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ Ρ€Π΅Π²ΠΎΠ»ΡŽΡ†ΠΈΠΉ, ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ ΠΈ ΠΏΠΎΡ€ΠΎΠ³ ΠΏΠΎΠ³Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚ΠΈ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π² настройках Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ°.

ВСстовоС ΠΎΠΊΡ€ΡƒΠΆΠ΅Π½ΠΈΠ΅

ΠžΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½Π½Ρ‹Π΅ Π½ΠΈΠΆΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π±Ρ‹Π»ΠΈ сдСланы Π½Π° MacBookPro (2015), опСрационная систСма β€” Fedora 30 (вСрсия ядра 5.3.8-200.fc30.x86_64). Tarantool запускался Π² Π΄ΠΎΠΊΠ΅Ρ€Π΅ Π² с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ «--network host".

ВСрсии ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ²:

Tarantool: 2.3.0-115-g5ba5ed37e
Docker: 19.03.3, build a872fc2f86
PHP: 7.3.11 (cli) (built: Oct 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
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
ext-parallel: 1.1.3

* К соТалСнию, ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с вСрсиСй PHP > 7.2. Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π½Π° PHP 7.3, ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠ°Ρ‚Ρ‡Π΅ΠΌ.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹

Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½Π½Ρ‹ΠΉ Ρ€Π΅ΠΆΠΈΠΌ

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Tarantool’а ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ MessagePack для сСриализации сообщСний. Π’ ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Π΅ PECL сСриализация скрыта Π³Π»ΡƒΠ±ΠΎΠΊΠΎ Π² Π½Π΅Π΄Ρ€Π°Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ ΠΏΠΎΠ²Π»ΠΈΡΡ‚ΡŒ Π½Π° процСсс кодирования ΠΈΠ· userland-ΠΊΠΎΠ΄Π° Π½Π΅ прСдставляСтся Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌ. ΠšΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€ Π½Π° чистом PHP, Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ², прСдоставляСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ кастомизации процСсса кодирования Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ стандартного ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ° Π»ΠΈΠ±ΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ использования своСй Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ. Из ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ доступно Π΄Π²Π° ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠ°, ΠΎΠ΄ΠΈΠ½ основан Π½Π° msgpack/msgpack-php (ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ MessagePack PECL), Π΄Ρ€ΡƒΠ³ΠΎΠΉ β€” Π½Π° rybakit/msgpack (Π½Π° чистом PHP).

ΠŸΠ΅Ρ€Π΅Π΄ сравнСниСм ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ², ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ MessagePack ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Ρ‰ΠΈΠΊΠΎΠ² для PHP-ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Π° ΠΈ Π² Π΄Π°Π»ΡŒΠ½Π΅ΠΉΡˆΠΈΡ… тСстах Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ Π»ΡƒΡ‡ΡˆΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

УскоряСм PHP-ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ для Tarantool с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Async, Swoole ΠΈ Parallel
Π₯ΠΎΡ‚ΡŒ PHP вСрсия (Pure) ΠΈ уступаСт Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡŽ PECL Π² скорости, Π² Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… я Π±Ρ‹ всС ΠΆΠ΅ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Π» ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠΌΠ΅Π½Π½ΠΎ rybakit/msgpack, ΠΏΠΎΡ‚ΠΎΠΌΡƒ ΠΊΠ°ΠΊ Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ MessagePack спСцификация Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π° лишь частично (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… Ρ‚ΠΈΠΏΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…, Π±Π΅Π· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹ Π½Π΅ смоТСтС ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Decimal β€” Π½ΠΎΠ²Ρ‹ΠΉ Ρ‚ΠΈΠΏ Π΄Π°Π½Π½Ρ‹Ρ…, прСдставлСнный Π² Tarantool 2.3) ΠΈ ΠΈΠΌΠ΅Π΅Ρ‚ ряд Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ совмСстимости с PHP 7.4). Ну ΠΈ Π² Ρ†Π΅Π»ΠΎΠΌ, ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ выглядит Π·Π°Π±Ρ€ΠΎΡˆΠ΅Π½Π½Ρ‹ΠΌ.

Π˜Ρ‚Π°ΠΊ, ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΠΌ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² Π² синхронном Ρ€Π΅ΠΆΠΈΠΌΠ΅:

УскоряСм PHP-ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ для Tarantool с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Async, Swoole ΠΈ Parallel
Как Π²ΠΈΠ΄Π½ΠΎ ΠΈΠ· Π³Ρ€Π°Ρ„ΠΈΠΊΠ°, ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€ PECL (Tarantool) ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π»ΡƒΡ‡ΡˆΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠΌ Π½Π° PHP (Client). Но это ΠΈ Π½Π΅ ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ, учитывая, Ρ‡Ρ‚ΠΎ послСдний, ΠΏΠΎΠΌΠΈΠΌΠΎ Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎ Ρ€Π΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎΠΌ языкС, выполняСт, ΠΏΠΎ сути, большС Ρ€Π°Π±ΠΎΡ‚Ρ‹: ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π²Ρ‹Π·ΠΎΠ²Π΅ создаСтся Π½ΠΎΠ²Ρ‹ΠΉ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ Request ΠΈ Response (Π² случаС Select ― Π΅Ρ‰Π΅ ΠΈ Criteria, Π° Π² случаС Update/Upsert ― Operations), ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ сущности Connection, Packer ΠΈ Handler Ρ‚ΠΎΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ ΠΎΠ²Π΅Ρ€Ρ…Π΅Π΄. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π° Π³ΠΈΠ±ΠΊΠΎΡΡ‚ΡŒ приходится ΠΏΠ»Π°Ρ‚ΠΈΡ‚ΡŒ. Однако, Π² Ρ†Π΅Π»ΠΎΠΌ, PHP-ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ…ΠΎΡ€ΠΎΡˆΡƒΡŽ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ, Ρ…ΠΎΡ‚ΡŒ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΈ Π΅ΡΡ‚ΡŒ, Π½ΠΎ ΠΎΠ½Π° Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π° ΠΈ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Π±ΡƒΠ΄Π΅Ρ‚ Π΅Ρ‰Π΅ мСньшС ΠΏΡ€ΠΈ использовании preloading Π² PHP 7.4, Π½Π΅ говоря ΡƒΠΆΠ΅ ΠΎ JIT Π² PHP 8.

ДвигаСмся дальшС. Π’ Tarantool 2.0 появилась ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° SQL. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Select, Insert, Update ΠΈ Delete ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ SQL-ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΈ ΡΡ€Π°Π²Π½ΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ с noSQL (Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ) эквивалСнтами:

УскоряСм PHP-ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ для Tarantool с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Async, Swoole ΠΈ Parallel
Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ SQL Π½Π΅ сильно Π²ΠΏΠ΅Ρ‡Π°Ρ‚Π»ΡΡŽΡ‚ (напомню, Ρ‡Ρ‚ΠΎ ΠΌΡ‹ всС Π΅Ρ‰Π΅ тСстируСм синхронный Ρ€Π΅ΠΆΠΈΠΌ). Однако, я Π±Ρ‹ Π½Π΅ стал Ρ€Π°ΡΡΡ‚Ρ€Π°ΠΈΠ²Π°Ρ‚ΡŒΡΡ ΠΏΠΎ этому ΠΏΠΎΠ²ΠΎΠ΄Ρƒ Ρ€Π°Π½ΡŒΡˆΠ΅ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° SQL всС Π΅Ρ‰Π΅ находится Π² Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅ (ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π½Π΅Π΄Π°Π²Π½ΠΎ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, добавилась ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° prepared statements) ΠΈ, судя ΠΏΠΎ списку issues, Π΄Π²ΠΈΠΆΠΎΠΊ SQL Π² дальнСйшСм ΠΆΠ΄Π΅Ρ‚ ряд ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ.

Async

Ну Ρ‡Ρ‚ΠΎ ΠΆ, посмотрим Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠ°ΠΊ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Async смоТСт ΠΏΠΎΠΌΠΎΡ‡ΡŒ Π½Π°ΠΌ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π²Ρ‹ΡˆΠ΅. Для написания асинхронных ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ прСдоставляСт API Π½Π° основС ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½ (coroutines), ΠΈΠΌ ΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ. ΠžΠΏΡ‹Ρ‚Π½Ρ‹ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ выясняСм, Ρ‡Ρ‚ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ количСство ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½ для нашСго окруТСния Ρ€Π°Π²Π½ΠΎ 25:

УскоряСм PHP-ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ для Tarantool с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Async, Swoole ΠΈ Parallel
Β«Π Π°Π·ΠΌΠ°Π·Ρ‹Π²Π°Π΅ΠΌΒ» 10,000 ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΏΠΎ 25 ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°ΠΌ ΠΈ смотрим, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ:

УскоряСм PHP-ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ для Tarantool с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Async, Swoole ΠΈ Parallel
ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² сСкунду выросло Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π² 3 Ρ€Π°Π·Π° для tarantool-php/client!

ΠŸΠ΅Ρ‡Π°Π»ΡŒΠ½ΠΎ, Π½ΠΎ ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€ PECL Π½Π΅ запустился с ext-async.

А Ρ‡Ρ‚ΠΎ c SQL?

УскоряСм PHP-ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ для Tarantool с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Async, Swoole ΠΈ Parallel
Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π² асинхронном Ρ€Π΅ΠΆΠΈΠΌΠ΅ Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠΌ ΠΈ SQL стала Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… ΠΏΠΎΠ³Ρ€Π΅ΡˆΠ½ΠΎΡΡ‚ΠΈ.

Swoole

ΠžΠΏΡΡ‚ΡŒ выясняСм ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ количСство ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½, Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΡƒΠΆΠ΅ для Swoole:
УскоряСм PHP-ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ для Tarantool с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Async, Swoole ΠΈ Parallel
ΠžΡΡ‚Π°Π½ΠΎΠ²ΠΈΠΌΡΡ Π½Π° 25. ΠŸΠΎΠ²Ρ‚ΠΎΡ€ΠΈΠΌ Ρ‚ΠΎΡ‚ ΠΆΠ΅ Ρ‚Ρ€ΡŽΠΊ, Ρ‡Ρ‚ΠΎ ΠΈ с Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ Async ― распрСдСлим 10,000 ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ ΠΌΠ΅ΠΆΠ΄Ρƒ 25 ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°ΠΌΠΈ. Помимо этого, Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΅Ρ‰Π΅ тСст, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Ρ€Π°Π·Π΄Π΅Π»ΠΈΠΌ всю Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π° 2 Π΄Π²Π° процСсса (Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ процСсс Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ 5,000 ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ Π² 25 ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Π°Ρ…). ΠŸΡ€ΠΎΡ†Π΅ΡΡΡ‹ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒΡΡ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ SwooleProcess.

Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹:

УскоряСм PHP-ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ для Tarantool с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Async, Swoole ΠΈ Parallel
Swole ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ‡ΡƒΡ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Async ΠΏΡ€ΠΈ запускС Π² ΠΎΠ΄Π½ΠΎΠΌ процСссС, Π½ΠΎ с 2 процСссами ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Π° мСняСтся ΠΊΠ°Ρ€Π΄ΠΈΠ½Π°Π»ΡŒΠ½ΠΎ (число 2 Π²Ρ‹Π±Ρ€Π°Π½ΠΎ Π½Π΅ случайно, Π½Π° ΠΌΠΎΠ΅ΠΉ машинС ΠΈΠΌΠ΅Π½Π½ΠΎ 2 процСсса ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΈ Π½Π°ΠΈΠ»ΡƒΡ‡ΡˆΠΈΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚).

ΠšΡΡ‚Π°Ρ‚ΠΈ, Π² Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΈ Async Ρ‚ΠΎΠΆΠ΅ Π΅ΡΡ‚ΡŒ API для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с процСссами, ΠΎΠ΄Π½Π°ΠΊΠΎ Ρ‚Π°ΠΌ я Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ» ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ Ρ€Π°Π·Π½ΠΈΡ†Ρ‹ ΠΎΡ‚ запуска Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠΎΠ² Π² ΠΎΠ΄Π½ΠΎΠΌ ΠΈΠ»ΠΈ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… процСссах (Π½Π΅ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ, Ρ‡Ρ‚ΠΎ я Π³Π΄Π΅-Ρ‚ΠΎ накосячил).

SQL vs Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»:

УскоряСм PHP-ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ для Tarantool с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Async, Swoole ΠΈ Parallel
Π’Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ с Async, Ρ€Π°Π·Π½ΠΈΡ†Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΌΠΈ ΠΈ SQL-опСрациями нивСлируСтся Π² асинхронном Ρ€Π΅ΠΆΠΈΠΌΠ΅.

Parallel

Π’Π°ΠΊ ΠΊΠ°ΠΊ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Parallel Π½Π΅ ΠΏΡ€ΠΎ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹, Π½ΠΎ ΠΏΡ€ΠΎ ΠΏΠΎΡ‚ΠΎΠΊΠΈ, ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΠΌ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»ΡŒΠ½ΠΎΠ΅ количСство ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠΎΠ²:

УскоряСм PHP-ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ для Tarantool с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Async, Swoole ΠΈ Parallel
Оно Ρ€Π°Π²Π½ΠΎ 16 Π½Π° ΠΌΠΎΠ΅ΠΉ машинС. Запустим Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠΈ ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ² Π½Π° 16 ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹Ρ… ΠΏΠΎΡ‚ΠΎΠΊΠ°Ρ…:

УскоряСм PHP-ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ для Tarantool с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Async, Swoole ΠΈ Parallel
Как Π²ΠΈΠ΄ΠΈΡ‚Π΅, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π΄Π°ΠΆΠ΅ Π»ΡƒΡ‡ΡˆΠ΅, Ρ‡Π΅ΠΌ с асинхронными Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡΠΌΠΈ (Π½Π΅ считая Swoole Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½ΠΎΠΌ Π½Π° 2 процСссах). Π—Π°ΠΌΠ΅Ρ‚ΡŒΡ‚Π΅, Ρ‡Ρ‚ΠΎ для ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Π° PECL Π½Π° мСстС Update ΠΈ Upsert ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΉ пусто. Бвязано это с Ρ‚Π΅ΠΌ, Ρ‡Ρ‚ΠΎ Π΄Π°Π½Π½Ρ‹Π΅ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹Π»Π΅Ρ‚Π΅Π»ΠΈ с ошибкой ― Π½Π΅ знаю, ΠΏΠΎ Π²ΠΈΠ½Π΅ ext-parallel, ext-tarantool ΠΈΠ»ΠΈ ΠΎΠ±ΠΎΠΈΡ….

Π’Π΅ΠΏΠ΅Ρ€ΡŒ сравним ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ SQL:

УскоряСм PHP-ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ для Tarantool с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Async, Swoole ΠΈ Parallel
Π—Π°ΠΌΠ΅Ρ‚ΠΈΠ»ΠΈ сходство с Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠΌ для ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€ΠΎΠ², Π·Π°ΠΏΡƒΡ‰Π΅Π½Π½Ρ‹Ρ… синхронно?

Всё вмСстС

Ну ΠΈ напослСдок, свСдСм всС Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² ΠΎΠ΄ΠΈΠ½ Π³Ρ€Π°Ρ„ΠΈΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΎΠ±Ρ‰ΡƒΡŽ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρƒ для тСстируСмых Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ. Π”ΠΎΠ±Π°Π²ΠΈΠΌ Π½Π° Π³Ρ€Π°Ρ„ΠΈΠΊ лишь ΠΎΠ΄ΠΈΠ½ Π½ΠΎΠ²Ρ‹ΠΉ тСст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΡ‹ Π΅Ρ‰Π΅ Π½Π΅ Π΄Π΅Π»Π°Π»ΠΈ ― запустим ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ Async ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½ΠΎ ΠΏΡ€ΠΈ ΠΏΠΎΠΌΠΎΡ‰ΠΈ Parallel*. ИдСя ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ Π²Ρ‹ΡˆΠ΅ΡƒΠΏΠΎΠΌΡΠ½ΡƒΡ‚Ρ‹Ρ… Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ ΡƒΠΆΠ΅ ΠΎΠ±ΡΡƒΠΆΠ΄Π°Π»Π°ΡΡŒ Π°Π²Ρ‚ΠΎΡ€Π°ΠΌΠΈ, ΠΎΠ΄Π½Π°ΠΊΠΎ консСнсус Ρ‚Π°ΠΊ ΠΈ Π½Π΅ Π±Ρ‹Π» достигнут, придСтся Π΄Π΅Π»Π°Ρ‚ΡŒ это самим.

* Π—Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½Ρ‹ Swoole с Parallel Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ, ΠΏΠΎΡ…ΠΎΠΆΠ΅ эти Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ нСсовмСстимы.

Π˜Ρ‚Π°ΠΊ, Ρ„ΠΈΠ½Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹:

УскоряСм PHP-ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Ρ‹ для Tarantool с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Async, Swoole ΠΈ Parallel

ВмСсто Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ

По-ΠΌΠΎΠ΅ΠΌΡƒ, Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈΡΡŒ вСсьма достойныС, ΠΈ я ΠΏΠΎΡ‡Π΅ΠΌΡƒ-Ρ‚ΠΎ ΡƒΠ²Π΅Ρ€Π΅Π½, Ρ‡Ρ‚ΠΎ это Π΅Ρ‰Π΅ Π½Π΅ ΠΏΡ€Π΅Π΄Π΅Π»! НуТно Π»ΠΈ это Π²Π°ΠΌ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Π°ΠΌ самим, скаТу лишь, Ρ‡Ρ‚ΠΎ для мСня это Π±Ρ‹Π» интСрСсный экспСримСнт, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡŽΡ‰ΠΈΠΉ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ, сколько ΠΌΠΎΠΆΠ½ΠΎ Β«Π²Ρ‹ΠΆΠ°Ρ‚ΡŒΒ» ΠΈΠ· синхронного TCP-ΠΊΠΎΠ½Π½Π΅ΠΊΡ‚ΠΎΡ€Π° с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΌΠΈ усилиями. Если Ρƒ вас Π΅ΡΡ‚ΡŒ ΠΈΠ΄Π΅ΠΈ ΠΏΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡŽ Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠΎΠ² ― я с Ρ€Π°Π΄ΠΎΡΡ‚ΡŒΡŽ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€ΡŽ ваш ΠΏΡƒΠ» рСквСст. Π’Π΅ΡΡŒ ΠΊΠΎΠ΄ с инструкциями ΠΏΠΎ запуску ΠΈ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°ΠΌΠΈ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π½ Π² ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΠΌ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ.

Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: habr.com

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ