Ing Tarantool, sampeyan bisa gabungke database super-cepet lan aplikasi kanggo bisa karo wong-wong mau. Mangkene carane gampang ditindakake

Limang taun kepungkur aku nyoba nggarap Tarantool, nanging ora bisa digunakake kanggo aku. Nanging bubar aku nganakake webinar ing ngendi aku ngomong babagan Hadoop lan cara kerja MapReduce. Ing kana dheweke takon pitakon: "Napa ora nggunakake Tarantool kanggo tugas iki?"

Amarga penasaran, aku mutusake bali menyang, nyoba versi paling anyar - lan wektu iki aku seneng banget karo proyek kasebut. Saiki aku bakal nuduhake sampeyan carane nulis aplikasi prasaja ing Tarantool, mbukak lan mriksa kinerja, lan sampeyan bakal weruh carane gampang lan kelangan kabeh.

Ing Tarantool, sampeyan bisa gabungke database super-cepet lan aplikasi kanggo bisa karo wong-wong mau. Mangkene carane gampang ditindakake

Apa Tarantool

Tarantool posisi dhewe minangka database ultra-cepet. Sampeyan bisa nyelehake data sing dikarepake ing kana. Kajaba iku, tiron, shard - yaiku, pamisah data sing akeh banget ing sawetara server lan gabungke asil kasebut - nggawe sambungan master-master sing tahan kesalahan.

Kapindho, iki minangka server aplikasi. Sampeyan bisa nulis aplikasi sampeyan, nggarap data, contone, mbusak cathetan lawas ing latar mburi miturut aturan tartamtu. Sampeyan bisa nulis server Http langsung ing Tarantula sing bakal bisa karo data: menehi metu jumlahe, nulis data anyar ana lan nyuda kabeh kanggo master.

Aku maca artikel babagan carane wong lanang nggawe antrian pesen 300 baris, sing mung bledosan lan cepet-cepet - padha duwe kinerja minimal 20 pesen per detik. Ing kene sampeyan bisa nguripake lan nulis aplikasi sing gedhe banget, lan ora bakal dadi panyimpenan, kaya ing PostgreS.

Aku bakal nyoba kanggo njlèntrèhaké kaya server iki, mung prasaja, ing artikel iki.

Instalasi

Kanggo tes, aku miwiti telung mesin virtual standar - hard drive 20 GB, Ubuntu 18.04. 2 CPU virtual lan 4 gigs memori.

Kita nginstal Tarantool - mbukak skrip bash utawa nambah repositori lan entuk nginstal Tarantool. Link menyang skrip - (curl -L https://tarantool.io/installer.sh | VER=2.4 sudo -E bash). Kita duwe perintah kaya:

tarantoolctl - printah utama kanggo ngatur kedadean Tarantula.
/etc/tarantool - kene kabeh konfigurasi.
var/log/tarantool - kene log.
var/lib/tarantool - data dumunung ing kene, banjur dipérang dadi conto.

Ana folder instance-available lan instance-enable - ngemot apa sing bakal diluncurake - file konfigurasi conto karo kode lua, sing nerangake port apa sing dirungokake, memori apa sing kasedhiya, setelan mesin vinyl, kode sing mlaku nalika wiwitan. server, sharding, antrian, mbusak data lungse, lan liya-liyane.

Instance bisa digunakake kaya ing PostgreS. Contone, sampeyan pengin mbukak sawetara salinan database sing macet ing port beda. Pranyata sawetara conto database diluncurake ing siji server, sing digantung ing port sing beda. Bisa uga duwe setelan sing beda-beda - siji conto ngetrapake siji logika, sing kapindho - liyane.

Manajemen conto

Kita duwe printah tarantoolctl, sing ngidini sampeyan ngatur conto Tarantula. Contone, conto mriksa tarantoolctl bakal mriksa file konfigurasi lan ujar - file kasebut ok yen ora ana kesalahan sintaks.

Sampeyan bisa ndeleng status conto - conto status tarantoolctl. Kanthi cara sing padha sampeyan bisa miwiti, mungkasi, miwiti maneh.

Sawise conto wis mlaku, sampeyan bisa nyambungake kanthi rong cara.

1. Konsol administratif

Kanthi gawan, Tarantool mbukak soket, teks ASCII normal dikirim ing kana kanggo ngontrol Tarantool. Sambungan menyang console tansah ana ing pangguna admin, ora ana bukti asli, supaya ora perlu kanggo externalize port console kanggo ngatur Tarantula.

Kanggo nyambung nggunakake cara iki, sampeyan kudu ngetik Tarantoolctl ketik jeneng conto. Printah bakal miwiti console lan nyambung minangka pangguna admin. Aja mbukak port console menyang njaba - luwih becik ninggalake minangka soket unit. Banjur mung sing duwe akses kanggo nulis menyang soket bakal bisa nyambung menyang Tarantula.

Cara iki dibutuhake kanggo perkara administratif. Kanggo nggarap data, gunakake cara liya - protokol binar.

2. Nggunakake protokol binar kanggo nyambung menyang port tartamtu

Konfigurasi kasebut ngemot arahan ngrungokake, sing mbukak port kanggo komunikasi eksternal. Port iki digunakake karo protokol binar lan otentikasi diaktifake ing kana.

Kanggo sambungan iki, tarantoolctl connect to port number digunakake. Nggunakake, sampeyan bisa nyambung menyang server remot, nggunakake otentikasi lan menehi macem-macem hak akses.

Rekaman Data lan Modul Box

Wiwit Tarantool minangka database lan server aplikasi, duwe macem-macem modul. Kita kasengsem ing modul kothak - iku ngleksanakake nggarap data. Nalika sampeyan nulis soko menyang kothak, Tarantool nulis data menyang disk, nyimpen ing memori, utawa nindakake liyane karo.

Ngrekam

Contone, kita pindhah menyang modul kothak lan nelpon fungsi box.once. Iki bakal meksa Tarantool kanggo mbukak kode kita nalika server wis initialized. Kita nggawe spasi ing ngendi data kita bakal disimpen.

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

Sawise iki, kita nggawe indeks utami - utami - sing bisa nggoleki data. Kanthi gawan, yen sampeyan ora nemtokake paramèter, kolom pisanan ing saben rekaman bakal digunakake kanggo indeks utama.

Banjur kita nggawe hibah kanggo pangguna tamu, ing ngendi kita nyambungake liwat protokol binar. Kita ngidini maca, nulis lan nglakokake kabeh conto.

Dibandhingake karo database konvensional, kabeh ing kene cukup prasaja. Kita duwe ruang - area sing data kita mung disimpen. Saben rekaman diarani tuple. Iku wis rangkep ing MessagePack. Iki minangka format sing apik banget - binar lan butuh ruang sing kurang - 18 bita lawan 27.

Ing Tarantool, sampeyan bisa gabungke database super-cepet lan aplikasi kanggo bisa karo wong-wong mau. Mangkene carane gampang ditindakake

Cukup trep kanggo nggarap dheweke. Meh saben baris, saben rekaman data bisa duwe kolom temen beda.

Kita bisa ndeleng kabeh spasi nggunakake printah Box.space. Kanggo milih conto tartamtu, tulis conto box.space lan entuk informasi lengkap babagan kasebut.

Tarantool duwe rong mesin sing dibangun: Memori lan Vinyl. Memori nyimpen kabeh data ing memori. Mulane, kabeh bisa gampang lan cepet. Data dibuwang menyang disk, lan ana uga mekanisme log nulis ahead, supaya kita ora bakal kelangan apa-apa yen server tubrukan.

Vinyl nyimpen data ing disk ing wangun luwih menowo kanggo kita - sing, sampeyan bisa nyimpen data luwih saka kita duwe memori, lan Tarantula bakal maca saka disk.

Saiki kita bakal nggunakake Memori.

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>

Indeks:

Indeks utami kudu digawe kanggo papan apa wae, amarga tanpa iku ora bakal bisa digunakake. Kaya ing database apa wae, kita nggawe lapangan pisanan - ID rekaman.

Bagean:

Ing kene kita nuduhake apa indeks kita kalebu. Iki kalebu siji bagean - kolom pisanan sing bakal digunakake yaiku jinis unsigned - integer positif. Minangka adoh aku elinga saka dokumentasi, jumlah maksimum sing bisa dadi 18 quintillion. Sing akeh.

Banjur kita bisa nglebokake data nggunakake printah insert.

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>

Kolom pisanan digunakake minangka kunci utama, mula kudu unik. Kita ora diwatesi kanthi jumlah kolom, supaya kita bisa nglebokake data kaya sing dikarepake. Dheweke ditemtokake ing format MessagePack, sing dakkandhakake ing ndhuwur.

Output data

Banjur kita bisa nampilake data nggunakake printah pilih.

Box.example.select nganggo tombol {1} ​​bakal nampilake entri sing dikarepake. Yen kita ngedhunake tombol, kita bakal weruh kabeh cathetan sing kita duwe. Kabeh mau beda-beda ing jumlah kolom, nanging ing kene, ing prinsip, ora ana konsep kolom - ana nomer lapangan.

Bisa uga ana jumlah data apa wae. Lan contone, kita kudu nelusuri wong-wong mau ing lapangan kapindho. Kanggo nindakake iki, kita nggawe indeks sekunder anyar.


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

Kita nggunakake perintah Create_index.
Ayo diarani Sekunder.

Sawise iki, sampeyan kudu nemtokake paramèter. Tipe indeks yaiku TREE. Bisa uga ora unik, mula ketik Unique = palsu.

Banjur kita nuduhake apa bagean indeks kita kalebu. Field minangka nomer kolom sing kita ikatan indeks, lan nemtokake jinis string. Lan banjur digawe.

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>

Saiki iki carane kita bisa nelpon:

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

Ngirit

Yen kita miwiti maneh conto lan nyoba nelpon data maneh, kita bakal weruh sing ora ana - kabeh kosong. Iki kedadeyan amarga Tarantool nggawe checkpoints lan nyimpen data menyang disk, nanging yen kita mandheg nggarap nganti nyimpen sabanjuré, kita bakal kelangan kabeh operasi - amarga kita bakal waras saka checkpoint pungkasan, kang ana, contone, rong jam kepungkur.

Iku ora bakal bisa kanggo nyimpen saben detik uga, amarga terus-terusan mbuwang 20 GB menyang disk ora apike.

Kanggo maksud iki, konsep nulis-ahead log diciptakake lan dileksanakake. Kanthi bantuan, kanggo saben owah-owahan ing data, entri digawe ing file log nulis-ahead cilik.

Saben entri nganti checkpoint disimpen ing. Kanggo file iki kita nyetel ukuran - contone, 64 MB. Nalika kebak, rekaman wiwit pindhah menyang file kapindho. Lan sawise miwiti maneh, Tarantool dibalekake saka checkpoint pungkasan lan banjur muter kabeh transaksi mengko nganti mandheg.

Ing Tarantool, sampeyan bisa gabungke database super-cepet lan aplikasi kanggo bisa karo wong-wong mau. Mangkene carane gampang ditindakake

Kanggo nindakake rekaman kasebut, sampeyan kudu nemtokake pilihan ing setelan box.cfg (ing file example.lua):

wal_mode = “write”;

panggunaan data

Kanthi apa sing wis ditulis saiki, sampeyan bisa nggunakake Tarantula kanggo nyimpen data lan bakal bisa digunakake kanthi cepet minangka basis data. Lan saiki icing ing kue apa sampeyan bisa nindakake kabeh.

Nulis aplikasi

Contone, ayo nulis aplikasi Tarantula ing ngisor iki

Waca aplikasi ing spoiler

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()

We ngumumake sawetara tabel ing lua sing nemtokake karakter. piring iki perlu kanggo generate senar acak.

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

Sawise iku, kita ngumumake fungsi - randomString lan menehi nilai dawa ing kurung.

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

Banjur kita nyambungake router http lan server http menyang server Tarantula, JSON, sing bakal dikirim menyang klien.

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

Sawise iki, kita miwiti ing port 8080 ing kabeh antarmuka server http, sing bakal mlebu kabeh panjalukan lan kasalahan.

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

Sabanjure, kita ngumumake rute, supaya yen panjaluk kanthi metode GET teka ing port 8080 / count, banjur kita nelpon fungsi saka siji baris. Iki ngasilake status - 200, 404, 403 utawa liyane sing kita nemtokake.

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

Ing awak kita bali json.encode, ing kita nuduhake count lan getcount, kang disebut lan nuduhake nomer cathetan ing database kita.

Cara kapindho

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)

Ing endi ing baris router:route({metode = 'GET', path = '/token'}, function() kita nelpon fungsi lan generate token.

Senar token lokal = randomString(32) iku string acak saka 32 karakter.
Ing baris lokal pungkasan = box.space.example:len() kita njupuk metu unsur pungkasan.
Lan ing baris box.space.example:insert{ last + 1, token } kita nulis data menyang database kita, sing, kita mung nambah ID dening 1. Iki bisa rampung, dening cara, ora mung ing cara kikuk iki. Ana urutan iki ing Tarantula.

Kita nulis token ing kana.

Mangkono, kita nulis aplikasi ing siji file. Sampeyan bisa langsung ngapusi data ana, lan modul kothak bakal nindakake kabeh karya reged kanggo sampeyan.

Iku ngrungokake http lan dianggo karo data, kabeh ing Kayata siji - loro aplikasi lan data. Mulane, kabeh kedadeyan cukup cepet.

Kanggo miwiti, kita nginstal modul http:

Carane nindakake iki, katon ing spoiler

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:/#

Kita uga butuh prometheus kanggo mbukak:

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:/#

Kita miwiti lan bisa ngakses modul

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 menehi status 200.
/ token ngetokake token lan nulis token iki menyang database.

kacepetan Testing

Ayo dadi pathokan kanggo 50 panjalukan. Bakal ana 000 panjaluk saingan.

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:/#

Token ditanggepi. Lan kita terus ngrekam data. 99% panjalukan diproses ing 42 milidetik. Patut, kita duwe bab 3500 panjalukan per detik ing mesin cilik karo 2 intine lan 4 gigabyte memori.

Sampeyan uga bisa milih sawetara 50000 token lan ndeleng regane.

Sampeyan bisa nggunakake ora mung http, nanging uga mbukak fungsi latar mburi sing ngolah data. Kajaba iku, ana macem-macem pemicu. Contone, sampeyan bisa nelpon fungsi ing nganyari, mriksa soko - konflik bener.

Sampeyan bisa nulis aplikasi script langsung ing server database dhewe, lan ora diwatesi dening apa-apa, nyambung modul sembarang lan ngleksanakake logika sembarang.

Server aplikasi bisa ngakses server eksternal, njupuk data lan nambah menyang database. Data saka database iki bakal digunakake dening aplikasi liyane.

Tarantula bakal nindakake iki dhewe, lan sampeyan ora kudu nulis aplikasi kapisah.

Ing kesimpulan

Iki mung bagean pisanan saka karya gedhe. Kapindho bakal diterbitake ing blog Mail.ru Group, lan kita mesthi bakal nambah link menyang materi iki.

Yen sampeyan kasengsem nekani acara ing ngendi kita nggawe barang-barang kasebut kanthi online lan takon pitakon ing wektu nyata, atur saluran DevOps dening REBRAIN.

Yen sampeyan kudu pindhah menyang awan utawa duwe pitakon babagan infrastruktur sampeyan, aran gratis kanggo ninggalake panjalukan.

PS Kita duwe 2 audit gratis saben wulan, mbok menawa proyek sampeyan bakal dadi salah sijine.

Source: www.habr.com

Add a comment