УскоряванС Π½Π° PHP ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡ‚Π΅ Π·Π° Tarantool с Async, Swoole ΠΈ Parallel

УскоряванС Π½Π° PHP ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡ‚Π΅ Π·Π° Tarantool с Async, Swoole ΠΈ Parallel

Π’ СкосистСмата Π½Π° PHP Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‚ Π΄Π²Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с Tarantool ΡΡŠΡ€Π²ΡŠΡ€ β€” Ρ‚ΠΎΠ²Π° Π΅ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½ΠΎΡ‚ΠΎ PECL Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ tarantool/tarantool-php, написано Π½Π° C, ΠΈ 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Π΅_"}

Π”ΠΎΡΡ‚ΡŠΠΏΡŠΡ‚ Π΄ΠΎ ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠΈΡ‚Π΅ сС ΠΎΡΡŠΡ‰Π΅ΡΡ‚Π²ΡΠ²Π° случайно ΠΏΠΎ стойността Π½Π° ΠΊΠ»ΡŽΡ‡Π°.

Бамият Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊ прСдставлява Π΅Π΄ΠΈΠ½Π΅Π½ запрос Π΄ΠΎ ΡΡŠΡ€Π²ΡŠΡ€Π°, ΠΊΠΎΠΉΡ‚ΠΎ сС изпълнява 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, build 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
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 ΠΌΠΎΠΆΠ΅ Π΄Π° Π½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΏΠΎ-Π³ΠΎΡ€Π΅. Π—Π° писанСто Π½Π° асинхронни ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅Ρ‚ΠΎ прСдоставя API Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½ΠΈ (coroutines), ΠΈ Π½ΠΈΠ΅ Ρ‰Π΅ Π³ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅. ΠžΠΏΠΈΡ‚Π²Π°ΠΉΠΊΠΈ сС, установявамС, Ρ‡Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»Π½ΠΎΡ‚ΠΎ количСство ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½ΠΈ Π·Π° Π½Π°ΡˆΠ°Ρ‚Π° срСда Π΅ 25:

УскоряванС Π½Π° PHP ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡ‚Π΅ Π·Π° Tarantool с Async, Swoole ΠΈ Parallel
β€žΠ Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»ΡΠΌΠ΅β€œ 10,000 ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ ΠΌΠ΅ΠΆΠ΄Ρƒ 25 ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½ΠΈ ΠΈ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ сС ΠΏΠΎΠ»ΡƒΡ‡ΠΈ:

УскоряванС Π½Π° PHP ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈΡ‚Π΅ Π·Π° Tarantool с Async, Swoole ΠΈ Parallel
ΠšΠΎΠ»ΠΈΡ‡Π΅ΡΡ‚Π²ΠΎ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² сСкунда сС ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅ ΠΎΡ‚ 3 ΠΏΡŠΡ‚ΠΈ Π·Π° tarantool-php/client!

ВъТно, Π½ΠΎ ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΡŠΡ‚ PECL Π½Π΅ стартира с ext-async.

А какво с 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 срСщу бинарния ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»:

УскоряванС Π½Π° 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

ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ πŸ”₯ ΠšΡƒΠΏΠ΅Ρ‚Π΅ Π½Π°Π΄Π΅ΠΆΠ΄Π΅Π½ хостинг Π·Π° сайтовС със Π·Π°Ρ‰ΠΈΡ‚Π° ΠΎΡ‚ DDoS, VPS ΠΈ VDS ΡΡŠΡ€Π²ΡŠΡ€ΠΈ | ProHoster