á¨á ááľáľ á ááľ á áᾠᨠTarantool áá áááľáŤáľ áá¨ááŠá, áá á¨á፠á áá ááĽá á áá°áŤá. áá á á áᥠáľá Hadoop áĽá MapReduce áĽáá´áľ áĽáá°áá°áŤ á¨á°ááááŠá áľ áá˘áá á á°á¨ááᢠáĽááŤá á ááľ áĽáŤá á á¨áááĄ- âááá Tarantoolá ááá á°ááŁá á áľá ááá áľá?â
á¨áááľ á¨á°ááł áá° áĽáą áááááľ áá°ááŠá, á¨á áἠáááá áľáŞáľ áááá¨á - áĽá á áá áá ááŽáááąá á áŁá ááľáááá. á áá á Tarantool ááľáĽ ááá á áááŹá˝á áĽáá´áľ áĽáá°áá˝á á áłáááłáá, ááŤááľ áĽá á ááááá áŤá¨áááĄ, áĽá ááá ááá áá áŤá á ááá áĽá áááá áĽáá°áá áŤáŤá.
Tarantool áááľá áá?
Tarantool áĽáŤáąá áĽáá° áĽá á á áŁá ááŁá á¨ááἠááł á áľáá áŤáľáááŁáᢠá¨áááááľá áááááá ááἠáĽá፠ááľááἠáá˝áá. á á°á¨ááŞá ᣠáĽááąá ááľáá ᣠshard - áááľá ᣠáĽá áá á áŤáá ááἠá á ááŤáł á ááááŽá˝ áá áá¨ááá áĽá áá¤áśášá á¨ááą áŤáŁáአ- áľá á°áľá á¨áááá áá-áá áááááśá˝á áŤáľááá˘
á ááá°á á°á¨á, áá á¨áá°áá áŞáŤ á áááá áá. áááá¨áťáá˝áá á áĽáą áá ááťá, á¨ááἠáá ááľáŤáľ, áááłá, á á°áá°á á áá˝ áá°á¨áľ á¨áľáŽ ááááŚá˝á á¨á áľá°ááᣠáá°á¨á áá˝áá. á¨ááἠáá á¨áá°áŤ á¨á¤á˝á˛á˛á á áááá á ááĽáł á Tarantula ááľáĽ ááá áá˝áá-áĽááłá¸áá ááľáĄ ᣠáĽá፠á á˛áľ ááἠááá áĽá áááá áá° ááłá ááááąá˘
áááśáš 300 ááľááŽá˝á á¨áŤá á¨áááĽááľ áá¨á áĽááłá°á¨á á¨áááá˝ á˝áá á áá áĽáŠáŁ áá á á ááá á¨ááááł áĽá á¨ááŁá°áá - á˘áŤááľ á˘áŤááľ 20 áááááśá˝ á á°á¨ááľ á áá¸áᢠáĽáá á áŁá áľáá á áááŹá˝á ááá áĽá ááá áá˝ááᣠáĽá áĽáá° PostgreS áá¨ááť á ááááá˘
á áá á˝áá ááľáĽ áĽáá°áá áŤá á áááá ᣠááá áĽáť ᣠá¨áá ááá ááááá˝ áĽáááŤááá˘
á ááĽá
ááá°ááᣠáśáľáľ áá°á á á¨áášáá áá˝áá˝á áááአ- áŁá 20 áᢠáááľ áľáŤááᣠáĄáĄááą 18.04ᢠ2 áááŁá á˛ááŠáá˝ áĽá 4 áááá˝ á¨áá á°á¨ áľááľáłá˘
Tarantool á áĽáááááá - ᨠbash áľááŞááľ áĽáá°áŤáá ááá áá¨ááť áĽáá¨ááŤáá áĽá Tarantool á áĽááááááᢠáá° áľááŞááľ áááááľ - (curl -L
tarantoolctl - ᨠTarantula ááłááá˝á áááľá°áłá°á ááá áľáĽááá˘
/ááá°/tarantool - á á ááá áá
á áĽáá
á áá˘
var / log / tarantool - áááἠááľáłááťááš áĽáá
á áá˘
var/lib/tarantool - ááᥠáĽáá
á á ᣠáĽá á¨á፠áá° ááłááá˝ á°á¨áááá˘
á á áááá˝ áááłá á¨ááá áĽá áááłá á¨ááťá - á¨áááá¨áá áááá - á¨ááłá áááá ááá á¨áá áŽáľ ááᣠá¨áľááá áá°áŚá˝ áĽáá°ááŤáłááĽáŁ áá áá á°á¨ áľááľáł áĽáá°áááááľ á¨áááá˝áŁ á¨áŞáá áá°á á áá áśá˝áŁ á˛ááá á¨áá°áŤ áŽáľ á°áá¨áŽá˝áŁ áťáá˛ááᣠáá¨ááá˝áŁ áá áŤááá áľ ááἠáá°á¨á áĽá á¨ááłá°ááľá˘
ááłááá˝ áĽáá° PostgreS áá°áŤáᢠáááłá á á°ááŤáŠ áá°áŚá˝ áá á¨áá°áá á¨ááἠááł áĽá á ááá˝á áááľ áľááááá ᢠá á°ááŤáŠ áá°áŚá˝ áá á¨ááá áá á á ááŤáł á¨áá¨á ááśá˝ á á ááľ á áááá áá á°ááá¨áá ᢠáá ááá á¨á°ááŤáŠ á ááĽáŽá˝ áááŤá¸á áá˝áá - á ááľ ááłá á ááľ áááá áá°ááĽáŤá, ááá°áá - áá.
á¨ááłá á áľá°áłá°á
ᨠTarantula ááłááá˝á ááááŁá á á¨ááŤáľá˝á ᨠtarantoolctl áľááá á áá. áááłá ᨠtarantoolctl áźá ááłá á¨áá á¨áľ áááá áááľáťá áĽá ááá - áĽá፠ááá á¨á ááŁáĽ áľá á°áśá˝ á¨áá ááá á°á á ááá˘
á¨ááłááá áááł áá¨áľ áá˝áá - tarantoolctl áááł ááłáᢠá á°ááłáłá ááááľ áááá, ááá, áĽáá°áá áááá áá˝áá.
á áá´ ááłá áĽá¨áá° á¨ááᣠá áááľ ááááśá˝ áááááľ áá˝ááá˘
1. á¨á áľá°áłá°á áŽááśá
á ááŁáŞááľ Tarantool áśáŹáľ áá¨ááłáᣠTarantoolá ááááŁá á áá°á á á¨ASCII á˝áá áá°á፠áááŤáᢠá¨áŽááśá áá áŤáá áááááľ áá áá á á áľá°áłáłáŞá á°á áá áľá áá á¨áá¨á°á°á, ááá áá¨áá፠á¨áá, áľááá áłááłá áááľá°áłá°á á¨áŽááśá áá°áĽ ááŤá ááľá¨á á áŤáľáááá.
áá áá áá´ á áá áá ááááááľ Tarantoolctl áŤáľáᥠáááłá áľá áŤáľááĄá˘ áľááá áŽááśáá áŤáľááłá áĽáá° á áľá°áłáłáŞ á°á áá áááááᢠá¨áŽááśá áá°áĽ á ááŤá˝ á áłááἠ- áĽáá° á ááľ ááá áśáŹáľ áá°á ááťááᢠá¨á፠áá° áśáŹáą áááťá ááłá¨áť áŤáá¸á áĽáť á¨áłááłá áá áááááľ áá˝áá.
áá áá´ áá áľá°áłá°áŤá áááŽá˝ áŤáľáááá. á¨áá¨á áá áááľáŤáľ, ááá°ááá áá´ áá áá - á¨áááľáŽá˝ ááŽáśáŽá.
2. á¨á ááľ á¨á°áá°á áá°áĽ áá ááááááľ á¨áááľáŽá˝ ááŽáśáŽáá áá áá
áá አáááŤá áááááśá˝ áá°áĽ á¨áá¨ááľ á¨ááłáἠáááŞáŤ áááᢠáá áá°áĽ á¨áááľáŽá˝ ááŽáśáŽá áá áĽá á áá áááá áĽá áá¨ááἠáĽá፠áá áˇáá˘
ááá áááááľáŁ tarantoolctl á¨áá°áĽ ááĽá áá áááááľ áľáŤ áá ááááᢠáĽáąá á áá áá á¨áááľ á ááááŽá˝ áá ááááᾠᣠáá¨áááŤá áá áá áĽá á¨á°ááŤáŠ á¨ááłá¨áť ááĽáśá˝á ááľá áľ áá˝áá á˘
á¨ááἠáá¨áť áĽá áłáĽá ááąá
Tarantool áááąá á¨ááἠááł áĽá á¨áá°áá áŞáŤ á áááá áľááá, á¨á°ááŤáŠ áááá˝ á ááľ. á áłáĽá ááá áá ááááľ á áá - á¨ááἠáá ááľáŤáľá á°ááŁáŤá áŤá°ááá. á ááľ ááá áá° áłáĽá á˛á˝á áłáŤááśá áááĄá áá° á˛áľá áá˝áá, á áá á°á¨ áľááľáł ááľáĽ áŤá¨ááťá ááá áá ááá á áĽáą áá áŤá°ááá.
áá áłáľ
áááłá, áá° áłáĽá ááá ááľáĽ áĽáááŁáá áĽá áá° box.once function áá°áá. áá á áááአá˛ááá 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
á¨áá á áá, ááἠáááá á¨ááá˝áá áľ áá áá¨á á áá - ááłá - áĽáááĽáŤáá. á ááŁáŞááľ ááá á áááľ áááŞáŤáá˝á áŤááááš á áĽáŤááłááą áááἠááľáĽ áŤáá á¨ááááŞáŤá ááľá ááá áá¨á á áá áĽá á áá áááá.
á¨á፠ááĽáááł á°á ááá áľáŚáł áĽáá°áŤáá, á áĽáą áľá á áááľáŽá˝ ááŽáśáŽá á áŠá áĽáááááá. á á á ááá ááá áĽáŁ ááťá áĽá ááľáá¸áá áĽááá áłááá˘
á¨á°áááˇá á¨ááἠááłáá˝ áá á˛ááťá¸á, áĽáá ááá ááá á áŁá ááá áá. áŚáł á áá - áááŁá˝á á ááá á¨áá¨áá˝á áľ á áŤáŁá˘á˘ áĽáŤááłááą áááἠtuple ááŁááᢠá MessagePack ááľáĽ á¨áłá¸á ááᢠáá á áŁá á áŞá á áá¸áľ áá - áááľáŽá˝ áá áĽá áľáá˝ áŚáł áááľáłá - 18 áŁáᾠᨠ27 ááá˘
á¨áĽáą áá áááľáŤáľ á áŁá ááš áá. áĽáŤááłááą ááľáá áááľ ááťááᣠáĽáŤááłááą á¨ááἠáááἠáá ááá á¨á°ááŤáŠ á ááśá˝ ááá¨á áá˝ááá˘
á¨Box.space áľáááá á áá áá áááá áŚáłáá˝ áá¨áľ áĽáá˝áááᢠá ááľá á¨á°áá°á ááłá áááá¨áĽ á¨Box.space ááłáá ááá áĽá áľááą á¨á°áá áá¨á áŤááá˘
Tarantool áááľ á áĽáŽááἠáá°áŽá˝ á ááľ: áá á°á¨ áľááľáł áĽá áŞáá. áá á°á¨ áľááľáł áááá ááἠá áá á°á¨ áľááľáł ááľáĽ áŤá¨ááťáᢠáľááá , ááá ááá á ááá áĽá á ááĽááľ áá°áŤá. ááᥠáá° á˛áľá á°áĽááᣠáĽá áá°ááľ á¨ááá áá´á á áᣠáľááá á áááአá¨á°á áḠááá ááá á ááŁáá˘
áŞáá áá¨áá á á˛áľá áá ááĽá áá áἠá ááłáá á á˝ áŤá¨ááťá - áááľá áĽá áŤáá áá á°á¨ áľááľáł á áá áĽá áá¨ááá˝á áá¨áá¸áľ áá˝áá áĽá áłáŤááąá á¨á˛áľá áŤáá ááá˘
áá áá áá á°á¨ áľááľáłá áĽáá áááá.
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>
áááŤ
áááááá áŚáł áá áá¨á á áá ááá á á áá áľ, ááááŤáąá áŤááą ááá á áá°áŤá. áĽáá° ááááá á¨ááἠááł, á¨ááááŞáŤáá ááľá áĽáááĽáŤáá - á¨ááááἠááłáááŤ.
áááá˝
áĽáá á¨áĽá á áá áá áĽáá°ááŤáŤáľáľ áĽáá áááá. á ááľ áááá áŤáá áá - áĽá á¨ááá ááá á¨ááááŞáŤá ááľá ááááľ áŤáá°áá¨á áá - á áááłá á˘áá˛ááᢠá¨á°ááą áĽáľá¨ááľáłááľ áľá¨áľ, á¨áá°áá ááĽá 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>
á¨ááááŞáŤá ááľá áĽáá° áá ááá áĽá á áá áááá, áľááá áአááá á áá áľ. á á ááśá˝ áĽááľ á¨á°áá°áá á áá°ááá, áľááá á¨áááááá áŤá á ááἠáĽá፠ááľáĽ ááľááŁáľ áĽáá˝ááá. á¨áá á¨ááá˝áŠáľ á áááĽááľ áá á áá¸áľ áá á¨á°ááášáľá˘
á¨ááἠáá ááľ
á¨á፠á¨áá¨áĄáľá áľááá á áá áá áááĄá ááłá¨áľ áĽáá˝ááá.
Box.example.á¨{1}ááá áá áá¨áĽ á¨áááááá áá¤áľ áŤáłáŤáᢠáááá áá áŤá°á¨áá, áŤááá áááá ááááŚá˝ áĽááŤáá. ááá á á ááśá˝ áĽááľ áááŤáŤá, áá áĽáá , á ááá á°á¨á, á¨á ááśá˝ á˝áá°-ááłáĽ á¨áá - á¨ááľá ááĽáŽá˝ á á.
áá á áá á¨ááἠáá á ááá áá˝áá. áĽá áááłá, á ááá°áá ááľá áĽááąá áááá á ááĽá. áá áá áááľá¨á, á á˛áľ ááá°á á°á¨á á˘áá´ááľ áĽáááĽáŤáá.
box.space.example:create_index( âsecondaryâ, { type = âTREEâ, unique = false, parts = {{field = 2, type =âstringâ} }})
ᨠCreate_index áľáááá áĽáá ááááá˘
ááá°á á°á¨á áĽáá ááá˘
á¨áá á áá áááŞáŤáá˝á áááá˝ áŤáľáááááłá. á¨áá¨á á ááá ááááľ TREE ááᢠáአáááá áá˝ááᣠáľááá áአ= áá¸áľ áŤáľááĄá˘
á¨á፠á¨áĽá áá¨á á áá áá áááá˝ áĽááłá áĽáá áááá. ááľá á˘áá´ááľá á¨áááľáá áľ á¨ááľá ááĽá ááᣠáĽá á¨ááĽá¨ááááá á áááľ áááášá˘ áľááá á á°áá á¨á˘
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 áᢠáá° á˛áľá ááŁá áĽáŠ ááłáĽ á áá°áá.
ááá ááá, á¨ááťá፠áááἠá˝áá°-ááłáĽ á°ááá°á áĽá á°á°ááĽáŻá. á áĽáą áĽááłáł, á áá¨áá áá ááá áĽáŤááłááą áááĽ, á áľáá˝ áťá-áá°ááľ á¨áááἠááľáłááť ááá ááľáĽ áá¤áľ ááá áŤá.
áĽáľá¨ áá°áť ááĽáĄ áľá¨áľ áŤáá áĽáŤááłááą áá¤áľ á ááľáŁá¸á áá¨ááťáᢠááĽááá áááá˝ áá áá áĽáááááá - áááłá, 64 ááŁ. á˛áá áá¨áť áá° ááá°áá ááá áááľ ááááŤáᢠáĽá á¨áłáá ááľááá á áá áłáŤááśá á¨áá¨á¨áťá á¨áá°áť ááĽáĽ áá°áá á¨á áľ ááááłá áĽá áĽáľáŞáá áľá¨áľ áááá á¨ááááá ááĽááśá˝ áá˝á¨á¨á¨áŤáá˘
áĽáá˛á
ááááąá áá¨áť ááá¨ááá á box.cfg á
ááĽáŽá˝ (á example.lua ááá) ááľáĽ áŤááá á ááŤá áááá˝ áŤáľáááááłáá˘
wal_mode = âwriteâ;
á¨ááἠá á ááá
á áá á áťááá ááá áá¨áá ááá¨áá¸áľ Tarantula á áá áá áá˝áá áĽá áĽáá° áłáłá¤á á ááĽááľ áá°áŤáᢠáĽá á áá á áŹá áá áŤáá á ááľááŹá áááá ááá ááľá¨á áá˝áá.
áááá¨áť á ááťá áá
áááłáᣠá 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()
áḠáŁá áŞáŤáąá á¨áááá˝ á ááłááľ á áá á¨áĽ á lua áĽáááááᢠá¨áááá° ááĽá¨ááá áááá á áá áłá á áŤáľááááá˘
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 á áááá á¨áłáŤááąá á áááá JSON áá áĽááááááá, áá á áá°áá áá á¨áááá¨á.
local http_router = require('http.router')
local http_server = require('http.server')
local json = require('json')
á¨áá á áá á ááá ᨠhttp á áááá áááááá˝ áá áá°áĽ 8080 áĽááááŤáá, áá á áááá áĽáŤááá˝ áĽá áľá á°áśá˝ áááááŁá.
local httpd = http_server.new('0.0.0.0', 8080, {
log_requests = true,
log_errors = true
})
á ááá á ááááąá áĽááááá, áľááá ᨠGET áá´ áá áĽáŤá á áááľ 8080 / áá ፠áá á¨á°á¨á°, á°ááŁáŠá á¨á ááľ ááľáá áĽáá áŤááá. áááłáá ááááłá - 200, 404, 403 ááá áá áĽá á¨ááá˝ááá.
router:route({method = 'GET', path = '/count'}, function()
return {status = 200, body = json.encode({count = get_count()})}
end)
á á°áááľ ááľáĽ json.encode á áĽááááłáá ᣠá áĽáą ááľáĽ áá ፠áĽá áá¤áľ áá áŤá áĽááłáŤáá ᣠáá á á¨á°á áŤá áĽá á áá¨á ááłá˝á ááľáĽ áŤááľá á¨ááááŚá˝ áĽááľ áŤáłáŤáá˘
ááá°á áá´
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)
á ááľáአááľáĽ á¨áľ áŤáá°á: ááááľ ({áá´ = 'GET'ᣠpath = '/token'}ᣠá°ááŁá() á°ááŁáŠá áĽáá áŤááá áĽá ááľáá°áŤ áĽáááĽáŤááá˘
ááľáá á áŤáŁá˘áŤá ááľáá°áŤ = randomString (32) á¨32 ááááá˝ á¨áááá° ááĽá¨ááá ááá˘
á á ááŁáĄ local á¨áá¨á¨áť = box.space.example:len() á¨áá¨á¨áťáá á áŤá áĽáááŁáá.
áĽá á ááľáአááľáĽ box.space.example:insert{á¨áá¨á¨áť +1ᣠááľáá°áŤ} áá¨ááá áá° á¨ááἠááłá˝á áĽáá˝ááá ᣠáááľá ᣠá ááá ááłáááŤáá á 1 áĽáá¨ááŤáá ᢠá áááŤá˝á áá ᣠá áá
áĽááš ááááľ áĽáť áłááá áá¨ááá áá˝ááᢠá Tarantula ááľáĽ ááá
á
á°á á°á¨á°áá˝ á á.
ááááąá áĽá፠áĽáá˝ááá.
áľááá , áááá¨áťáá á á ááľ ááá ááľáĽ á˝ááá. áááĄá áá˛áŤáá áááá á áá˝áá, áĽá á¨áłáĽá ááá áááá ááťáť áľáŤáá˝ ááĽááľá áŤá°áááááłá.
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:/#
/ áá ፠á°á¨á 200 áá°á áá.
/áśá¨á ááľáá°áŤ á ááĽáś áá
áá ááľáá°áŤ áá° áłáłá¤á áá˝ááá˘
ááĽááľá ááá¨á
á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 áĄáľá áĽáá áá á áŁá á á áᥠááłá°áá, áĽá á áĽááá áááľ á áá á˝áá ááľáĽ ááĽáą á ááá áĽáá¨ááŤáá.
á ááľáá áá áĽááá
á áááŽá˝ á áááááŁáŁá¸á ááá
áśá˝ áá áááłá°á áĽá á áĽááá°á áá áĽáŤááá˝á ááá á¨á
ááááľ áŤááľáŁ áá¨áłá°á
áá° á°áá áááľ á¨ááá ááá áľá áá á¨á° áááľá áĽáŤááá˝ áŤáááľáŁ
PS á áá 2 áá áŚá˛áľ á ááᣠááááŁáľ á¨áĽááľá ááŽáááľ á¨áĽááá
ááľáĽ á ááą ááá áá˝ááá˘
ááá: hab.com