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

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

Π’ PHP СкосистСмата Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΈΠΌΠ° Π΄Π²Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° със ΡΡŠΡ€Π²ΡŠΡ€Π° Π½Π° Tarantool - Ρ‚ΠΎΠ²Π° Π΅ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½ΠΎΡ‚ΠΎ PECL Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ tarantool/tarantool-php, написан Π½Π° C, ΠΈ tarantool-php/ΠΊΠ»ΠΈΠ΅Π½Ρ‚, написан Π½Π° PHP. Аз съм Π°Π²Ρ‚ΠΎΡ€ Π½Π° послСдното.

Π’ Ρ‚Π°Π·ΠΈ статия Π±ΠΈΡ… искал Π΄Π° сподСля Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ тСстванСто Π½Π° производитСлността Π½Π° Π΄Π²Π΅Ρ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ° ΠΊΠ°ΠΊ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° постигнСтС 3-5 ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ΠΈΠ΅ Π½Π° производитСлността (Π½Π° синтСтични тСстовС!).

Какво Ρ‰Π΅ тСствамС?

Π©Π΅ тСствамС спомСнатитС ΠΏΠΎ-Π³ΠΎΡ€Π΅ синхронСн ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈ, Ρ€Π°Π±ΠΎΡ‚Π΅Ρ‰ΠΈ асинхронно, ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΎ ΠΈ асинхронно-ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΎ. πŸ™‚ Π‘ΡŠΡ‰ΠΎ Ρ‚Π°ΠΊΠ° Π½Π΅ искамС Π΄Π° ΠΏΠΈΠΏΠ°ΠΌΠ΅ ΠΊΠΎΠ΄Π° Π½Π° самитС ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈ. Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΈΠΌΠ° няколко Π½Π°Π»ΠΈΡ‡Π½ΠΈ Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΡ, Π·Π° Π΄Π° постигнСтС Ρ‚ΠΎΠ²Π°, ΠΊΠΎΠ΅Ρ‚ΠΎ искатС:

  • Swoole ― високоСфСктивна асинхронна Ρ€Π°ΠΌΠΊΠ° Π·Π° PHP. Използва сС ΠΎΡ‚ Ρ‚Π°ΠΊΠΈΠ²Π° ΠΈΠ½Ρ‚Π΅Ρ€Π½Π΅Ρ‚ Π³ΠΈΠ³Π°Π½Ρ‚ΠΈ ΠΊΠ°Ρ‚ΠΎ Alibaba ΠΈ Baidu. ΠžΡ‚ вСрсия 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 = няма) ΠΈ ΡƒΠ²Π΅Π»ΠΈΡ‡Π΅Π½ ΠΌΡ€Π΅ΠΆΠΎΠ² Π±ΡƒΡ„Π΅Ρ€ (Ρ‡Π΅Ρ‚Π΅Π½Π΅ Π½Π°ΠΏΡ€Π΅Π΄ = 1 * 1024 * 1024). ΠŸΡŠΡ€Π²Π°Ρ‚Π° опция Ρ‰Π΅ ΠΏΡ€Π΅ΠΌΠ°Ρ…Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° с диска, Π²Ρ‚ΠΎΡ€Π°Ρ‚Π° Ρ‰Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈ възмоТно Ρ‡Π΅Ρ‚Π΅Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΠΎΠ²Π΅Ρ‡Π΅ заявки ΠΎΡ‚ Π±ΡƒΡ„Π΅Ρ€Π° Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Π°Ρ‚Π° систСма ΠΈ ΠΏΠΎ Ρ‚ΠΎΠ·ΠΈ Π½Π°Ρ‡ΠΈΠ½ Ρ‰Π΅ свСдС Π΄ΠΎ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ броя Π½Π° систСмнитС повиквания.

Π—Π° Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠΎΠ²Π΅, ΠΊΠΎΠΈΡ‚ΠΎ работят с Π΄Π°Π½Π½ΠΈ (вмъкванС, ΠΈΠ·Ρ‚Ρ€ΠΈΠ²Π°Π½Π΅, Ρ‡Π΅Ρ‚Π΅Π½Π΅ ΠΈ Ρ‚.Π½.), ΠΏΡ€Π΅Π΄ΠΈ стартиранС Π½Π° Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ° Ρ‰Π΅ бъдС (ΠΏΡ€Π΅)създадСно 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 XNUMX ΠΊΠΎΡ€Ρ‚Π΅ΠΆΠ° ΠΎΡ‚ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π°

{id, "tuplΠ΅_<id>"}

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

Бамият Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊ Π΅ Π΅Π΄Π½Π° заявка към ΡΡŠΡ€Π²ΡŠΡ€Π°, която сС изпълнява 10,000 5 ΠΏΡŠΡ‚ΠΈ (ΠΎΠ±ΠΎΡ€ΠΎΡ‚ΠΈ), ΠΊΠΎΠΈΡ‚ΠΎ ΠΎΡ‚ своя страна сС ΠΈΠ·ΠΏΡŠΠ»Π½ΡΠ²Π°Ρ‚ Π½Π° ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ. Π˜Ρ‚Π΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ сС повтарят, Π΄ΠΎΠΊΠ°Ρ‚ΠΎ всички Π²Ρ€Π΅ΠΌΠ΅Π²ΠΈ отклонСния ΠΌΠ΅ΠΆΠ΄Ρƒ 3 ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈ са Π² Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ»ΠΈΠ²Π° Π³Ρ€Π΅ΡˆΠΊΠ° ΠΎΡ‚ 1%*. Π‘Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° сС Π²Π·Π΅ΠΌΠ° срСдният Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚. Има ΠΏΠ°ΡƒΠ·Π° ΠΎΡ‚ XNUMX сСкунда ΠΌΠ΅ΠΆΠ΄Ρƒ ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅, Π·Π° Π΄Π° сС ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈ дросСлиранС Π½Π° процСсора. Π‘ΡŠΠ±ΠΈΡ€Π°Ρ‡ΡŠΡ‚ Π½Π° Π±ΠΎΠΊΠ»ΡƒΠΊ Π½Π° 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, компилация 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: 2.0.3
ext-async: 0.3.0-8c1da46
ext-swoole: 4.4.12
външСн ΠΏΠ°Ρ€Π°Π»Π΅Π»: 1.1.3

* Π—Π° съТалСниС, официалният ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ с PHP вСрсия > 7.2. Π—Π° Π΄Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€Π°ΠΌ ΠΈ стартирам Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π½Π° PHP 7.3, Ρ‚Ρ€ΡΠ±Π²Π°ΡˆΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ пластир.

Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ

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

ΠŸΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΡŠΡ‚ Tarantool ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π΄Π²ΠΎΠΈΡ‡Π΅Π½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ MessagePack Π·Π° сСриализиранС Π½Π° ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΡ. Π’ PECL ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° сСриализацията Π΅ скрита дълбоко Π² Π΄ΡŠΠ»Π±ΠΈΠ½ΠΈΡ‚Π΅ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° ΠΈ засяга процСса Π½Π° ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ ΠΎΡ‚ потрСбитСлския ΠΊΠΎΠ΄ Π½Π΅ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° възмоТно. Чистият PHP ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€, Π½Π°ΠΏΡ€ΠΎΡ‚ΠΈΠ², прСдоставя Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° пСрсонализиранС Π½Π° процСса Π½Π° ΠΊΠΎΠ΄ΠΈΡ€Π°Π½Π΅ Ρ‡Ρ€Π΅Π· Ρ€Π°Π·ΡˆΠΈΡ€ΡΠ²Π°Π½Π΅ Π½Π° стандартния Π΅Π½ΠΊΠΎΠ΄Π΅Ρ€ ΠΈΠ»ΠΈ Ρ‡Ρ€Π΅Π· ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ваша собствСна рСализация. Налични са Π΄Π²Π° Π΅Π½ΠΊΠΎΠ΄Π΅Ρ€Π°, Сдиният Π΅ Π±Π°Π·ΠΈΡ€Π°Π½ Π½Π° msgpack/msgpack-php (ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½ΠΎ Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ PECL Π½Π° MessagePack), Π΄Ρ€ΡƒΠ³ΠΎΡ‚ΠΎ Π΅ Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΎ 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 ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€Π° (ΠΊΠ»ΠΈΠ΅Π½Ρ‚). Но Ρ‚ΠΎΠ²Π° Π½Π΅ Π΅ ΠΈΠ·Π½Π΅Π½Π°Π΄Π²Π°Ρ‰ΠΎ, ΠΊΠ°Ρ‚ΠΎ сС ΠΈΠΌΠ° ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄, Ρ‡Π΅ послСдният, освСн Ρ‡Π΅ Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ Π½Π° ΠΏΠΎ-Π±Π°Π²Π΅Π½ Π΅Π·ΠΈΠΊ, Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ Π²ΡŠΡ€ΡˆΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅ Ρ€Π°Π±ΠΎΡ‚Π°: с всяко ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ сС създава Π½ΠΎΠ² ΠΎΠ±Π΅ΠΊΡ‚ ΠŸΠΎΠΈΡΠΊΠ°ΠΉΡ‚Π΅ ΠΈ ΠžΡ‚Π³ΠΎΠ²ΠΎΡ€ (Π² случая Π½Π° Select - ΡΡŠΡ‰ΠΎ ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ, Π° Π² случай Π½Π° Update/Upsert ― ΠžΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ), ΠΎΡ‚Π΄Π΅Π»Π½ΠΈ ΠΎΠ±Π΅ΠΊΡ‚ΠΈ Π’Ρ€ΡŠΠ·ΠΊΠ°, ΠžΠΏΠ°ΠΊΠΎΠ²Ρ‡ΠΈΠΊ ΠΈ Ρ‚Ρ€Π΅Π½ΡŒΠΎΡ€ Ρ‚Π΅ ΡΡŠΡ‰ΠΎ добавят Ρ€Π΅ΠΆΠΈΠΉΠ½ΠΈ Ρ€Π°Π·Ρ…ΠΎΠ΄ΠΈ. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ Π³ΡŠΠ²ΠΊΠ°Π²ΠΎΡΡ‚Ρ‚Π° си ΠΈΠΌΠ° Ρ†Π΅Π½Π°. ΠšΠ°Ρ‚ΠΎ цяло ΠΎΠ±Π°Ρ‡Π΅ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΡŠΡ‚ Π½Π° PHP ΠΏΠΎΠΊΠ°Π·Π²Π° Π΄ΠΎΠ±Ρ€Π° производитСлност, Π²ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‡Π΅ ΠΈΠΌΠ° Ρ€Π°Π·Π»ΠΈΠΊΠ°, тя Π΅ Π½Π΅Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»Π½Π° ΠΈ ΠΌΠΎΠΆΠ΅ Π±ΠΈ Ρ‰Π΅ бъдС Π΄ΠΎΡ€ΠΈ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠ° ΠΏΡ€ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΏΡ€Π΅Π΄Π²Π°Ρ€ΠΈΡ‚Π΅Π»Π½ΠΎ Π·Π°Ρ€Π΅ΠΆΠ΄Π°Π½Π΅ Π² PHP 7.4, Π΄Π° Π½Π΅ Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π·Π° JIT Π² PHP 8.

Π”Π° ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΠΌ. Tarantool 2.0 Π΄ΠΎΠ±Π°Π²ΠΈ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π·Π° SQL. НСка сС ΠΎΠΏΠΈΡ‚Π°ΠΌΠ΅ Π΄Π° изпълним ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈΡ‚Π΅ Select, Insert, Update ΠΈ Delete, ΠΊΠ°Ρ‚ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ SQL ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° ΠΈ сравним Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ с noSQL (Π΄Π²ΠΎΠΈΡ‡Π½ΠΈ) Π΅ΠΊΠ²ΠΈΠ²Π°Π»Π΅Π½Ρ‚ΠΈ:

УскоряванС Π½Π° PHP ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈ Π·Π° Tarantool с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Async, Swoole ΠΈ Parallel
Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΡ‚ SQL Π½Π΅ са ΠΌΠ½ΠΎΠ³ΠΎ впСчатляващи (Π½Π΅ΠΊΠ° Π²ΠΈ напомня, Ρ‡Π΅ всС ΠΎΡ‰Π΅ тСствамС синхронСн Ρ€Π΅ΠΆΠΈΠΌ). Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Π½Π΅ Π±ΠΈΡ… сС разстроил Π·Π° Ρ‚ΠΎΠ²Π° ΠΏΡ€Π΅Π΄ΠΈ Π²Ρ€Π΅ΠΌΠ΅; ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π½Π° SQL всС ΠΎΡ‰Π΅ Π΅ Π² процСс Π½Π° Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ (сравнитСлно наскоро, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, бСшС Π΄ΠΎΠ±Π°Π²Π΅Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° ΠΈΠ·Π³ΠΎΡ‚Π²Π΅Π½ΠΈ ΠΎΡ‚Ρ‡Π΅Ρ‚ΠΈ) ΠΈ, съдСйки ΠΏΠΎ списъка Π²ΡŠΠΏΡ€ΠΎΡΠΈ, SQL ΠΌΠ°ΡˆΠΈΠ½Π°Ρ‚Π° Ρ‰Π΅ ΠΏΡ€Π΅Ρ‚ΡŠΡ€ΠΏΠΈ Ρ€Π΅Π΄ΠΈΡ†Π° ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Π±ΡŠΠ΄Π΅Ρ‰Π΅.

АсинхронизиранС

Π•, сСга Π½Π΅ΠΊΠ° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Async ΠΌΠΎΠΆΠ΅ Π΄Π° Π½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΈΠΌ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΏΠΎ-Π³ΠΎΡ€Π΅. Π—Π° писанС Π½Π° асинхронни ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅Ρ‚ΠΎ прСдоставя API, Π±Π°Π·ΠΈΡ€Π°Π½ Π½Π° ΡΡŠΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Ρ‰Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅. ΠžΡ‚ΠΊΡ€ΠΈΠ²Π°ΠΌΠ΅ Π΅ΠΌΠΏΠΈΡ€ΠΈΡ‡Π½ΠΎ, Ρ‡Π΅ оптималният Π±Ρ€ΠΎΠΉ ΡΡŠΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈ Π·Π° Π½Π°ΡˆΠ°Ρ‚Π° срСда Π΅ 25:

УскоряванС Π½Π° PHP ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈ Π·Π° Tarantool с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Async, Swoole ΠΈ Parallel
β€žΠ Π°Π·ΠΏΡ€Π΅Π΄Π΅Π»Π΅Ρ‚Π΅β€œ 10,000 25 ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² XNUMX ΡΡŠΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΈ Π²ΠΈΠΆΡ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΎ Ρ‰Π΅ сС случи:

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

Π—Π° съТалСниС 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 ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π² XNUMX ΡΡŠΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ). ΠŸΡ€ΠΎΡ†Π΅ΡΠΈΡ‚Π΅ Ρ‰Π΅ Π±ΡŠΠ΄Π°Ρ‚ създадСни с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° SwooleProcess.

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ:

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

ΠœΠ΅ΠΆΠ΄Ρƒ Π΄Ρ€ΡƒΠ³ΠΎΡ‚ΠΎ, Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Async ΡΡŠΡ‰ΠΎ ΠΈΠΌΠ° API Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° с процСси, Π½ΠΎ Ρ‚Π°ΠΌ Π½Π΅ забСлязах Ρ€Π°Π·Π»ΠΈΠΊΠ° ΠΎΡ‚ стартиранС Π½Π° Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠΎΠ²Π΅ Π² Π΅Π΄ΠΈΠ½ ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅Ρ‡Π΅ процСси (възмоТно Π΅ Π΄Π° съм ΠΎΠ±ΡŠΡ€ΠΊΠ°Π» някъдС).

SQL срСщу Π΄Π²ΠΎΠΈΡ‡Π΅Π½ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»:

УскоряванС Π½Π° PHP ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈ Π·Π° Tarantool с ΠΏΠΎΠΌΠΎΡ‰Ρ‚Π° Π½Π° Async, Swoole ΠΈ Parallel
ΠšΠ°ΠΊΡ‚ΠΎ ΠΏΡ€ΠΈ Async, Ρ€Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° ΠΌΠ΅ΠΆΠ΄Ρƒ Π΄Π²ΠΎΠΈΡ‡Π½ΠΈ ΠΈ SQL ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ сС Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡ€Π° Π² асинхронСн Ρ€Π΅ΠΆΠΈΠΌ.

ΠŸΠ°Ρ€Π°Π»Π΅Π»Π½ΠΎ

Въй ΠΊΠ°Ρ‚ΠΎ ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΎΡ‚ΠΎ Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π½Π΅ Π΅ ΡΠ²ΡŠΡ€Π·Π°Π½ΠΎ с ΡΡŠΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ, Π° с нишки, Π½Π΅ΠΊΠ° ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΠΌ оптималния Π±Ρ€ΠΎΠΉ ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΈ нишки:

УскоряванС Π½Π° 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 ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ с ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈ усилия. Ако ΠΈΠΌΠ°Ρ‚Π΅ ΠΈΠ΄Π΅ΠΈ Π·Π° подобряванС Π½Π° Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠΎΠ²Π΅Ρ‚Π΅, Ρ‰Π΅ сС Ρ€Π°Π΄Π²Π°ΠΌ Π΄Π° Ρ€Π°Π·Π³Π»Π΅Π΄Π°ΠΌ Π²Π°ΡˆΠ°Ρ‚Π° заявка Π·Π° изтСглянС. ЦСлият ΠΊΠΎΠ΄ с инструкции Π·Π° стартиранС ΠΈ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ Π΅ ΠΏΡƒΠ±Π»ΠΈΠΊΡƒΠ²Π°Π½ Π² ΠΎΡ‚Π΄Π΅Π»Π½ΠΎ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π°.

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

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€