ΠΡΠ΅Π΄ ΠΏΠ΅Ρ Π³ΠΎΠ΄ΠΈΠ½ΠΈ ΡΠ΅ ΠΎΠ±ΠΈΠ΄ΠΎΠ² Π΄Π° ΡΠ°Π±ΠΎΡΠ°ΠΌ ΡΠΎ Tarantool, Π½ΠΎ ΡΠΎΠ³Π°Ρ Π½Π΅ ΠΌΠΈ ΡΡΠΏΠ΅Π°. ΠΠΎ, Π½Π΅ΠΎΠ΄Π°ΠΌΠ½Π° ΠΎΠ΄ΡΠΆΠ°Π² Π²Π΅Π±ΠΈΠ½Π°Ρ ΠΊΠ°Π΄Π΅ ΡΡΠΎ Π·Π±ΠΎΡΡΠ²Π°Π² Π·Π° Hadoop ΠΈ ΠΊΠ°ΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ° MapReduce. Π’Π°ΠΌΡ ΠΌΠΈ ΠΏΠΎΡΡΠ°Π²ΠΈΡΠ° ΠΏΡΠ°ΡΠ°ΡΠ΅: βΠΠΎΡΡΠΎ Π΄Π° Π½Π΅ Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠ°ΠΌ Tarantool Π·Π° ΠΎΠ²Π°Π° Π·Π°Π΄Π°ΡΠ°?
ΠΠ΄ ΡΡΠ±ΠΎΠΏΠΈΡΠ½ΠΎΡΡ, ΡΠ΅ΡΠΈΠ² Π΄Π° ΡΠ΅ Π²ΡΠ°ΡΠ°ΠΌ Π½Π° Π½Π΅Π³ΠΎ, Π΄Π° ΡΠ° ΡΠ΅ΡΡΠΈΡΠ°ΠΌ Π½Π°ΡΠ½ΠΎΠ²Π°ΡΠ° Π²Π΅ΡΠ·ΠΈΡΠ° - ΠΈ ΠΎΠ²ΠΎΡ ΠΏΠ°Ρ Π½Π°Π²ΠΈΡΡΠΈΠ½Π° ΠΌΠΈ ΡΠ΅ Π΄ΠΎΠΏΠ°Π΄Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠΎΡ. Π‘Π΅Π³Π° ΡΠ΅ Π²ΠΈ ΠΏΠΎΠΊΠ°ΠΆΠ°ΠΌ ΠΊΠ°ΠΊΠΎ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ° Π²ΠΎ Tarantool, Π΄Π° ΡΠ° Π²ΡΠΈΡΠ°ΡΠ΅ ΠΈ Π΄Π° Π³ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ Π½Π΅ΡΠ·ΠΈΠ½ΠΈΡΠ΅ ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈ ΠΈ ΡΠ΅ Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΊΠΎΠ»ΠΊΡ Π΅ ΡΓ¨ Π»Π΅ΡΠ½ΠΎ ΠΈ ΠΊΡΠ».
Π¨ΡΠΎ Π΅ Tarantool
Tarantool ΡΠ΅ ΠΏΠΎΠ·ΠΈΡΠΈΠΎΠ½ΠΈΡΠ° ΠΊΠ°ΠΊΠΎ ΡΠ»ΡΡΠ° Π±ΡΠ·Π° Π±Π°Π·Π° Π½Π° ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΡΠ°Π²ΠΈΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΈ Π±ΠΈΠ»ΠΎ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΡΡΠΎ ΡΠ°ΠΊΠ°ΡΠ΅. ΠΠ»ΡΡ, ΡΠ΅ΠΏΠ»ΠΈΡΠΈΡΠ°ΡΡΠ΅ Π³ΠΈ, ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΈ - Ρ.Π΅. ΡΠ°Π·Π΄Π΅Π»Π΅ΡΠ΅ ΠΎΠ³ΡΠΎΠΌΠ½ΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π½Π° Π½Π΅ΠΊΠΎΠ»ΠΊΡ ΡΠ΅ΡΠ²Π΅ΡΠΈ ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°ΡΡΠ΅ Π³ΠΈ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΠ΄ Π½ΠΈΠ² - Π½Π°ΠΏΡΠ°Π²Π΅ΡΠ΅ ΠΌΠ°ΡΡΠ΅Ρ-ΠΌΠ°ΡΡΠ΅Ρ Π²ΡΡΠΊΠΈ ΡΠΎΠ»Π΅ΡΠ°Π½ΡΠ½ΠΈ Π·Π° Π³ΡΠ΅ΡΠΊΠΈ.
ΠΡΠΎΡΠΎ, ΠΎΠ²Π° Π΅ ΡΠ΅ΡΠ²Π΅Ρ Π·Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π³ΠΈ ΠΏΠΈΡΡΠ²Π°ΡΠ΅ Π²Π°ΡΠΈΡΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ Π½Π° Π½Π΅Π³ΠΎ, Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ ΡΠΎ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ, Π½Π° ΠΏΡΠΈΠΌΠ΅Ρ, Π΄Π° Π±ΡΠΈΡΠ΅ΡΠ΅ ΡΡΠ°ΡΠΈ Π·Π°ΠΏΠΈΡΠΈ Π²ΠΎ ΠΏΠΎΠ·Π°Π΄ΠΈΠ½Π° ΡΠΏΠΎΡΠ΅Π΄ ΠΎΠ΄ΡΠ΅Π΄Π΅Π½ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°. ΠΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ Http ΡΠ΅ΡΠ²Π΅Ρ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ Π²ΠΎ Tarantula ΡΡΠΎ ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΡΠΎ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ: Π΄Π°ΡΡΠ΅ ΡΠ° Π½ΠΈΠ²Π½Π°ΡΠ° ΠΊΠΎΠ»ΠΈΡΠΈΠ½Π°, Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ Π½ΠΎΠ²ΠΈ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΡΠ°ΠΌΡ ΠΈ Π΄Π° Π³ΠΎ Π½Π°ΠΌΠ°Π»ΠΈΡΠ΅ ΡΠ΅ΡΠΎ Π½Π° Π³Π»Π°Π²Π½ΠΈΠΎΡ.
ΠΡΠΎΡΠΈΡΠ°Π² ΡΡΠ°ΡΠΈΡΠ° Π·Π° ΡΠΎΠ° ΠΊΠ°ΠΊΠΎ ΠΌΠΎΠΌΡΠΈΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ° ΡΠ΅Π΄ΠΈΡΠ° Π·Π° ΠΏΠΎΡΠ°ΠΊΠΈ ΠΎΠ΄ 300 Π»ΠΈΠ½ΠΈΠΈ, ΡΡΠΎ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΠΏΡΠΊΠ° ΠΈ Π±ΡΠ·Π° - ΡΠΈΠ΅ ΠΈΠΌΠ°Π°Ρ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π½Π° ΠΈΠ·Π²Π΅Π΄Π±Π° ΠΎΠ΄ 20 ΠΏΠΎΡΠ°ΠΊΠΈ Π²ΠΎ ΡΠ΅ΠΊΡΠ½Π΄Π°. ΠΠ²Π΄Π΅ Π½Π°Π²ΠΈΡΡΠΈΠ½Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΈΡΠ΅ ΠΈ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΡΠ΅ ΠΌΠ½ΠΎΠ³Ρ Π³ΠΎΠ»Π΅ΠΌΠ° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°, Π° ΡΠΎΠ° Π½Π΅ΠΌΠ° Π΄Π° Π±ΠΈΠ΄Π΅ ΡΠΊΠ»Π°Π΄ΠΈΡΠ°ΡΠ΅, ΠΊΠ°ΠΊΠΎ Π²ΠΎ PostgreS.
ΠΠ΅ ΡΠ΅ ΠΎΠ±ΠΈΠ΄Π°ΠΌ Π΄Π° ΠΎΠΏΠΈΡΠ°ΠΌ Π½Π΅ΡΡΠΎ ΠΊΠ°ΠΊΠΎ ΠΎΠ²ΠΎΡ ΡΠ΅ΡΠ²Π΅Ρ, ΡΠ°ΠΌΠΎ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ, Π²ΠΎ ΠΎΠ²Π°Π° ΡΡΠ°ΡΠΈΡΠ°.
ΠΠ½ΡΡΠ°Π»Π°ΡΠΈΡΠ°
ΠΠ° ΡΠ΅ΡΡΠΎΡ, Π·Π°ΠΏΠΎΡΠ½Π°Π² ΡΡΠΈ ΡΡΠ°Π½Π΄Π°ΡΠ΄Π½ΠΈ Π²ΠΈΡΡΡΠ΅Π»Π½ΠΈ ΠΌΠ°ΡΠΈΠ½ΠΈ - Ρ Π°ΡΠ΄ Π΄ΠΈΡΠΊ ΠΎΠ΄ 20 GB, Ubuntu 18.04. 2 Π²ΠΈΡΡΡΠ΅Π»Π½ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΎΡΠΈ ΠΈ 4 Π³ΠΈΠ³Π° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°.
ΠΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ Tarantool - ΡΡΠ°ΡΡΡΠ²Π°ΡΡΠ΅ ΡΠ° Π±Π°Ρ ΡΠΊΡΠΈΠΏΡΠ°ΡΠ° ΠΈΠ»ΠΈ Π΄ΠΎΠ΄Π°Π²Π°ΠΌΠ΅ ΡΠΊΠ»Π°Π΄ΠΈΡΡΠ΅ ΠΈ Π½Π°ΠΏΡΠ°Π²Π΅ΡΠ΅ Π³ΠΎ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ Π½Π° Tarantool. ΠΡΡΠΊΠ° Π΄ΠΎ ΡΠΊΡΠΈΠΏΡΠ° - (Π½Π°Π²ΠΈΠ²Π°ΠΌ -L
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.
Π‘ΠΎΡΠ΅ΠΌΠ° Π΅ ΠΏΠΎΠ³ΠΎΠ΄Π½ΠΎ Π΄Π° ΡΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΡΠΎ Π½Π΅Π³ΠΎ. Π Π΅ΡΠΈΡΠΈ ΡΠ΅ΠΊΠΎΡΠ° Π»ΠΈΠ½ΠΈΡΠ°, ΡΠ΅ΠΊΠΎΡ Π·Π°ΠΏΠΈΡ ΡΠΎ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° ΡΠΎΡΠ΅ΠΌΠ° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΊΠΎΠ»ΠΎΠ½ΠΈ.
ΠΠΎΠΆΠ΅ΠΌΠ΅ Π΄Π° Π³ΠΈ ΠΏΡΠ΅Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠΈΡΠ΅ ΠΏΡΠ°Π·Π½ΠΈ ΠΌΠ΅ΡΡΠ° ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° 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 ΡΠ΅ Π²ΡΠ°ΡΠ° ΠΎΠ΄ ΠΏΠΎΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠΎΠ½ΡΡΠΎΠ»Π½Π° ΡΠΎΡΠΊΠ° ΠΈ ΠΏΠΎΡΠΎΠ° Π³ΠΈ ΠΏΡΠ΅Π²ΡΡΡΠ²Π° ΡΠΈΡΠ΅ ΠΏΠΎΠ΄ΠΎΡΠ½Π΅ΠΆΠ½ΠΈ ΡΡΠ°Π½ΡΠ°ΠΊΡΠΈΠΈ Π΄ΠΎΠ΄Π΅ΠΊΠ° Π½Π΅ ΠΏΡΠ΅ΡΡΠ°Π½Π΅.
ΠΠ° Π΄Π° ΠΈΠ·Π²ΡΡΠΈΡΠ΅ ΡΠ°ΠΊΠ²ΠΎ ΡΠ½ΠΈΠΌΠ°ΡΠ΅, ΡΡΠ΅Π±Π° Π΄Π° ΡΠ° Π½Π°Π²Π΅Π΄Π΅ΡΠ΅ ΠΎΠΏΡΠΈΡΠ°ΡΠ° Π²ΠΎ ΠΏΠΎΡΡΠ°Π²ΠΊΠΈΡΠ΅ Π½Π° 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, Π° Π½ΠΈΠ΅ Π΄Π΅ΡΠΈΠ½ΠΈΡΠΈΠ²Π½ΠΎ ΡΠ΅ Π΄ΠΎΠ΄Π°Π΄Π΅ΠΌΠ΅ Π²ΡΡΠΊΠ° Π΄ΠΎ Π½Π΅Π³ΠΎ Π²ΠΎ ΠΎΠ²ΠΎΡ ΠΌΠ°ΡΠ΅ΡΠΈΡΠ°Π».
ΠΠΊΠΎ ΡΡΠ΅ Π·Π°ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠΈΡΠ°Π½ΠΈ Π΄Π° ΠΏΡΠΈΡΡΡΡΠ²ΡΠ²Π°ΡΠ΅ Π½Π° Π½Π°ΡΡΠ°Π½ΠΈ ΠΊΠ°Π΄Π΅ ΡΡΠΎ Π³ΠΈ Π³ΡΠ°Π΄ΠΈΠΌΠ΅ ΠΎΠ²ΠΈΠ΅ ΡΠ°Π±ΠΎΡΠΈ ΠΎΠ½Π»Π°ΡΠ½ ΠΈ Π΄Π° ΠΏΠΎΡΡΠ°Π²ΡΠ²Π°ΡΠ΅ ΠΏΡΠ°ΡΠ°ΡΠ° Π²ΠΎ ΡΠ΅Π°Π»Π½ΠΎ Π²ΡΠ΅ΠΌΠ΅, Π²ΠΊΠ»ΡΡΠΈΡΠ΅ ΡΠ΅
ΠΠΊΠΎ ΡΡΠ΅Π±Π° Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΡΠ΅Π»ΠΈΡΠ΅ Π²ΠΎ ΠΎΠ±Π»Π°ΠΊΠΎΡ ΠΈΠ»ΠΈ ΠΈΠΌΠ°ΡΠ΅ ΠΏΡΠ°ΡΠ°ΡΠ° Π·Π° Π²Π°ΡΠ°ΡΠ° ΠΈΠ½ΡΡΠ°ΡΡΡΡΠΊΡΡΡΠ°,
Π.Π‘ ΠΠΌΠ°ΠΌΠ΅ 2 Π±Π΅ΡΠΏΠ»Π°ΡΠ½ΠΈ ΡΠ΅Π²ΠΈΠ·ΠΈΠΈ ΠΌΠ΅ΡΠ΅ΡΠ½ΠΎ, ΠΌΠΎΠΆΠ΅Π±ΠΈ Π²Π°ΡΠΈΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ΅ Π±ΠΈΠ΄Π΅ Π΅Π΄Π΅Π½ ΠΎΠ΄ Π½ΠΈΠ².
ΠΠ·Π²ΠΎΡ: www.habr.com