Π—Π°Π±Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ Π½Π° PHP ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈ Π·Π° Tarantool ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Async, Swoole ΠΈ Parallel

Π—Π°Π±Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ Π½Π° PHP ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈ Π·Π° Tarantool ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Async, Swoole ΠΈ Parallel

Π’ΠΎ СкосистСмот PHP Π²ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠΌΠ° Π΄Π²Π° ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈ Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° со сСрвСрот Tarantool - ΠΎΠ²Π° Π΅ ΠΎΡ„ΠΈΡ†ΠΈΡ˜Π°Π»Π½Π°Ρ‚Π° Π΅ΠΊΡΡ‚Π΅Π½Π·ΠΈΡ˜Π° PECL tarantool/tarantool-php, напишано Π²ΠΎ C, ΠΈ tarantool-php/ΠΊΠ»ΠΈΠ΅Π½Ρ‚, напишано Π²ΠΎ PHP. Јас сум Π°Π²Ρ‚ΠΎΡ€ Π½Π° Π²Ρ‚ΠΎΡ€ΠΎΡ‚ΠΎ.

Π’ΠΎ ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°, Π±ΠΈ сакал Π΄Π° Π³ΠΈ сподСлам Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΠ΄ Ρ‚Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ Π½Π° пСрформанситС Π½Π° Π΄Π²Π΅Ρ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈ Π΄Π° ΠΏΠΎΠΊΠ°ΠΆΠ°ΠΌ ΠΊΠ°ΠΊΠΎ, со ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π²ΠΎ ΠΊΠΎΠ΄ΠΎΡ‚, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° постигнСтС Π·Π³ΠΎΠ»Π΅ΠΌΡƒΠ²Π°ΡšΠ΅ Π½Π° пСрформанситС Π·Π° 3-5 (Π½Π° синтСтички тСстови!).

Π¨Ρ‚ΠΎ ќС тСстирамС?

ЌС Π³ΠΈ тСстирамС спомСнатитС ΠΏΠΎΠ³ΠΎΡ€Π΅ синхрони ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈ ΠΊΠΎΠΈ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ асинхроно, ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΎ ΠΈ асинхроно-ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΎ. πŸ™‚ Π˜ΡΡ‚ΠΎ Ρ‚Π°ΠΊΠ°, Π½Π΅ сакамС Π΄Π° Π³ΠΎ Π΄ΠΎΠΏΠΈΡ€Π°ΠΌΠ΅ ΠΊΠΎΠ΄ΠΎΡ‚ Π½Π° самитС ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈ. Π’ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈΠΌΠ° Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ достапни СкстСнзии Π·Π° Π΄Π° Π³ΠΎ постигнСтС ΠΎΠ½Π° ΡˆΡ‚ΠΎ Π³ΠΎ сакатС:

  • Π‘Π²ΡƒΠ» ― асинхрона Ρ€Π°ΠΌΠΊΠ° со високи пСрформанси Π·Π° 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). ΠŸΡ€Π²Π°Ρ‚Π° ΠΎΠΏΡ†ΠΈΡ˜Π° ќС ја Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡ€Π° Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚Π° со дискот, Π²Ρ‚ΠΎΡ€Π°Ρ‚Π° ќС ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠΈ Π΄Π° сС Ρ‡ΠΈΡ‚Π°Π°Ρ‚ повСќС Π±Π°Ρ€Π°ΡšΠ° ΠΎΠ΄ Π±Π°Ρ„Π΅Ρ€ΠΎΡ‚ Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈΠΎΡ‚ систСм ΠΈ со Ρ‚ΠΎΠ° Π΄Π° сС ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€Π° Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° систСмски ΠΏΠΎΠ²ΠΈΡ†ΠΈ.

Π—Π° ΠΎΠ΄Ρ€Π΅Π΄Π½ΠΈΡ†ΠΈΡ‚Π΅ ΡˆΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ со ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ (Π²ΠΌΠ΅Ρ‚Π½ΡƒΠ²Π°ΡšΠ΅, Π±Ρ€ΠΈΡˆΠ΅ΡšΠ΅, Ρ‡ΠΈΡ‚Π°ΡšΠ΅, ΠΈΡ‚Π½.), ΠΏΡ€Π΅Π΄ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ Ρ€Π΅ΠΏΠ΅Ρ€ΠΎΡ‚, ќС сС (ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ)создадС мСмткс простор, Π²ΠΎ кој врСдноститС Π½Π° ΠΏΡ€ΠΈΠΌΠ°Ρ€Π½ΠΈΠΎΡ‚ индСкс сС ΠΊΡ€Π΅ΠΈΡ€Π°Π½ΠΈ ΠΎΠ΄ Π³Π΅Π½Π΅Ρ€Π°Ρ‚ΠΎΡ€ Π½Π° ΠΏΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΈ Ρ†Π΅Π»ΠΈ Π±Ρ€ΠΎΠ΅Π²ΠΈ (сСквСнца).
ΠŸΡ€ΠΎΡΡ‚ΠΎΡ€ΠΎΡ‚ 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 сСкунда ΠΏΠΎΠΌΠ΅Ρ“Ρƒ ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡƒΠ²Π°ΡšΠ°Ρ‚Π° Π·Π° Π΄Π° сС спрСчи ΠΏΡ€ΠΈΠ³ΡƒΡˆΡƒΠ²Π°ΡšΠ΅ Π½Π° процСсорот. Π‘ΠΎΠ±ΠΈΡ€Π°Ρ‡ΠΎΡ‚ Π½Π° Ρ“ΡƒΠ±Ρ€Π΅ Π½Π° Π›ΡƒΠ° Π΅ ΠΎΠ½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ ΠΏΡ€Π΅Π΄ сСкоС ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡƒΠ²Π°ΡšΠ΅ ΠΈ Π΅ ΠΏΡ€ΠΈΠ½ΡƒΠ΄Π΅Π½ Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ ΠΎΡ‚ΠΊΠ°ΠΊΠΎ ќС Π·Π°Π²Ρ€ΡˆΠΈ. ΠŸΡ€ΠΎΡ†Π΅ΡΠΎΡ‚ Π½Π° PHP сС стартува само со СкстСнзии Π½Π΅ΠΎΠΏΡ…ΠΎΠ΄Π½ΠΈ Π·Π° Ρ€Π΅ΠΏΠ΅Ρ€, со ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ΠΎ Π±Π°Ρ„Π΅Ρ€ΠΈΡ€Π°ΡšΠ΅ Π½Π° ΠΈΠ·Π»Π΅Π·ΠΎΡ‚ ΠΈ ΠΎΠ½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½ собирач Π½Π° Ρ“ΡƒΠ±Ρ€Π΅.

* Π‘Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° Π²Ρ€Ρ‚Π΅ΠΆΠΈ, ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡƒΠ²Π°ΡšΠ° ΠΈ ΠΏΡ€Π°Π³ΠΎΡ‚ Π½Π° Π³Ρ€Π΅ΡˆΠΊΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° сС смСнат Π²ΠΎ поставкитС Π·Π° Ρ€Π΅ΠΏΠ΅Ρ€.

ВСст срСдина

Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ објавСни ΠΏΠΎΠ΄ΠΎΠ»Ρƒ сС Π½Π°ΠΏΡ€Π°Π²Π΅Π½ΠΈ Π½Π° MacBookPro (2015), ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π΅Π½ систСм - Fedora 30 (Π²Π΅Ρ€Π·ΠΈΡ˜Π° Π½Π° Ρ˜Π°Π΄Ρ€ΠΎΡ‚ΠΎ 5.3.8-200.fc30.x86_64). Tarantool бСшС лансиран Π²ΠΎ Π΄ΠΎΠΊΠ΅Ρ€ со ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Π°Ρ€ΠΎΡ‚ "--network host".

Π’Π΅Ρ€Π·ΠΈΠΈ Π½Π° ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΡ‚:

Tarantool: 2.3.0-115-g5ba5ed37e
Π”ΠΎΠΊΠ΅Ρ€: 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 (+ patch Π·Π° 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 користи Π±ΠΈΠ½Π°Ρ€Π΅Π½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ ΠŸΠ°ΠΊΠ΅Ρ‚ Π·Π° ΠΏΠΎΡ€Π°ΠΊΠΈ Π΄Π° сС ΡΠ΅Ρ€ΠΈΡ˜Π°Π»ΠΈΠ·ΠΈΡ€Π°Π°Ρ‚ ΠΏΠΎΡ€Π°ΠΊΠΈ. Π’ΠΎ PECL ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΎΡ‚, ΡΠ΅Ρ€ΠΈΡ˜Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° Π΅ скриСна Π΄Π»Π°Π±ΠΎΠΊΠΎ Π²ΠΎ Π΄Π»Π°Π±ΠΎΡ‡ΠΈΠ½ΠΈΡ‚Π΅ Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° ΠΈ влијаС Π½Π° процСсот Π½Π° ΠΊΠΎΠ΄ΠΈΡ€Π°ΡšΠ΅ ΠΎΠ΄ ΠΊΠΎΠ΄ΠΎΡ‚ Π½Π° корисничката зСмја сС Ρ‡ΠΈΠ½ΠΈ Π΄Π΅ΠΊΠ° Π½Π΅ Π΅ ΠΌΠΎΠΆΠ½ΠΎ. Чистиот 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). Но, ΠΎΠ²Π° Π½Π΅ Π΅ ΠΈΠ·Π½Π΅Π½Π°Π΄ΡƒΠ²Π°Ρ‡ΠΊΠΈ, имајќи ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄ Π΄Π΅ΠΊΠ° Π²Ρ‚ΠΎΡ€ΠΈΠΎΡ‚, ΠΏΠΎΠΊΡ€Π°Ρ˜ Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ Π΅ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ Π½Π° ΠΏΠΎΠ±Π°Π²Π΅Π½ јазик, Π²ΡΡƒΡˆΠ½ΠΎΡΡ‚ Ρ€Π°Π±ΠΎΡ‚ΠΈ повСќС: сС создава Π½ΠΎΠ² ΠΎΠ±Ρ˜Π΅ΠΊΡ‚ со сСкој ΠΏΠΎΠ²ΠΈΠΊ ΠŸΠΎΠ±Π°Ρ€Π° ΠΈ ΠžΠ΄Π³ΠΎΠ²ΠΎΡ€ (Π²ΠΎ ΡΠ»ΡƒΡ‡Π°Ρ˜ Π½Π° Π˜Π·Π±Π΅Ρ€Π΅Ρ‚Π΅ - исто Ρ‚Π°ΠΊΠ° ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΡƒΠΌΠΈ, Π° Π²ΠΎ ΡΠ»ΡƒΡ‡Π°Ρ˜ Π½Π° ΠΠΆΡƒΡ€ΠΈΡ€Π°ΡšΠ΅/ΠŸΠΎΡΡ‚Π°Π²ΠΈ ― ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ), ΠΏΠΎΠ΅Π΄ΠΈΠ½Π΅Ρ‡Π½ΠΈ ΡΡƒΠ±Ρ˜Π΅ΠΊΡ‚ΠΈ врска, ΠŸΠ°ΠΊΡƒΠ²Π°Ρ‡ ΠΈ ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Ρ‡ΠΎΡ‚ Π΄ΠΎΠ΄Π°Π²Π°Π°Ρ‚ ΠΈ рСТиски Ρ‚Ρ€ΠΎΡˆΠΎΡ†ΠΈ. ΠžΡ‡ΠΈΠ³Π»Π΅Π΄Π½ΠΎ, флСксибилноста ΠΈΠΌΠ° своја Ρ†Π΅Π½Π°. Π‘Π΅ΠΏΠ°ΠΊ, Π³Π΅Π½Π΅Ρ€Π°Π»Π½ΠΎ, 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 ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½ΠΈ ΠΈ Π²ΠΈΠ΄Π΅Ρ‚Π΅ ΡˆΡ‚ΠΎ сС случува:

Π—Π°Π±Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ Π½Π° PHP ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈ Π·Π° Tarantool ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Async, Swoole ΠΈ Parallel
Π‘Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ Π²ΠΎ сСкунда сС Π·Π³ΠΎΠ»Π΅ΠΌΠΈ Π·Π° повСќС ΠΎΠ΄ 3 ΠΏΠ°Ρ‚ΠΈ Π·Π° tarantool-php/ΠΊΠ»ΠΈΠ΅Π½Ρ‚!

Π—Π° ΠΆΠ°Π», PECL ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΎΡ‚ Π½Π΅ Π·Π°ΠΏΠΎΡ‡Π½Π° со ext-async.

Π¨Ρ‚ΠΎ Π΅ со SQL?

Π—Π°Π±Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ Π½Π° PHP ΠΊΠΎΠ½Π΅ΠΊΡ‚ΠΎΡ€ΠΈ Π·Π° Tarantool ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Async, Swoole ΠΈ Parallel
Како ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡ‚Π΅, Π²ΠΎ асинхрон Ρ€Π΅ΠΆΠΈΠΌ Ρ€Π°Π·Π»ΠΈΠΊΠ°Ρ‚Π° ΠΏΠΎΠΌΠ΅Ρ“Ρƒ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΎΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΈ SQL стана Π²ΠΎ Ρ€Π°ΠΌΠΊΠΈΡ‚Π΅ Π½Π° ΠΌΠ°Ρ€Π³ΠΈΠ½Π°Ρ‚Π° Π½Π° Π³Ρ€Π΅ΡˆΠΊΠ°.

Π‘Π²ΡƒΠ»

ΠŸΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π³ΠΎ Π΄ΠΎΠ·Π½Π°Π²Π°ΠΌΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»Π½ΠΈΠΎΡ‚ Π±Ρ€ΠΎΡ˜ Π½Π° ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½ΠΈ, овој ΠΏΠ°Ρ‚ Π·Π° Π‘Π²ΡƒΠ»:
Π—Π°Π±Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ Π½Π° 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 Π½Π΅ сС однСсува Π½Π° ΠΊΠΎΡ€ΡƒΡ‚ΠΈΠ½ΠΈ, Ρ‚ΡƒΠΊΡƒ Π·Π° нишки, ајдС Π΄Π° Π³ΠΎ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΠΌΠ΅ ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»Π½ΠΈΠΎΡ‚ Π±Ρ€ΠΎΡ˜ Π½Π° ΠΏΠ°Ρ€Π°Π»Π΅Π»Π½ΠΈ нишки:

Π—Π°Π±Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ Π½Π° 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

Π”ΠΎΠ΄Π°Π΄Π΅Ρ‚Π΅ ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€