Π’ΠΎ Tarantool, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Ρ‚Π΅ супСрбрза Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° со Π½ΠΈΠ². Π•Π²Π΅ ΠΊΠΎΠ»ΠΊΡƒ Π΅ лСсно Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ

ΠŸΡ€Π΅Π΄ ΠΏΠ΅Ρ‚ Π³ΠΎΠ΄ΠΈΠ½ΠΈ сС ΠΎΠ±ΠΈΠ΄ΠΎΠ² Π΄Π° Ρ€Π°Π±ΠΎΡ‚Π°ΠΌ со Tarantool, Π½ΠΎ Ρ‚ΠΎΠ³Π°Ρˆ Π½Π΅ ΠΌΠΈ успСа. Но, Π½Π΅ΠΎΠ΄Π°ΠΌΠ½Π° ΠΎΠ΄Ρ€ΠΆΠ°Π² Π²Π΅Π±ΠΈΠ½Π°Ρ€ ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ Π·Π±ΠΎΡ€ΡƒΠ²Π°Π² Π·Π° Hadoop ΠΈ ΠΊΠ°ΠΊΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€Π° MapReduce. Π’Π°ΠΌΡƒ ΠΌΠΈ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ˜Π° ΠΏΡ€Π°ΡˆΠ°ΡšΠ΅: β€žΠ—ΠΎΡˆΡ‚ΠΎ Π΄Π° Π½Π΅ Π³ΠΎ користам Tarantool Π·Π° ΠΎΠ²Π°Π° Π·Π°Π΄Π°Ρ‡Π°?

Од љубопитност, Ρ€Π΅ΡˆΠΈΠ² Π΄Π° сС Π²Ρ€Π°Ρ‚Π°ΠΌ Π½Π° Π½Π΅Π³ΠΎ, Π΄Π° ја тСстирам Π½Π°Ρ˜Π½ΠΎΠ²Π°Ρ‚Π° Π²Π΅Ρ€Π·ΠΈΡ˜Π° - ΠΈ овој ΠΏΠ°Ρ‚ навистина ΠΌΠΈ сС Π΄ΠΎΠΏΠ°Π΄Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΡ‚. Π‘Π΅Π³Π° ќС Π²ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ°ΠΌ ΠΊΠ°ΠΊΠΎ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Сдноставна Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π²ΠΎ Tarantool, Π΄Π° ја Π²Ρ‡ΠΈΡ‚Π°Ρ‚Π΅ ΠΈ Π΄Π° Π³ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ Π½Π΅Ρ˜Π·ΠΈΠ½ΠΈΡ‚Π΅ пСрформанси ΠΈ ќС Π²ΠΈΠ΄ΠΈΡ‚Π΅ ΠΊΠΎΠ»ΠΊΡƒ Π΅ сè лСсно ΠΈ ΠΊΡƒΠ».

Π’ΠΎ Tarantool, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Ρ‚Π΅ супСрбрза Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° со Π½ΠΈΠ². Π•Π²Π΅ ΠΊΠΎΠ»ΠΊΡƒ Π΅ лСсно Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ

Π¨Ρ‚ΠΎ Π΅ Tarantool

Tarantool сС ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€Π° ΠΊΠ°ΠΊΠΎ ΡƒΠ»Ρ‚Ρ€Π° Π±Ρ€Π·Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ставитС ΠΊΠ°ΠΊΠ²ΠΈ Π±ΠΈΠ»ΠΎ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΡˆΡ‚ΠΎ сакатС. ΠŸΠ»ΡƒΡ, Ρ€Π΅ΠΏΠ»ΠΈΡ†ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Π³ΠΈ, Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚ΠΈ - Ρ‚.Π΅. Ρ€Π°Π·Π΄Π΅Π»Π΅Ρ‚Π΅ ΠΎΠ³Ρ€ΠΎΠΌΠ½ΠΎ количСство ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π½Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ сСрвСри ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Ρ˜Ρ‚Π΅ Π³ΠΈ Ρ€Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈΡ‚Π΅ ΠΎΠ΄ Π½ΠΈΠ² - Π½Π°ΠΏΡ€Π°Π²Π΅Ρ‚Π΅ мастСр-мастСр врски Ρ‚ΠΎΠ»Π΅Ρ€Π°Π½Ρ‚Π½ΠΈ Π·Π° Π³Ρ€Π΅ΡˆΠΊΠΈ.

Π’Ρ‚ΠΎΡ€ΠΎ, ΠΎΠ²Π° Π΅ сСрвСр Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΈ ΠΏΠΈΡˆΡƒΠ²Π°Ρ‚Π΅ Π²Π°ΡˆΠΈΡ‚Π΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π½Π° Π½Π΅Π³ΠΎ, Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ со ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π° Π±Ρ€ΠΈΡˆΠ΅Ρ‚Π΅ стари записи Π²ΠΎ ΠΏΠΎΠ·Π°Π΄ΠΈΠ½Π° спорСд ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ΠΈ ΠΏΡ€Π°Π²ΠΈΠ»Π°. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Http сСрвСр Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π²ΠΎ Tarantula ΡˆΡ‚ΠΎ ќС Ρ€Π°Π±ΠΎΡ‚ΠΈ со ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ: Π΄Π°Ρ˜Ρ‚Π΅ ја Π½ΠΈΠ²Π½Π°Ρ‚Π° ΠΊΠΎΠ»ΠΈΡ‡ΠΈΠ½Π°, Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ Π½ΠΎΠ²ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Ρ‚Π°ΠΌΡƒ ΠΈ Π΄Π° Π³ΠΎ Π½Π°ΠΌΠ°Π»ΠΈΡ‚Π΅ сСто Π½Π° Π³Π»Π°Π²Π½ΠΈΠΎΡ‚.

ΠŸΡ€ΠΎΡ‡ΠΈΡ‚Π°Π² ΡΡ‚Π°Ρ‚ΠΈΡ˜Π° Π·Π° Ρ‚ΠΎΠ° ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΌΡ†ΠΈΡ‚Π΅ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ˜Π° Ρ€Π΅Π΄ΠΈΡ†Π° Π·Π° ΠΏΠΎΡ€Π°ΠΊΠΈ ΠΎΠ΄ 300 Π»ΠΈΠ½ΠΈΠΈ, ΡˆΡ‚ΠΎ Сдноставно ΠΏΡƒΠΊΠ° ΠΈ Π±Ρ€Π·Π° - Ρ‚ΠΈΠ΅ ΠΈΠΌΠ°Π°Ρ‚ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½Π° ΠΈΠ·Π²Π΅Π΄Π±Π° ΠΎΠ΄ 20 ΠΏΠΎΡ€Π°ΠΊΠΈ Π²ΠΎ сСкунда. ОвдС навистина ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС свртитС ΠΈ Π΄Π° Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΌΠ½ΠΎΠ³Ρƒ Π³ΠΎΠ»Π΅ΠΌΠ° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°, Π° Ρ‚ΠΎΠ° Π½Π΅ΠΌΠ° Π΄Π° Π±ΠΈΠ΄Π΅ ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅, ΠΊΠ°ΠΊΠΎ Π²ΠΎ PostgreS.

ЌС сС ΠΎΠ±ΠΈΠ΄Π°ΠΌ Π΄Π° опишам Π½Π΅ΡˆΡ‚ΠΎ ΠΊΠ°ΠΊΠΎ овој сСрвСр, само Сдноставно, Π²ΠΎ ΠΎΠ²Π°Π° ΡΡ‚Π°Ρ‚ΠΈΡ˜Π°.

Π˜Π½ΡΡ‚Π°Π»Π°Ρ†ΠΈΡ˜Π°

Π—Π° тСстот, Π·Π°ΠΏΠΎΡ‡Π½Π°Π² Ρ‚Ρ€ΠΈ стандардни Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½ΠΈ машини - Ρ…Π°Ρ€Π΄ диск ΠΎΠ΄ 20 GB, Ubuntu 18.04. 2 Π²ΠΈΡ€Ρ‚ΡƒΠ΅Π»Π½ΠΈ процСсори ΠΈ 4 Π³ΠΈΠ³Π° ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°.

Π“ΠΎ инсталирамС Tarantool - ΡΡ‚Π°Ρ€Ρ‚ΡƒΠ²Π°Ρ˜Ρ‚Π΅ ја баш скриптата ΠΈΠ»ΠΈ Π΄ΠΎΠ΄Π°Π²Π°ΠΌΠ΅ ΡΠΊΠ»Π°Π΄ΠΈΡˆΡ‚Π΅ ΠΈ Π½Π°ΠΏΡ€Π°Π²Π΅Ρ‚Π΅ Π³ΠΎ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎ ΠΈΠ½ΡΡ‚Π°Π»ΠΈΡ€Π°ΡšΠ΅ Π½Π° Tarantool. Врска Π΄ΠΎ скрипта - (Π½Π°Π²ΠΈΠ²Π°ΠΌ -L https://tarantool.io/installer.sh | VER=2.4 судо -Π• баш). ИмамС ΠΊΠΎΠΌΠ°Π½Π΄ΠΈ ΠΊΠ°ΠΊΠΎ ΡˆΡ‚ΠΎ сС:

tarantoolctl β€” Π³Π»Π°Π²Π½Π°Ρ‚Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° Π·Π° ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°ΡšΠ΅ со ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ Π½Π° Π’Π°Ρ€Π°Π½Ρ‚ΡƒΠ»Π°.
/etc/tarantool - Ρ‚ΡƒΠΊΠ° Π΅ Ρ†Π΅Π»Π°Ρ‚Π° ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°.
var/log/tarantool - Π΅Π²Π΅ Π³ΠΈ Ρ‚Ρ€ΡƒΠΏΡ†ΠΈΡ‚Π΅.
var/lib/tarantool β€” ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ Π»Π΅ΠΆΠ°Ρ‚ ΠΎΠ²Π΄Π΅, Π° ΠΏΠΎΡ‚ΠΎΠ° сС Π΄Π΅Π»Π°Ρ‚ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈ.

ΠŸΠΎΡΡ‚ΠΎΡ˜Π°Ρ‚ ΠΏΠ°ΠΏΠΊΠΈ ΠΊΠΎΠΈ сС достапни Π·Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π°ΡšΠ΅ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ - Π³ΠΎ содрТи ΠΎΠ½Π° ΡˆΡ‚ΠΎ ќС сС Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π° - конфигурациска Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π·Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ со Π»ΡƒΠ° ΠΊΠΎΠ΄, која ΠΎΠΏΠΈΡˆΡƒΠ²Π° Π½Π° ΠΊΠΎΠΈ ΠΏΠΎΡ€Ρ‚ΠΈ ΡΠ»ΡƒΡˆΠ°, ΠΊΠ°ΠΊΠ²Π° ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π° Π΅ достапна Π·Π° Π½Π΅Π³ΠΎ, поставки Π·Π° Π²ΠΈΠ½ΠΈΠ» ΠΌΠΎΡ‚ΠΎΡ€ΠΎΡ‚, ΠΊΠΎΠ΄ ΡˆΡ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΏΡ€ΠΈ ΡΡ‚Π°Ρ€Ρ‚ΡƒΠ²Π°ΡšΠ΅ сСрвСри, ΡΠΏΠΎΠ΄Π΅Π»ΡƒΠ²Π°ΡšΠ΅, Ρ€Π΅Π΄ΠΈΡ†ΠΈ, Π±Ρ€ΠΈΡˆΠ΅ΡšΠ΅ Π½Π° застарСни ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΈΡ‚Π½.

Π˜Π½ΡΡ‚Π°Π½Ρ†ΠΈΡ‚Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ ΠΊΠ°ΠΊΠΎ Π²ΠΎ PostgreS. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, сакатС Π΄Π° ΠΈΠ·Π²Ρ€ΡˆΠΈΡ‚Π΅ Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΊΠΎΠΏΠΈΠΈ ΠΎΠ΄ Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΡˆΡ‚ΠΎ виси Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΠΎΡ€Ρ‚ΠΈ. Π˜Π·Π»Π΅Π³ΡƒΠ²Π° Π΄Π΅ΠΊΠ° Π½Π΅ΠΊΠΎΠ»ΠΊΡƒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ†ΠΈ Π½Π° Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ сС лансирани Π½Π° Π΅Π΄Π΅Π½ сСрвСр, ΠΊΠΎΠΈ висат Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΠΎΡ€Ρ‚ΠΈ. Π’ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ°Π°Ρ‚ сосСма Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ поставки - Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ спровСдува Π΅Π΄Π½Π° Π»ΠΎΠ³ΠΈΠΊΠ°, Π²Ρ‚ΠΎΡ€ΠΈΠΎΡ‚ - Π΄Ρ€ΡƒΠ³.

Π£ΠΏΡ€Π°Π²ΡƒΠ²Π°ΡšΠ΅ со инстанци

Ја ΠΈΠΌΠ°ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° tarantoolctl, која Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡƒΠ²Π° Π΄Π° ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°Ρ‚Π΅ со ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΈΡ‚Π΅ Π½Π° Tarantula. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ‚ Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° tarantoolctl ќС ја ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈ конфигурациската Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° ΠΈ ќС ΠΊΠ°ΠΆΠ΅ - Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° Π΅ Π²ΠΎ Ρ€Π΅Π΄ Π°ΠΊΠΎ Ρ‚Π°ΠΌΡƒ Π½Π΅ΠΌΠ° синтаксички Π³Ρ€Π΅ΡˆΠΊΠΈ.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ Π²ΠΈΠ΄ΠΈΡ‚Π΅ статусот Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ‚ - ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π·Π° статус tarantoolctl. На ист Π½Π°Ρ‡ΠΈΠ½ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ старт, стоп, рСстарт.

ΠžΡ‚ΠΊΠ°ΠΊΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΊΠΎΡ‚ Ρ€Π°Π±ΠΎΡ‚ΠΈ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС ΠΏΠΎΠ²Ρ€Π·Π΅Ρ‚Π΅ со Π½Π΅Π³ΠΎ Π½Π° Π΄Π²Π° Π½Π°Ρ‡ΠΈΠ½Π°.

1. Административна ΠΊΠΎΠ½Π·ΠΎΠ»Π°

Π‘Ρ‚Π°Π½Π΄Π°Ρ€Π΄Π½ΠΎ, Tarantool ΠΎΡ‚Π²ΠΎΡ€Π° ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊ, Ρ‚Π°ΠΌΡƒ сС ΠΈΡΠΏΡ€Π°ΡœΠ° Π½ΠΎΡ€ΠΌΠ°Π»Π΅Π½ ASCII тСкст Π·Π° Π΄Π° Π³ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€Π° Tarantool. ΠŸΠΎΠ²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅Ρ‚ΠΎ со ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° сСкогаш сС случува ΠΏΠΎΠ΄ административниот корисник, Π½Π΅ΠΌΠ° Π°Π²Ρ‚Π΅Π½Ρ‚ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ Π½Π΅ΠΌΠ° ΠΏΠΎΡ‚Ρ€Π΅Π±Π° Π΄Π° сС СкстСрнализира ΠΏΡ€ΠΈΡΡ‚Π°Π½ΠΈΡˆΡ‚Π΅Ρ‚ΠΎ Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° Π·Π° ΡƒΠΏΡ€Π°Π²ΡƒΠ²Π°ΡšΠ΅ со Tarantula.

Π—Π° Π΄Π° сС ΠΏΠΎΠ²Ρ€Π·Π΅Ρ‚Π΅ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ овој ΠΌΠ΅Ρ‚ΠΎΠ΄, Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΎ внСсСтС Tarantoolctl внСсСтС Π³ΠΎ ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΡ‚. ΠšΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ќС ја стартува ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° ΠΈ ќС сС ΠΏΠΎΠ²Ρ€Π·Π΅ ΠΊΠ°ΠΊΠΎ администратор. Никогаш Π½Π΅ ја ΠΈΠ·Π»ΠΎΠΆΡƒΠ²Π°Ρ˜Ρ‚Π΅ ΠΏΠΎΡ€Ρ‚Π°Ρ‚Π° Π½Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π°Ρ‚Π° Π½Π°Π½Π°Π΄Π²ΠΎΡ€ - ΠΏΠΎΠ΄ΠΎΠ±Ρ€ΠΎ Π΅ Π΄Π° ја оставитС ΠΊΠ°ΠΊΠΎ ΠΏΡ€ΠΈΠΊΠ»ΡƒΡ‡ΠΎΠΊ Π·Π° Π΅Π΄ΠΈΠ½ΠΈΡ†Π°. Вогаш само ΠΎΠ½ΠΈΠ΅ ΠΊΠΎΠΈ ΠΈΠΌΠ°Π°Ρ‚ пристап Π΄Π° ΠΏΠΈΡˆΡƒΠ²Π°Π°Ρ‚ Π΄ΠΎ ΡˆΡ‚Π΅ΠΊΠ΅Ρ€ΠΎΡ‚ ќС ΠΌΠΎΠΆΠ°Ρ‚ Π΄Π° сС ΠΏΠΎΠ²Ρ€Π·Π°Ρ‚ со Π’Π°Ρ€Π°Π½Ρ‚ΡƒΠ»Π°.

Овој ΠΌΠ΅Ρ‚ΠΎΠ΄ Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π΅Π½ Π·Π° административни Ρ€Π°Π±ΠΎΡ‚ΠΈ. Π—Π° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΡ‚Π΅ со ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, користСтС Π³ΠΎ Π²Ρ‚ΠΎΡ€ΠΈΠΎΡ‚ ΠΌΠ΅Ρ‚ΠΎΠ΄ - Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΎΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ».

2. ΠšΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° Π±ΠΈΠ½Π°Ρ€Π΅Π½ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» Π·Π° ΠΏΠΎΠ²Ρ€Π·ΡƒΠ²Π°ΡšΠ΅ со ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½Π° ΠΏΠΎΡ€Ρ‚Π°

ΠšΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΡ˜Π°Ρ‚Π° содрТи Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° Π·Π° ΡΠ»ΡƒΡˆΠ°ΡšΠ΅, која ΠΎΡ‚Π²ΠΎΡ€Π° ΠΏΠΎΡ€Ρ‚Π° Π·Π° Π½Π°Π΄Π²ΠΎΡ€Π΅ΡˆΠ½ΠΈ ΠΊΠΎΠΌΡƒΠ½ΠΈΠΊΠ°Ρ†ΠΈΠΈ. Оваа ΠΏΠΎΡ€Ρ‚Π° сС користи со Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΎΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» ΠΈ Ρ‚Π°ΠΌΡƒ Π΅ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΠ΅Π½Π° Π°Π²Ρ‚Π΅Π½Ρ‚ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°.

Π—Π° ΠΎΠ²Π°Π° врска сС користи tarantoolctl connect to Π±Ρ€ΠΎΡ˜ Π½Π° ΠΏΠΎΡ€Ρ‚Π°. ΠšΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ Π³ΠΎ, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° сС ΠΏΠΎΠ²Ρ€Π·Π΅Ρ‚Π΅ со ΠΎΠ΄Π΄Π°Π»Π΅Ρ‡Π΅Π½ΠΈ сСрвСри, Π΄Π° користитС Π°Π²Ρ‚Π΅Π½Ρ‚ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° ΠΈ Π΄Π° Π΄ΠΎΠ΄Π΅Π»ΡƒΠ²Π°Ρ‚Π΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΡ€Π°Π²Π° Π·Π° пристап.

ΠœΠΎΠ΄ΡƒΠ» Π·Π° снимањС Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΈ ΠΊΡƒΡ‚ΠΈΡ˜Π°

Π‘ΠΈΠ΄Π΅Ρ˜ΡœΠΈ Tarantool Π΅ ΠΈ Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΈ сСрвСр Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ, Ρ‚ΠΎΡ˜ ΠΈΠΌΠ° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ. НиС смС заинтСрСсирани Π·Π° ΠΌΠΎΠ΄ΡƒΠ»ΠΎΡ‚ ΠΊΡƒΡ‚ΠΈΡ˜Π° - Ρ‚ΠΎΡ˜ спровСдува Ρ€Π°Π±ΠΎΡ‚Π° со ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. Кога ΠΏΠΈΡˆΡƒΠ²Π°Ρ‚Π΅ Π½Π΅ΡˆΡ‚ΠΎ Π²ΠΎ ΠΊΡƒΡ‚ΠΈΡ˜Π°, Tarantool Π³ΠΈ Π·Π°ΠΏΠΈΡˆΡƒΠ²Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ Π½Π° дискот, Π³ΠΈ складира Π²ΠΎ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π° ΠΈΠ»ΠΈ ΠΏΡ€Π°Π²ΠΈ Π½Π΅ΡˆΡ‚ΠΎ Π΄Ρ€ΡƒΠ³ΠΎ со Π½ΠΈΠ².

Π Π΅ΠΊΠΎΡ€Π΄

На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π²Π»Π΅Π³ΡƒΠ²Π°ΠΌΠ΅ Π²ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΠΎΡ‚ box ΠΈ ја ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π°ΠΌΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° box.one. Ова ќС Π³ΠΎ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈ Tarantool Π΄Π° Π³ΠΎ ΠΈΠ·Π²Ρ€ΡˆΠΈ Π½Π°ΡˆΠΈΠΎΡ‚ ΠΊΠΎΠ΄ ΠΊΠΎΠ³Π° сСрвСрот Π΅ ΠΈΠ½ΠΈΡ†ΠΈΡ˜Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½. Π‘ΠΎΠ·Π΄Π°Π²Π°ΠΌΠ΅ простор Π²ΠΎ кој ќС сС Ρ‡ΡƒΠ²Π°Π°Ρ‚ Π½Π°ΡˆΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ.

local function bootstrap()
    local space = box.schema.create_space('example')
    space:create_index('primary')
    box.schema.user.grant('guest', 'read,write,execute', 'universe')

    -- Keep things safe by default
    --  box.schema.user.create('example', { password = 'secret' })
    --  box.schema.user.grant('example', 'replication')
    --  box.schema.user.grant('example', 'read,write,execute', 'space', 'example')
end

По ΠΎΠ²Π°, создавамС ΠΏΡ€ΠΈΠΌΠ°Ρ€Π΅Π½ индСкс - ΠΏΡ€ΠΈΠΌΠ°Ρ€Π΅Π½ - со кој ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π±Π°Ρ€Π°ΠΌΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Π΄Π½ΠΎ, Π°ΠΊΠΎ Π½Π΅ Π½Π°Π²Π΅Π΄Π΅Ρ‚Π΅ Π½ΠΈΠΊΠ°ΠΊΠ²ΠΈ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈ, ΠΏΡ€Π²ΠΎΡ‚ΠΎ ΠΏΠΎΠ»Π΅ Π²ΠΎ сСкој запис ќС сС користи Π·Π° ΠΏΡ€ΠΈΠΌΠ°Ρ€Π½ΠΈΠΎΡ‚ индСкс.

ΠŸΠΎΡ‚ΠΎΠ° ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ Π³Ρ€Π°Π½Ρ‚ Π½Π° гостинот, ΠΏΠΎΠ΄ кој сС ΠΏΠΎΠ²Ρ€Π·ΡƒΠ²Π°ΠΌΠ΅ ΠΏΡ€Π΅ΠΊΡƒ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΎΡ‚ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ». Π”ΠΎΠ·Π²ΠΎΠ»ΡƒΠ²Π°ΠΌΠ΅ Ρ‡ΠΈΡ‚Π°ΡšΠ΅, ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅ ΠΈ ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°ΡšΠ΅ Π½ΠΈΠ· Ρ†Π΅Π»ΠΈΠΎΡ‚ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΊ.

Π’ΠΎ спорСдба со ΠΊΠΎΠ½Π²Π΅Π½Ρ†ΠΈΠΎΠ½Π°Π»Π½ΠΈΡ‚Π΅ Π±Π°Π·ΠΈ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, сè ΠΎΠ²Π΄Π΅ Π΅ ΠΏΡ€ΠΈΠ»ΠΈΡ‡Π½ΠΎ Сдноставно. ИмамС простор - област Π²ΠΎ која Π½Π°ΡˆΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ сС Сдноставно складирани. БСкој запис сС Π½Π°Ρ€Π΅ΠΊΡƒΠ²Π° Ρ‚ΠΎΡ€ΠΊΠ°. Π‘ΠΏΠ°ΠΊΡƒΠ²Π°Π½ Π΅ Π²ΠΎ MessagePack. Ова Π΅ ΠΌΠ½ΠΎΠ³Ρƒ ΠΊΡƒΠ» Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ - Ρ‚ΠΎΡ˜ Π΅ Π±ΠΈΠ½Π°Ρ€Π΅Π½ ΠΈ Π·Π°Ρ„Π°ΡœΠ° ΠΏΠΎΠΌΠ°Π»ΠΊΡƒ простор - 18 Π±Π°Ρ˜Ρ‚ΠΈ наспроти 27.

Π’ΠΎ Tarantool, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Ρ‚Π΅ супСрбрза Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° со Π½ΠΈΠ². Π•Π²Π΅ ΠΊΠΎΠ»ΠΊΡƒ Π΅ лСсно Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ

БосСма Π΅ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎ Π΄Π° сС Ρ€Π°Π±ΠΎΡ‚ΠΈ со Π½Π΅Π³ΠΎ. РСчиси сСкоја линија, сСкој запис со ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° сосСма Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ.

МоТСмС Π΄Π° Π³ΠΈ ΠΏΡ€Π΅Π³Π»Π΅Π΄Π°ΠΌΠ΅ ситС ΠΏΡ€Π°Π·Π½ΠΈ мСста ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ја ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Box.space. Π—Π° Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅ ΠΎΠ΄Ρ€Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π°ΠΏΠΈΡˆΠ΅Ρ‚Π΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ box.space ΠΈ Π΄ΠΎΠ±ΠΈΡ˜Ρ‚Π΅ цСлосни ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π·Π° Π½Π΅Π³ΠΎ.

Tarantool ΠΈΠΌΠ° Π΄Π²Π° Π²Π³Ρ€Π°Π΄Π΅Π½ΠΈ ΠΌΠΎΡ‚ΠΎΡ€ΠΈ: Memory ΠΈ Vinyl. ΠœΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π° Π³ΠΈ складира ситС ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ Π²ΠΎ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°Ρ‚Π°. Π—Π°Ρ‚ΠΎΠ°, сè Ρ€Π°Π±ΠΎΡ‚ΠΈ Сдноставно ΠΈ Π±Ρ€Π·ΠΎ. ΠŸΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ сС Ρ„Ρ€Π»Π°Π°Ρ‚ Π½Π° дискот, Π° ΠΈΠΌΠ° ΠΈ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·Π°ΠΌ Π·Π° Π΅Π²ΠΈΠ΄Π΅Π½Ρ†ΠΈΡ˜Π° Π·Π° ΠΎΠ΄Π½Π°ΠΏΡ€Π΅Π΄ Π·Π°ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ Π½Π΅ΠΌΠ° Π΄Π° ΠΈΠ·Π³ΡƒΠ±ΠΈΠΌΠ΅ Π½ΠΈΡˆΡ‚ΠΎ Π°ΠΊΠΎ сСрвСрот ΠΏΠ°Π΄Π½Π΅.

Π’ΠΈΠ½ΠΈΠ» Π³ΠΈ складира ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ Π½Π° дискот Π²ΠΎ Ρ„ΠΎΡ€ΠΌΠ° ΡˆΡ‚ΠΎ Π½ΠΈ Π΅ ΠΏΠΎΠΏΠΎΠ·Π½Π°Ρ‚Π° - односно, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° складиратС повСќС ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΎΡ‚ΠΊΠΎΠ»ΠΊΡƒ ΡˆΡ‚ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°, Π° Π’Π°Ρ€Π°Π½Ρ‚ΡƒΠ»Π° ќС Π³ΠΈ Ρ‡ΠΈΡ‚Π° ΠΎΠ΄ дискот.

ЗасСга ќС користимС ΠœΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°.

unix/:/var/run/tarantool/example.control> box.space.example
---
- engine: memtx
  before_replace: 'function: 0x41eb02c8'
  on_replace: 'function: 0x41eb0568'
  ck_constraint: []
  field_count: 0
  temporary: false
  index:
    0: &0
      unique: true
      parts:
      - type: unsigned
        is_nullable: false
        fieldno: 1
      id: 0
      space_id: 512
      type: TREE
      name: primary
    primary: *0
  is_local: false
  enabled: true
  name: example
  id: 512
...

unix/:/var/run/tarantool/example.control>

ИндСкс:

ΠœΠΎΡ€Π° Π΄Π° сС создадС ΠΏΡ€ΠΈΠΌΠ°Ρ€Π΅Π½ индСкс Π·Π° кој Π±ΠΈΠ»ΠΎ простор, бидСјќи Π±Π΅Π· Π½Π΅Π³ΠΎ Π½ΠΈΡˆΡ‚ΠΎ Π½Π΅ΠΌΠ° Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ. Како ΠΈ Π²ΠΎ сСкоја Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, Π³ΠΎ ΠΊΡ€Π΅ΠΈΡ€Π°ΠΌΠ΅ ΠΏΡ€Π²ΠΎΡ‚ΠΎ ΠΏΠΎΠ»Π΅ - ID Π½Π° запис.

Π”Π΅Π»Π°:

ОвдС посочувамС ΠΎΠ΄ ΡˆΡ‚ΠΎ сС состои Π½Π°ΡˆΠΈΠΎΡ‚ индСкс. Π‘Π΅ состои ΠΎΠ΄ Π΅Π΄Π΅Π½ Π΄Π΅Π» - ΠΏΡ€Π²ΠΎΡ‚ΠΎ ΠΏΠΎΠ»Π΅ ΡˆΡ‚ΠΎ ќС Π³ΠΎ користимС Π΅ ΠΎΠ΄ Ρ‚ΠΈΠΏΠΎΡ‚ Π½Π΅ΠΏΠΎΡ‚ΠΏΠΈΡˆΠ°Π½ΠΎ - ΠΏΠΎΠ·ΠΈΡ‚ΠΈΠ²Π΅Π½ Ρ†Π΅Π» Π±Ρ€ΠΎΡ˜. ΠšΠΎΠ»ΠΊΡƒ ΡˆΡ‚ΠΎ сС сСќавам ΠΎΠ΄ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡ˜Π°Ρ‚Π°, максималната Π±Ρ€ΠΎΡ˜ΠΊΠ° ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΠΈΠ΄Π΅ Π΅ 18 ΠΊΠ²ΠΈΠ½Ρ‚ΠΈΠ»ΠΈΠΎΠ½ΠΈ. Π’ΠΎΠ° Π΅ ΠΌΠ½ΠΎΠ³Ρƒ.

ΠŸΠΎΡ‚ΠΎΠ° ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π²ΠΌΠ΅Ρ‚Π½Π΅ΠΌΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ја ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Π·Π° Π²Π½Π΅ΡΡƒΠ²Π°ΡšΠ΅.

unix/:/var/run/tarantool/example.control> box.space.example:insert{1, 'test1', 'test2'}
---
- [1, 'test1', 'test2']
...

unix/:/var/run/tarantool/example.control> box.space.example:insert{2, 'test2', 'test3', 'test4'}
---
- [2, 'test2', 'test3', 'test4']
...

unix/:/var/run/tarantool/example.control> box.space.example:insert{3, 'test3'}
---
- [3, 'test3']
...

unix/:/var/run/tarantool/example.control> box.space.example:insert{4, 'test4'}
---
- [4, 'test4']
...

unix/:/var/run/tarantool/example.control>

ΠŸΡ€Π²ΠΎΡ‚ΠΎ ΠΏΠΎΠ»Π΅ сС користи ΠΊΠ°ΠΊΠΎ ΠΏΡ€ΠΈΠΌΠ°Ρ€Π΅Π½ ΠΊΠ»ΡƒΡ‡, ΠΏΠ° Π·Π°Ρ‚ΠΎΠ° ΠΌΠΎΡ€Π° Π΄Π° Π±ΠΈΠ΄Π΅ СдинствСн. НС смС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈ со Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° ΠΊΠΎΠ»ΠΎΠ½ΠΈ, ΠΏΠ° ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π²ΠΌΠ΅Ρ‚Π½Π΅ΠΌΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΊΠΎΠ»ΠΊΡƒ ΡˆΡ‚ΠΎ сакамС Ρ‚Π°ΠΌΡƒ. Π’ΠΈΠ΅ сС Π½Π°Π²Π΅Π΄Π΅Π½ΠΈ Π²ΠΎ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΡ‚ MessagePack, ΡˆΡ‚ΠΎ Π³ΠΎ опишав ΠΏΠΎΠ³ΠΎΡ€Π΅.

ИзлСз Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ

ΠŸΠΎΡ‚ΠΎΠ° ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΈ ΠΏΡ€ΠΈΠΊΠ°ΠΆΠ΅ΠΌΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ ΠΊΠΎΡ€ΠΈΡΡ‚Π΅Ρ˜ΡœΠΈ ја ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅.

Box.example.select со ΠΊΠΎΠΏΡ‡Π΅Ρ‚ΠΎ {1} ќС Π³ΠΎ ΠΏΡ€ΠΈΠΊΠ°ΠΆΠ΅ саканиот запис. Ако Π³ΠΎ ΡΠΏΡƒΡˆΡ‚ΠΈΠΌΠ΅ ΠΊΠ»ΡƒΡ‡ΠΎΡ‚, ќС Π³ΠΈ Π²ΠΈΠ΄ΠΈΠΌΠ΅ ситС записи ΡˆΡ‚ΠΎ Π³ΠΈ ΠΈΠΌΠ°ΠΌΠ΅. Π‘ΠΈΡ‚Π΅ Ρ‚ΠΈΠ΅ сС Ρ€Π°Π·Π»ΠΈΠΊΡƒΠ²Π°Π°Ρ‚ ΠΏΠΎ Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° ΠΊΠΎΠ»ΠΎΠ½ΠΈ, Π½ΠΎ ΠΎΠ²Π΄Π΅, Π²ΠΎ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏ, Π½Π΅ постои ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ Π½Π° ΠΊΠΎΠ»ΠΎΠ½ΠΈ - ΠΈΠΌΠ° Π±Ρ€ΠΎΠ΅Π²ΠΈ Π½Π° полиња.

МоТС Π΄Π° ΠΈΠΌΠ° апсолутно сСкаква ΠΊΠΎΠ»ΠΈΡ‡ΠΈΠ½Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. И Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΈ Π±Π°Ρ€Π°ΠΌΠ΅ ΠΏΠΎ Π²Ρ‚ΠΎΡ€ΠΎΡ‚ΠΎ ΠΏΠΎΠ»Π΅. Π—Π° Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ ΠΎΠ²Π°, создавамС Π½ΠΎΠ² сСкундарСн индСкс.


box.space.example:create_index( β€˜secondary’, { type = β€˜TREE’, unique = false, parts = {{field = 2, type =’string’} }}) 

Ја користимС ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° Create_index.
Π”Π° Π³ΠΎ Π½Π°Ρ€Π΅Ρ‡Π΅ΠΌΠ΅ Π‘Π΅ΠΊΡƒΠ½Π΄Π°Ρ€Π½ΠΎ.

По ΠΎΠ²Π° Ρ‚Ρ€Π΅Π±Π° Π΄Π° Π³ΠΈ Π½Π°Π²Π΅Π΄Π΅Ρ‚Π΅ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΡ‚Π΅. Π’ΠΈΠΏΠΎΡ‚ Π½Π° индСкс Π΅ Π”Π Π’Πž. МоТСби Π½Π΅ Π΅ СдинствСн, Π·Π°Ρ‚ΠΎΠ° внСсСтС Unique = false.

ΠŸΠΎΡ‚ΠΎΠ° посочувамС ΠΎΠ΄ ΠΊΠΎΠΈ Π΄Π΅Π»ΠΎΠ²ΠΈ сС состои Π½Π°ΡˆΠΈΠΎΡ‚ индСкс. ПолС Π΅ Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° ΠΏΠΎΠ»Π΅Ρ‚ΠΎ Π·Π° ΠΊΠΎΠ΅ Π³ΠΎ Π²Ρ€Π·ΡƒΠ²Π°ΠΌΠ΅ индСксот ΠΈ Π³ΠΎ ΠΎΠ΄Ρ€Π΅Π΄ΡƒΠ²Π°ΠΌΠ΅ Ρ‚ΠΈΠΏΠΎΡ‚ Π½Π° стрингот. И Ρ‚Π°ΠΊΠ° Π΅ создадСно.

unix/:/var/run/tarantool/example.control> box.space.example:create_index('secondary', { type = 'TREE', unique = false, parts = {{field = 2, type = 'string'}}})
---
- unique: false
  parts:
  - type: string
    is_nullable: false
    fieldno: 2
  id: 1
  space_id: 512
  type: TREE
  name: secondary
...

unix/:/var/run/tarantool/example.control>

Π‘Π΅Π³Π° Π²Π°ΠΊΠ° ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΎ Π½Π°Ρ€Π΅Ρ‡Π΅ΠΌΠ΅:

unix/:/var/run/tarantool/example.control> box.space.example.index.secondary:select('test1')
---
- - [1, 'test1', 'test2']
...

Π—Π°ΡˆΡ‚ΠΈΡ‚Π°

Ако ја рСстартирамС инстанцата ΠΈ сС ΠΎΠ±ΠΈΠ΄Π΅ΠΌΠ΅ ΠΏΠΎΠ²Ρ‚ΠΎΡ€Π½ΠΎ Π΄Π° Π³ΠΈ ΠΏΠΎΠ²ΠΈΠΊΠ°ΠΌΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅, ќС Π²ΠΈΠ΄ΠΈΠΌΠ΅ Π΄Π΅ΠΊΠ° Π³ΠΈ Π½Π΅ΠΌΠ° - сè Π΅ ΠΏΡ€Π°Π·Π½ΠΎ. Ова сС случува Π·Π°Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ Tarantool ΠΏΡ€Π°Π²ΠΈ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½ΠΈ Ρ‚ΠΎΡ‡ΠΊΠΈ ΠΈ Π³ΠΈ Π·Π°Ρ‡ΡƒΠ²ΡƒΠ²Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ Π½Π° дискот, Π½ΠΎ Π°ΠΊΠΎ прСстанСмС Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈΠΌΠ΅ Π΄ΠΎ слСдното Π·Π°Ρ‡ΡƒΠ²ΡƒΠ²Π°ΡšΠ΅, ќС Π³ΠΈ ΠΈΠ·Π³ΡƒΠ±ΠΈΠΌΠ΅ ситС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ - Π·Π°Ρ‚ΠΎΠ° ΡˆΡ‚ΠΎ ќС сС ΠΎΠΏΠΎΡ€Π°Π²ΠΈΠΌΠ΅ ΠΎΠ΄ послСдната ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ°, која бСшС, Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΏΡ€Π΅Π΄ Π΄Π²Π° часа.

НСма Π΄Π° Ρ€Π°Π±ΠΎΡ‚ΠΈ Π½ΠΈΡ‚Ρƒ Π΄Π° сС Π·Π°Ρ‡ΡƒΠ²ΡƒΠ²Π° сСкоја сСкунда, бидСјќи ΠΏΠΎΡΡ‚ΠΎΡ˜Π°Π½ΠΎΡ‚ΠΎ Ρ„Ρ€Π»Π°ΡšΠ΅ 20 GB Π½Π° дискот Π½Π΅ Π΅ Π΄ΠΎΠ±Ρ€Π° идСја.

Π—Π° Ρ‚Π°Π° Ρ†Π΅Π», бСшС измислСн ΠΈ ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Π½ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ‚ΠΎΡ‚ Π½Π° Π΄Π½Π΅Π²Π½ΠΈΠΊ Π·Π° ΠΎΠ΄Π½Π°ΠΏΡ€Π΅Π΄ Π·Π°ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅. Π‘ΠΎ Π½Π΅Π³ΠΎΠ²Π° помош, Π·Π° сСкоја ΠΏΡ€ΠΎΠΌΠ΅Π½Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅, сС ΠΊΡ€Π΅ΠΈΡ€Π° запис Π²ΠΎ ΠΌΠ°Π»Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ° Π·Π° Π΅Π²ΠΈΠ΄Π΅Π½Ρ†ΠΈΡ˜Π° Π·Π° ΠΎΠ΄Π½Π°ΠΏΡ€Π΅Π΄ Π·Π°ΠΏΠΈΡˆΡƒΠ²Π°ΡšΠ΅.

БСкој Π²Π»Π΅Π· Π΄ΠΎ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½ΠΈΠΎΡ‚ ΠΏΡƒΠ½ΠΊΡ‚ сС Ρ‡ΡƒΠ²Π° Π²ΠΎ Π½ΠΈΠ². Π—Π° ΠΎΠ²ΠΈΠ΅ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠΈ ја поставувамС Π³ΠΎΠ»Π΅ΠΌΠΈΠ½Π°Ρ‚Π° - Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 64 MB. Кога Π΅ ΠΏΠΎΠ»Π½Π°, ΡΠ½ΠΈΠΌΠ°ΡšΠ΅Ρ‚ΠΎ Π·Π°ΠΏΠΎΡ‡Π½ΡƒΠ²Π° Π΄Π° ΠΎΠ΄ΠΈ Π²ΠΎ Π²Ρ‚ΠΎΡ€Π°Ρ‚Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°. И ΠΏΠΎ Ρ€Π΅ΡΡ‚Π°Ρ€Ρ‚ΠΈΡ€Π°ΡšΠ΅Ρ‚ΠΎ, Tarantool сС Π²Ρ€Π°ΡœΠ° ΠΎΠ΄ послСдната ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° ΠΈ ΠΏΠΎΡ‚ΠΎΠ° Π³ΠΈ ΠΏΡ€Π΅Π²Ρ€Ρ‚ΡƒΠ²Π° ситС ΠΏΠΎΠ΄ΠΎΡ†Π½Π΅ΠΆΠ½ΠΈ трансакции Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π΅ прСстанС.

Π’ΠΎ Tarantool, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Ρ‚Π΅ супСрбрза Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π·Π° Ρ€Π°Π±ΠΎΡ‚Π° со Π½ΠΈΠ². Π•Π²Π΅ ΠΊΠΎΠ»ΠΊΡƒ Π΅ лСсно Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ

Π—Π° Π΄Π° ΠΈΠ·Π²Ρ€ΡˆΠΈΡ‚Π΅ Ρ‚Π°ΠΊΠ²ΠΎ снимањС, Ρ‚Ρ€Π΅Π±Π° Π΄Π° ја Π½Π°Π²Π΅Π΄Π΅Ρ‚Π΅ ΠΎΠΏΡ†ΠΈΡ˜Π°Ρ‚Π° Π²ΠΎ поставкитС Π½Π° box.cfg (Π²ΠΎ Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°Ρ‚Π° example.lua):

wal_mode = β€œwrite”;

ΠΊΠΎΡ€ΠΈΡΡ‚Π΅ΡšΠ΅ Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ

Π‘ΠΎ ΠΎΠ²Π° ΡˆΡ‚ΠΎ Π³ΠΎ напишавмС сСга, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ја користитС Tarantula Π·Π° ΡΠΊΠ»Π°Π΄ΠΈΡ€Π°ΡšΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ΠΈ Ρ‚Π°Π° ќС Ρ€Π°Π±ΠΎΡ‚ΠΈ ΠΌΠ½ΠΎΠ³Ρƒ Π±Ρ€Π·ΠΎ ΠΊΠ°ΠΊΠΎ Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. И сСга ΡˆΠ»Π°Π³ΠΎΡ‚ Π½Π° Ρ‚ΠΎΡ€Ρ‚Π°Ρ‚Π° Π΅ ΠΎΠ½Π° ΡˆΡ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈΡ‚Π΅ со сСто Ρ‚ΠΎΠ°.

ΠŸΠΈΡˆΡƒΠ²Π°ΡšΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°

На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄Π° ја напишСмС слСдната Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π° Π·Π° Π’Π°Ρ€Π°Π½Ρ‚ΡƒΠ»Π°

ΠŸΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ ја Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΏΠΎΠ΄ ΡΠΏΠΎΡ˜Π»Π΅Ρ€ΠΎΡ‚

box.cfg {
    listen = '0.0.0.0:3301';
    io_collect_interval = nil;
    readahead = 16320;
    memtx_memory = 128 * 1024 * 1024; -- 128Mb
    memtx_min_tuple_size = 16;
    memtx_max_tuple_size = 128 * 1024 * 1024; -- 128Mb
    vinyl_memory = 128 * 1024 * 1024; -- 128Mb
    vinyl_cache = 128 * 1024 * 1024; -- 128Mb
    vinyl_max_tuple_size = 128 * 1024 * 1024; -- 128Mb
    vinyl_write_threads = 2;
    wal_mode = "write";
    wal_max_size = 256 * 1024 * 1024;
    checkpoint_interval = 60 * 60; -- one hour
    checkpoint_count = 6;
    force_recovery = true;
    log_level = 5;
    log_nonblock = false;
    too_long_threshold = 0.5;
    read_only   = false
}

local function bootstrap()
    local space = box.schema.create_space('example')
    space:create_index('primary')

    box.schema.user.create('example', { password = 'secret' })
    box.schema.user.grant('example', 'read,write,execute', 'space', 'example')

    box.schema.user.create('repl', { password = 'replication' })
    box.schema.user.grant('repl', 'replication')
end

-- for first run create a space and add set up grants
box.once('replica', bootstrap)

-- enabling console access
console = require('console')
console.listen('127.0.0.1:3302')

-- http config
local charset = {}  do -- [0-9a-zA-Z]
    for c = 48, 57  do table.insert(charset, string.char(c)) end
    for c = 65, 90  do table.insert(charset, string.char(c)) end
    for c = 97, 122 do table.insert(charset, string.char(c)) end
end

local function randomString(length)
    if not length or length <= 0 then return '' end
    math.randomseed(os.clock()^5)
    return randomString(length - 1) .. charset[math.random(1, #charset)]
end

local http_router = require('http.router')
local http_server = require('http.server')
local json = require('json')

local httpd = http_server.new('0.0.0.0', 8080, {
    log_requests = true,
    log_errors = true
})

local router = http_router.new()

local function get_count()
 local cnt = box.space.example:len()
 return cnt
end

router:route({method = 'GET', path = '/count'}, function()
    return {status = 200, body = json.encode({count = get_count()})}
end)

router:route({method = 'GET', path = '/token'}, function()
    local token = randomString(32)
    local last = box.space.example:len()
    box.space.example:insert{ last + 1, token }
    return {status = 200, body = json.encode({token = token})}
end)

prometheus = require('prometheus')

fiber = require('fiber')
tokens_count = prometheus.gauge("tarantool_tokens_count",
                              "API Tokens Count")

function monitor_tokens_count()
  while true do
    tokens_count:set(get_count())
    fiber.sleep(5)
  end
end
fiber.create(monitor_tokens_count)

router:route( { method = 'GET', path = '/metrics' }, prometheus.collect_http)

httpd:set_router(router)
httpd:start()

Π˜Π·Ρ˜Π°Π²ΡƒΠ²Π°ΠΌΠ΅ нСкоја Ρ‚Π°Π±Π΅Π»Π° Π²ΠΎ Π»ΡƒΠ° која Π³ΠΈ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ€Π° Π·Π½Π°Ρ†ΠΈΡ‚Π΅. Оваа ΠΏΠ»ΠΎΡ‡Π° Π΅ ΠΏΠΎΡ‚Ρ€Π΅Π±Π½Π° Π·Π° Π΄Π° сС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° случаСн стринг.

local charset = {}  do -- [0-9a-zA-Z]
    for c = 48, 57  do table.insert(charset, string.char(c)) end
    for c = 65, 90  do table.insert(charset, string.char(c)) end
    for c = 97, 122 do table.insert(charset, string.char(c)) end
end

ПослС Ρ‚ΠΎΠ°, ја Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°ΠΌΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° - randomString ΠΈ ја Π΄Π°Π²Π°ΠΌΠ΅ врСдноста Π½Π° Π΄ΠΎΠ»ΠΆΠΈΠ½Π°Ρ‚Π° Π²ΠΎ Π·Π°Π³Ρ€Π°Π΄ΠΈ.

local function randomString(length)
    if not length or length <= 0 then return '' end
    math.randomseed(os.clock()^5)
    return randomString(length - 1) .. charset[math.random(1, #charset)]
end

ΠŸΠΎΡ‚ΠΎΠ° Π³ΠΈ ΠΏΠΎΠ²Ρ€Π·ΡƒΠ²Π°ΠΌΠ΅ http Ρ€ΡƒΡ‚Π΅Ρ€ΠΎΡ‚ ΠΈ http сСрвСрот со Π½Π°ΡˆΠΈΠΎΡ‚ сСрвСр Tarantula, JSON, кој ќС Π³ΠΎ испратимС Π΄ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΎΡ‚.

local http_router = require('http.router')
local http_server = require('http.server')
local json = require('json')

По ΠΎΠ²Π°, Π·Π°ΠΏΠΎΡ‡Π½ΡƒΠ²Π°ΠΌΠ΅ со ΠΏΠΎΡ€Ρ‚Π°Ρ‚Π° 8080 Π½Π° ситС ΠΈΠ½Ρ‚Π΅Ρ€Ρ„Π΅Ρ˜ΡΠΈ Π½Π° сСрвСрот http, ΠΊΠΎΠΈ ќС Π³ΠΈ Π΅Π²ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ€Π°Π°Ρ‚ ситС Π±Π°Ρ€Π°ΡšΠ° ΠΈ Π³Ρ€Π΅ΡˆΠΊΠΈ.

local httpd = http_server.new('0.0.0.0', 8080, {
    log_requests = true,
    log_errors = true
})

Π‘Π»Π΅Π΄Π½ΠΎ, ја Π΄Π΅ΠΊΠ»Π°Ρ€ΠΈΡ€Π°ΠΌΠ΅ Ρ€ΡƒΡ‚Π°Ρ‚Π°, Ρ‚Π°ΠΊΠ° ΡˆΡ‚ΠΎ Π°ΠΊΠΎ пристигнС Π±Π°Ρ€Π°ΡšΠ΅ со ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΡ‚ GET Π½Π° ΠΏΠΎΡ€Ρ‚Π°Ρ‚Π° 8080 /count, Ρ‚ΠΎΠ³Π°Ρˆ ја ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π°ΠΌΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° ΠΎΠ΄ Π΅Π΄Π½Π° линија. Π“ΠΎ Π²Ρ€Π°ΡœΠ° статусот - 200, 404, 403 ΠΈΠ»ΠΈ кој Π±ΠΈΠ»ΠΎ Π΄Ρ€ΡƒΠ³ ΡˆΡ‚ΠΎ ќС Π³ΠΎ Π½Π°Π²Π΅Π΄Π΅ΠΌΠ΅.

router:route({method = 'GET', path = '/count'}, function()
    return {status = 200, body = json.encode({count = get_count()})}
end)

Π’ΠΎ Ρ‚Π΅Π»ΠΎΡ‚ΠΎ Π²Ρ€Π°ΡœΠ°ΠΌΠ΅ json.encode, Π²ΠΎ Π½Π΅Π³ΠΎ ΠΎΠ·Π½Π°Ρ‡ΡƒΠ²Π°ΠΌΠ΅ count ΠΈ getcount, ΡˆΡ‚ΠΎ сС ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π° ΠΈ Π³ΠΎ ΠΏΠΎΠΊΠ°ΠΆΡƒΠ²Π° Π±Ρ€ΠΎΡ˜ΠΎΡ‚ Π½Π° записи Π²ΠΎ Π½Π°ΡˆΠ°Ρ‚Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ.

Π’Ρ‚ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄

router:route({method = 'GET', path = '/token'}, function() 
    local token = randomString(32) 
    local last = box.space.example:len() 
    box.space.example:insert{ last + 1, token } 
    return {status = 200, body = json.encode({token = token})}
end)

КадС Π²ΠΎ Ρ€Π΅Π΄ΠΎΡ‚ Ρ€ΡƒΡ‚Π΅Ρ€: Ρ€ΡƒΡ‚Π° ({method = 'GET', ΠΏΠ°Ρ‚Π΅ΠΊΠ° = '/Ρ‚ΠΎΠΊΠ΅Π½'}, Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°() ја ΠΏΠΎΠ²ΠΈΠΊΡƒΠ²Π°ΠΌΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡ˜Π°Ρ‚Π° ΠΈ Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°ΠΌΠ΅ Ρ‚ΠΎΠΊΠ΅Π½.

Π›ΠΈΠ½ΠΈΡ˜Π° Π»ΠΎΠΊΠ°Π»Π΅Π½ Ρ‚ΠΎΠΊΠ΅Π½ = randomString(32) Π΅ ΡΠ»ΡƒΡ‡Π°Ρ˜Π½Π° Π½ΠΈΠ·Π° ΠΎΠ΄ 32 Π·Π½Π°Ρ†ΠΈ.
Π’ΠΎ линија Π»ΠΎΠΊΠ°Π»Π½ΠΎ послСдно = box.space.example:len() Π³ΠΎ Π²Π°Π΄ΠΈΠΌΠ΅ послСдниот Π΅Π»Π΅ΠΌΠ΅Π½Ρ‚.
И Π²ΠΎ Π»ΠΈΠ½ΠΈΡ˜Π°Ρ‚Π° box.space.example:insert{ last + 1, token } Π³ΠΈ Π·Π°ΠΏΠΈΡˆΡƒΠ²Π°ΠΌΠ΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ Π²ΠΎ Π½Π°ΡˆΠ°Ρ‚Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, односно Сдноставно Π³ΠΎ Π·Π³ΠΎΠ»Π΅ΠΌΡƒΠ²Π°ΠΌΠ΅ ID Π·Π° 1. Π’ΠΎΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° сС Π½Π°ΠΏΡ€Π°Π²ΠΈ, ΠΏΠ°Ρ‚Π΅ΠΌ, Π½Π΅ само Π½Π° овој нСсмасСн Π½Π°Ρ‡ΠΈΠ½. Π—Π° ΠΎΠ²Π° ΠΈΠΌΠ° сСквСнци Π²ΠΎ Π’Π°Ρ€Π°Π½Ρ‚ΡƒΠ»Π°.

Π’Π°ΠΌΡƒ Π³ΠΎ ΠΏΠΈΡˆΡƒΠ²Π°ΠΌΠ΅ Ρ‚ΠΎΠΊΠ΅Π½ΠΎΡ‚.

Π’Π°ΠΊΠ°, Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° ја напишавмС Π²ΠΎ Π΅Π΄Π½Π° Π΄Π°Ρ‚ΠΎΡ‚Π΅ΠΊΠ°. ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π΄Π° ΠΌΠ°Π½ΠΈΠΏΡƒΠ»ΠΈΡ€Π°Ρ‚Π΅ со ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ Ρ‚Π°ΠΌΡƒ, Π° ΠΊΡƒΡ‚ΠΈΡ˜Π°Ρ‚Π° ΠΌΠΎΠ΄ΡƒΠ» ќС ја Π·Π°Π²Ρ€ΡˆΠΈ Ρ†Π΅Π»Π°Ρ‚Π° Π²Π°Π»ΠΊΠ°Π½Π° Ρ€Π°Π±ΠΎΡ‚Π° намСсто вас.

Π‘Π»ΡƒΡˆΠ° http ΠΈ Ρ€Π°Π±ΠΎΡ‚ΠΈ со ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, сС Π΅ Π²ΠΎ Π΅Π΄Π΅Π½ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ - ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°Ρ‚Π° ΠΈ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅. Π—Π°Ρ‚ΠΎΠ°, сè сС случува доста Π±Ρ€Π·ΠΎ.

Π—Π° Π΄Π° Π·Π°ΠΏΠΎΡ‡Π½Π΅ΠΌΠ΅, Π³ΠΎ инсталирамС http ΠΌΠΎΠ΄ΡƒΠ»ΠΎΡ‚:

Како Π³ΠΎ ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ ΠΎΠ²Π°, ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ ΠΏΠΎΠ΄ ΡΠΏΠΎΡ˜Π»Π΅Ρ€ΠΎΡ‚

root@test2:/# tarantoolctl rocks install http
Installing http://rocks.tarantool.org/http-scm-1.src.rock
Missing dependencies for http scm-1:
   checks >= 3.0.1 (not installed)

http scm-1 depends on checks >= 3.0.1 (not installed)
Installing http://rocks.tarantool.org/checks-3.0.1-1.rockspec

Cloning into 'checks'...
remote: Enumerating objects: 28, done.
remote: Counting objects: 100% (28/28), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 28 (delta 1), reused 16 (delta 1), pack-reused 0
Receiving objects: 100% (28/28), 12.69 KiB | 12.69 MiB/s, done.
Resolving deltas: 100% (1/1), done.
Note: checking out '580388773ef11085015b5a06fe52d61acf16b201'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

No existing manifest. Attempting to rebuild...
checks 3.0.1-1 is now installed in /.rocks (license: BSD)

-- The C compiler identification is GNU 7.5.0
-- Check for working C compiler: /usr/bin/cc
-- Check for working C compiler: /usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Found TARANTOOL: /usr/include (found version "2.4.2-80-g18f2bc82d")
-- Tarantool LUADIR is /.rocks/share/tarantool/rocks/http/scm-1/lua
-- Tarantool LIBDIR is /.rocks/share/tarantool/rocks/http/scm-1/lib
-- Configuring done
-- Generating done
CMake Warning:
  Manually-specified variables were not used by the project:

    version


-- Build files have been written to: /tmp/luarocks_http-scm-1-V4P9SM/http/build.luarocks
Scanning dependencies of target httpd
[ 50%] Building C object http/CMakeFiles/httpd.dir/lib.c.o
In file included from /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:32:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c: In function β€˜tpl_term’:
/usr/include/tarantool/lauxlib.h:144:15: warning: this statement may fall through [-Wimplicit-fallthrough=]
    (*(B)->p++ = (char)(c)))
    ~~~~~~~~~~~^~~~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:62:7: note: in expansion of macro β€˜luaL_addchar’
       luaL_addchar(b, '\');
       ^~~~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:63:6: note: here
      default:
      ^~~~~~~
In file included from /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:39:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h: In function β€˜tpe_parse’:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h:147:9: warning: this statement may fall through [-Wimplicit-fallthrough=]
    type = TPE_TEXT;
    ~~~~~^~~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/tpleval.h:149:3: note: here
   case TPE_LINECODE:
   ^~~~
In file included from /tmp/luarocks_http-scm-1-V4P9SM/http/http/lib.c:40:0:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h: In function β€˜httpfast_parse’:
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:372:22: warning: this statement may fall through [-Wimplicit-fallthrough=]
                 code = 0;
                 ~~~~~^~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:374:13: note: here
             case status:
             ^~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:393:23: warning: this statement may fall through [-Wimplicit-fallthrough=]
                 state = message;
                 ~~~~~~^~~~~~~~~
/tmp/luarocks_http-scm-1-V4P9SM/http/http/httpfast.h:395:13: note: here
             case message:
             ^~~~
[100%] Linking C shared library lib.so
[100%] Built target httpd
[100%] Built target httpd
Install the project...
-- Install configuration: "Debug"
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/VERSION.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lib/http/lib.so
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/server/init.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/server/tsgi_adapter.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/nginx_server/init.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/init.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/fs.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/matching.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/middleware.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/request.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/router/response.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/tsgi.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/utils.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/mime_types.lua
-- Installing: /.rocks/share/tarantool/rocks/http/scm-1/lua/http/codes.lua
http scm-1 is now installed in /.rocks (license: BSD)

root@test2:/#

Ни Ρ‚Ρ€Π΅Π±Π° ΠΈ ΠΏΡ€ΠΎΠΌΠ΅Ρ‚Π΅Ρ˜ Π·Π° Π΄Π° Ρ‚Ρ€Ρ‡Π°ΠΌΠ΅:

root@test2:/# tarantoolctl rocks install prometheus
Installing http://rocks.tarantool.org/prometheus-scm-1.rockspec

Cloning into 'prometheus'...
remote: Enumerating objects: 19, done.
remote: Counting objects: 100% (19/19), done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 19 (delta 2), reused 5 (delta 0), pack-reused 0
Receiving objects: 100% (19/19), 10.73 KiB | 10.73 MiB/s, done.
Resolving deltas: 100% (2/2), done.
prometheus scm-1 is now installed in /.rocks (license: BSD)

root@test2:/#

Π‘Ρ‚Π°Ρ€Ρ‚ΡƒΠ²Π°ΠΌΠ΅ ΠΈ ΠΌΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° пристапимС Π΄ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΠΈΡ‚Π΅

root@test2:/# curl -D - -s http://127.0.0.1:8080/token
HTTP/1.1 200 Ok
Content-length: 44
Server: Tarantool http (tarantool v2.4.2-80-g18f2bc82d)
Connection: keep-alive

{"token":"e2tPq9l5Z3QZrewRf6uuoJUl3lJgSLOI"}

root@test2:/# curl -D - -s http://127.0.0.1:8080/token
HTTP/1.1 200 Ok
Content-length: 44
Server: Tarantool http (tarantool v2.4.2-80-g18f2bc82d)
Connection: keep-alive

{"token":"fR5aCA84gj9eZI3gJcV0LEDl9XZAG2Iu"}

root@test2:/# curl -D - -s http://127.0.0.1:8080/count
HTTP/1.1 200 Ok
Content-length: 11
Server: Tarantool http (tarantool v2.4.2-80-g18f2bc82d)
Connection: keep-alive

{"count":2}root@test2:/#

/count Π½ΠΈ Π΄Π°Π²Π° статус 200.
/token ΠΈΠ·Π΄Π°Π²Π° Ρ‚ΠΎΠΊΠ΅Π½ ΠΈ Π³ΠΎ Π·Π°ΠΏΠΈΡˆΡƒΠ²Π° овој Ρ‚ΠΎΠΊΠ΅Π½ Π²ΠΎ Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ.

Π’Π΅ΡΡ‚ΠΈΡ€Π°ΡšΠ΅ Π½Π° Π±Ρ€Π·ΠΈΠ½Π°Ρ‚Π°

АјдС Π΄Π° Π½Π°ΠΏΡ€Π°Π²ΠΈΠΌΠ΅ Ρ€Π΅ΠΏΠ΅Ρ€ Π·Π° 50 Π±Π°Ρ€Π°ΡšΠ°. ЌС ΠΈΠΌΠ° 000 ΠΊΠΎΠ½ΠΊΡƒΡ€Π΅Π½Ρ‚Π½ΠΈ Π±Π°Ρ€Π°ΡšΠ°.

root@test2:/# ab -c 500 -n 50000 http://127.0.0.1:8080/token
This is ApacheBench, Version 2.3 <$Revision: 1807734 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Completed 20000 requests
Completed 25000 requests
Completed 30000 requests
Completed 35000 requests
Completed 40000 requests
Completed 45000 requests
Completed 50000 requests
Finished 50000 requests


Server Software:        Tarantool
Server Hostname:        127.0.0.1
Server Port:            8080

Document Path:          /token
Document Length:        44 bytes

Concurrency Level:      500
Time taken for tests:   14.578 seconds
Complete requests:      50000
Failed requests:        0
Total transferred:      7950000 bytes
HTML transferred:       2200000 bytes
Requests per second:    3429.87 [#/sec] (mean)
Time per request:       145.778 [ms] (mean)
Time per request:       0.292 [ms] (mean, across all concurrent requests)
Transfer rate:          532.57 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   10 103.2      0    3048
Processing:    12   69 685.1     15   13538
Waiting:       12   69 685.1     15   13538
Total:         12   78 768.2     15   14573

Percentage of the requests served within a certain time (ms)
  50%     15
  66%     15
  75%     16
  80%     16
  90%     16
  95%     16
  98%     21
  99%     42
 100%  14573 (longest request)
root@test2:/#

Π‘Π΅ ΠΈΠ·Π΄Π°Π²Π°Π°Ρ‚ Ρ‚ΠΎΠΊΠ΅Π½ΠΈ. И Π½ΠΈΠ΅ ΠΏΠΎΡΡ‚ΠΎΡ˜Π°Π½ΠΎ снимамС ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. 99% ΠΎΠ΄ Π±Π°Ρ€Π°ΡšΠ°Ρ‚Π° сС ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π΅Π½ΠΈ Π·Π° 42 милисСкунди. Π‘ΠΏΠΎΡ€Π΅Π΄ Ρ‚ΠΎΠ°, ΠΈΠΌΠ°ΠΌΠ΅ ΠΎΠΊΠΎΠ»Ρƒ 3500 Π±Π°Ρ€Π°ΡšΠ° Π²ΠΎ сСкунда Π½Π° ΠΌΠ°Π»Π° машина со 2 Ρ˜Π°Π΄Ρ€Π° ΠΈ 4 Π³ΠΈΠ³Π°Π±Π°Ρ˜Ρ‚ΠΈ ΠΌΠ΅ΠΌΠΎΡ€ΠΈΡ˜Π°.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ исто Ρ‚Π°ΠΊΠ° Π΄Π° ΠΈΠ·Π±Π΅Ρ€Π΅Ρ‚Π΅ ΠΎΠΊΠΎΠ»Ρƒ 50000 Ρ‚ΠΎΠΊΠ΅Π½ΠΈ ΠΈ Π΄Π° ја Π²ΠΈΠ΄ΠΈΡ‚Π΅ Π½Π΅Π³ΠΎΠ²Π°Ρ‚Π° врСдност.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° користитС Π½Π΅ само http, Ρ‚ΡƒΠΊΡƒ ΠΈ Π΄Π° ΠΈΠ·Π²Ρ€ΡˆΡƒΠ²Π°Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π²ΠΎ Π·Π°Π΄Π½ΠΈΠ½Π° ΡˆΡ‚ΠΎ Π³ΠΈ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΡƒΠ²Π°Π°Ρ‚ Π²Π°ΡˆΠΈΡ‚Π΅ ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. ΠŸΠ»ΡƒΡ ΠΈΠΌΠ° Ρ€Π°Π·Π»ΠΈΡ‡Π½ΠΈ ΠΏΡ€Π΅Π΄ΠΈΠ·Π²ΠΈΠΊΡƒΠ²Π°Ρ‡ΠΈ. На ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΠΎΠ²ΠΈΠΊΠ°Ρ‚Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° Π°ΠΆΡƒΡ€ΠΈΡ€Π°ΡšΠ°, Π΄Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚Π΅ Π½Π΅ΡˆΡ‚ΠΎ - исправСтС Π³ΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΈΡ‚Π΅.

ΠœΠΎΠΆΠ΅Ρ‚Π΅ Π΄Π° ΠΏΠΈΡˆΡƒΠ²Π°Ρ‚Π΅ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π·Π° скрипти Π΄ΠΈΡ€Π΅ΠΊΡ‚Π½ΠΎ Π²ΠΎ самиот сСрвСр Π½Π° Π±Π°Π·Π°Ρ‚Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ, ΠΈ Π΄Π° Π½Π΅ Π±ΠΈΠ΄Π΅Ρ‚Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈ со Π½ΠΈΡˆΡ‚ΠΎ, Π΄Π° ΠΏΠΎΠ²Ρ€Π·Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΈ Π±ΠΈΠ»ΠΎ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈ Π΄Π° ΠΈΠΌΠΏΠ»Π΅ΠΌΠ΅Π½Ρ‚ΠΈΡ€Π°Ρ‚Π΅ ΠΊΠ°ΠΊΠ²Π° Π±ΠΈΠ»ΠΎ Π»ΠΎΠ³ΠΈΠΊΠ°.

Апликативниот сСрвСр ΠΌΠΎΠΆΠ΅ Π΄Π° пристапи Π΄ΠΎ Π½Π°Π΄Π²ΠΎΡ€Π΅ΡˆΠ½ΠΈ сСрвСри, Π΄Π° Π³ΠΈ Π²Ρ€Π°ΡœΠ° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ ΠΈ Π΄Π° Π³ΠΈ Π΄ΠΎΠ΄Π°Π²Π° Π²ΠΎ ΡΠ²ΠΎΡ˜Π°Ρ‚Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ. ΠŸΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈΡ‚Π΅ ΠΎΠ΄ ΠΎΠ²Π°Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°Ρ‚ΠΎΡ†ΠΈ ќС сС користат ΠΎΠ΄ Π΄Ρ€ΡƒΠ³ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

Π’Π°Ρ€Π°Π½Ρ‚ΡƒΠ»Π°Ρ‚Π° сама ќС Π³ΠΎ Π½Π°ΠΏΡ€Π°Π²ΠΈ Ρ‚ΠΎΠ° ΠΈ Π½Π΅ΠΌΠ° Π΄Π° ΠΌΠΎΡ€Π° Π΄Π° ΠΏΠΈΡˆΡƒΠ²Π°Ρ‚Π΅ посСбна Π°ΠΏΠ»ΠΈΠΊΠ°Ρ†ΠΈΡ˜Π°.

Π’ΠΎ Π·Π°ΠΊΠ»ΡƒΡ‡ΠΎΠΊ

Ова Π΅ само ΠΏΡ€Π²ΠΈΠΎΡ‚ Π΄Π΅Π» ΠΎΠ΄ Π΅Π΄Π½ΠΎ Π³ΠΎΠ»Π΅ΠΌΠΎ Π΄Π΅Π»ΠΎ. Π’Ρ‚ΠΎΡ€ΠΈΠΎΡ‚ ќС Π±ΠΈΠ΄Π΅ објавСн наскоро Π½Π° Π±Π»ΠΎΠ³ΠΎΡ‚ Π½Π° Mail.ru Group, Π° Π½ΠΈΠ΅ Π΄Π΅Ρ„ΠΈΠ½ΠΈΡ‚ΠΈΠ²Π½ΠΎ ќС Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ врска Π΄ΠΎ Π½Π΅Π³ΠΎ Π²ΠΎ овој ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΡ˜Π°Π».

Ако стС заинтСрСсирани Π΄Π° присуствуватС Π½Π° настани ΠΊΠ°Π΄Π΅ ΡˆΡ‚ΠΎ Π³ΠΈ Π³Ρ€Π°Π΄ΠΈΠΌΠ΅ ΠΎΠ²ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚ΠΈ онлајн ΠΈ Π΄Π° поставуватС ΠΏΡ€Π°ΡˆΠ°ΡšΠ° Π²ΠΎ Ρ€Π΅Π°Π»Π½ΠΎ Π²Ρ€Π΅ΠΌΠ΅, Π²ΠΊΠ»ΡƒΡ‡ΠΈΡ‚Π΅ сС ΠΊΠ°Π½Π°Π» DevOps ΠΎΠ΄ REBRAIN.

Ако Ρ‚Ρ€Π΅Π±Π° Π΄Π° сС прСсСлитС Π²ΠΎ ΠΎΠ±Π»Π°ΠΊΠΎΡ‚ ΠΈΠ»ΠΈ ΠΈΠΌΠ°Ρ‚Π΅ ΠΏΡ€Π°ΡˆΠ°ΡšΠ° Π·Π° Π²Π°ΡˆΠ°Ρ‚Π° инфраструктура, слободно оставСтС Π±Π°Ρ€Π°ΡšΠ΅.

П.Π‘ ИмамС 2 бСсплатни Ρ€Π΅Π²ΠΈΠ·ΠΈΠΈ мСсСчно, ΠΌΠΎΠΆΠ΅Π±ΠΈ Π²Π°ΡˆΠΈΠΎΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ќС Π±ΠΈΠ΄Π΅ Π΅Π΄Π΅Π½ ΠΎΠ΄ Π½ΠΈΠ².

Π˜Π·Π²ΠΎΡ€: www.habr.com

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