Dina Tarantool, anjeun tiasa ngagabungkeun database super-gancang sareng aplikasi pikeun dianggo sareng aranjeunna. Kieu kumaha gampangna

Lima taun ka tukang kuring diusahakeun digawekeun ku Tarantool, tapi lajeng teu dianggo keur kuring. Tapi nembe kuring ngayakeun webinar dimana kuring ngobrol ngeunaan Hadoop, ngeunaan kumaha jalanna MapReduce. Di dinya kuring ditaroskeun patarosan - "Naha henteu nganggo Tarantool pikeun tugas ieu?".

Pikeun rasa panasaran, kuring mutuskeun pikeun uih deui, nguji versi panganyarna - sareng waktos ieu kuring resep pisan kana proyék éta. Ayeuna kuring bakal nunjukkeun kumaha cara nyerat aplikasi saderhana di Tarantool, muatkeun sareng pariksa kinerjana, sareng anjeun bakal ningali kumaha gampang sareng tiis sadayana aya.

Dina Tarantool, anjeun tiasa ngagabungkeun database super-gancang sareng aplikasi pikeun dianggo sareng aranjeunna. Kieu kumaha gampangna

Naon Tarantool

Tarantool posisi sorangan salaku database ultra-gancang. Anjeun tiasa nempatkeun data anu anjeun pikahoyong di dinya. Tambih Deui, ngayakeun réplikasi aranjeunna, beling - nyaéta, ngabagi sajumlah ageung data dina sababaraha server sareng ngagabungkeun hasil tina aranjeunna - ngadamel tautan master-master anu teu toleran.

Bréh, éta mangrupa server aplikasi. Anjeun tiasa nyerat aplikasi anjeun dina éta, damel sareng data, contona, ngahapus éntri lami di latar tukang dumasar kana aturan anu tangtu. Anjeun tiasa nyerat server Http langsung di Tarantula anu bakal dianggo sareng data: masihan nomerna, nyerat data énggal sareng ngirangan sadayana ka master.

Kuring maca hiji artikel ngeunaan kumaha guys dijieun antrian pesen 300-garis, nu ngan cimata jeung thrashes - aranjeunna gaduh kinerja minimum 20 pesen per detik. Di dieu anjeun leres-leres tiasa ngurilingan sareng nyerat aplikasi anu ageung pisan, sareng ieu moal disimpen, sapertos dina PostgreS.

Kira-kira server sapertos kitu, ngan saderhana, kuring bakal nyobian ngajelaskeun dina tulisan ieu.

setting

Pikeun tés, kuring ngamimitian tilu mesin virtual standar - hard drive 20 gigabyte, Ubuntu 18.04. 2 CPU virtual sareng 4 gigabyte mémori.

Kami masang Tarantool - ngajalankeun skrip bash atanapi tambahkeun gudang sareng apt install Tarantool. Tumbu ka naskah - (curl -L https://tarantool.io/installer.sh | VER = 2.4 sudo -E bash). Kami ngagaduhan paréntah sapertos:

tarantoolctl nyaéta paréntah utama pikeun ngatur instansi Tarantula.
/etc/tarantool - di dieu perenahna sakabéh konfigurasi.
var/log/tarantool - ieu log.
var/lib/tarantool - di dieu perenahna data, lajeng aranjeunna dibagi kana instansi.

Aya polder anu sayogi sareng conto-aktipkeun - ngandung naon anu bakal diluncurkeun - file konfigurasi conto sareng kode lua, anu ngajelaskeun port mana anu didangukeun, naon mémori anu sayogi, setélan mesin vinyl, kode anu dianggo nalika ngamimitian. server, sharding, antrian, ngahapus data usang, jeung saterusna.

Instansi dianggo sapertos di PostgreS. Contona, Anjeun hoyong ngajalankeun sababaraha salinan database nu hangs on palabuhan béda. Tétéla sababaraha instansi database diluncurkeun dina hiji server, anu ngagantung dina palabuhan anu béda. Éta tiasa gaduh setélan anu béda-béda - hiji conto ngalaksanakeun hiji logika, anu kadua - anu sanés.

Manajemén Instance

Kami gaduh paréntah tarantoolctl anu ngamungkinkeun urang pikeun ngatur instansi Tarantula. Contona, conto cék tarantoolctl bakal mariksa file konfigurasi sareng nyarios file éta henteu kunanaon upami teu aya kasalahan sintaksis.

Anjeun tiasa ningali status tina conto - tarantoolctl status conto. Dina cara nu sami, anjeun tiasa ngalakukeun ngamimitian, eureun, balikan deui.

Sakali instance dijalankeun, aya dua cara pikeun nyambungkeunana.

1. Konsol administratif

Sacara standar, Tarantool muka stop kontak sarta ngirimkeun téks ASCII polos pikeun ngadalikeun Tarantula. Sambungan ka konsol salawasna lumangsung dina pamaké admin, euweuh auténtikasi, jadi Anjeun teu kedah nyandak kaluar port konsol pikeun ngadalikeun Tarantula luar.

Pikeun nyambung ku cara ieu, anjeun kedah asupkeun Tarantoolctl asupkeun nami conto. Paréntah bakal ngaluncurkeun konsol sareng sambungkeun salaku pangguna admin. Pernah ngalaan port konsol ka luar - eta leuwih hade ninggalkeun eta salaku stop kontak unit. Lajeng ngan maranéhanana anu boga aksés nulis kana stop kontak bakal bisa nyambung ka Tarantula.

Metoda ieu diperlukeun pikeun hal administrasi. Pikeun damel sareng data, paké metodeu kadua - protokol binér.

2. Ngagunakeun protokol binér pikeun nyambung ka port husus

Aya diréktif ngadangukeun dina konfigurasi, anu muka port pikeun komunikasi éksternal. Port ieu dianggo sareng protokol binér sareng auténtikasi diaktipkeun di dinya.

Pikeun sambungan ieu, tarantoolctl nyambung ka nomer port dipaké. Ngagunakeun eta, Anjeun bisa nyambung ka server jauh, ngagunakeun auténtikasi sarta méré sagala rupa hak aksés.

Ngarekam Data jeung Box Module

Kusabab Tarantool mangrupikeun database sareng server aplikasi, éta ngagaduhan sababaraha modul. Kami kabetot dina modul kotak - éta ngalaksanakeun gawé bareng data. Nalika anjeun nyerat hal kana kotak, Tarantool nyerat data kana disk, nyimpen dina mémori, atanapi ngalakukeun anu sanés.

Ngarekam

Salaku conto, urang lebet kana modul kotak sareng nyauran fungsi box.once. Bakal maksa Tarantool pikeun ngajalankeun kode urang nalika server ieu initialized. Urang nyiptakeun rohangan dimana data urang 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

Sanggeus éta, urang nyieun hiji indéks primér - primér - ku nu urang tiasa milarian data. Sacara standar, upami henteu aya parameter anu ditangtukeun, kolom munggaran dina unggal éntri pikeun indéks primer bakal dianggo.

Teras we ngadamel hibah ka pangguna tamu, dimana urang sambungkeun via protokol binér. Kami ngawenangkeun maca, nyerat sareng ngaéksekusi dina sadaya conto.

Dibandingkeun sareng pangkalan data konvensional, sadayana saderhana di dieu. Simkuring gaduh spasi - wewengkon nu data urang ngan disimpen. Unggal éntri disebut tuple. Éta dibungkus dina MessagePack. Ieu mangrupikeun format anu saé pisan - éta binér sareng nyandak kirang rohangan - 18 bait versus 27.

Dina Tarantool, anjeun tiasa ngagabungkeun database super-gancang sareng aplikasi pikeun dianggo sareng aranjeunna. Kieu kumaha gampangna

Ieu rada merenah pikeun digawe sareng anjeunna. Ampir unggal garis, unggal éntri data tiasa gaduh kolom anu béda-béda.

Urang tiasa ningali sadaya rohangan nganggo paréntah Box.space. Pikeun milih conto khusus, urang nyerat conto box.space sareng kéngingkeun inpormasi lengkep ngeunaan éta.

Aya dua jinis mesin anu diwangun kana Tarantool: Mémori sareng Vinyl. Mémori nyimpen sadaya data dina mémori. Ku alatan éta, sagalana jalan basajan tur gancang. Data dibuang kana disk, sareng aya ogé mékanisme log nulis payun, ku kituna urang moal kaleungitan nanaon upami server nabrak.

Vinyl nyimpen data dina disk dina formulir leuwih akrab - nyaeta, anjeun tiasa nyimpen leuwih data ti urang boga memori, sarta Tarantula bakal maca eta tina disk.

Ayeuna urang bakal ngagunakeun Mémori.

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>

Indéks:

Indéks primér kedah didamel pikeun rohangan naon waé, sabab teu aya anu tiasa dianggo tanpa éta. Sapertos dina pangkalan data naon waé, urang nyiptakeun lapangan anu munggaran - ID catetan.

bagian:

Ieu dimana urang nangtukeun naon indéks kami diwangun. Ieu diwangun ku hiji bagian - widang munggaran nu urang bakal make, ngetik unsigned - integer positif. Sajauh anu kuring émut tina dokuméntasi, jumlah maksimal anu tiasa nyaéta 18 quintillion. Seueur pisan.

Urang teras tiasa ngalebetkeun data nganggo paréntah sisipan.

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>

Widang kahiji dipaké salaku konci primér, jadi kudu unik. Kami teu diwatesan ku jumlah kolom, sangkan bisa nyelapkeun saloba data sakumaha urang resep aya. Éta dieusian dina format MessagePack, anu ku kuring dijelaskeun di luhur.

Kaluaran data

Teras urang tiasa ningalikeun data kalayan paréntah pilih.

Box.example.select jeung konci {1} bakal mintonkeun entri nu dipikahoyong. Upami urang ngaleungitkeun konci, urang bakal ningali sadaya catetan anu urang gaduh. Éta sadayana béda dina jumlah kolom, tapi di dieu, prinsipna mah, teu aya konsep kolom - aya nomer widang.

Aya tiasa leres-leres seueur data anu anjeun pikahoyong. Salaku conto, urang kedah milarian aranjeunna dina widang kadua. Jang ngalampahkeun ieu, urang nyieun indéks sekundér anyar.


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

Kami nganggo paréntah Create_index.
Urang sebut Sekunder.

Sanggeus éta, anjeun kudu nangtukeun parameter. Jinis indéks nyaéta tangkal. Ieu bisa jadi teu unik, jadi urang asupkeun Unique = palsu.

Teras we nunjukkeun bagian naon indéks urang diwangun. Widang nyaeta jumlah widang nu urang meungkeut indéks, sarta nangtukeun jenis string. Sarta eta dijieun.

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>

Ayeuna ieu kumaha urang tiasa nyebatna:

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

Nyimpen

Upami urang ngabalikan deui conto sareng nyobian nyauran data deui, urang bakal ningali yén aranjeunna henteu aya - sadayana kosong. Ieu kajadian sabab Tarantool ngajadikeun checkpoints sarta ngahemat data kana disk, tapi lamun urang eureun gawé saméméh nyimpen salajengna, urang bakal leungit kabeh operasi - sabab urang bakal cageur tina papariksaan panungtungan, nu éta, contona, dua jam ka tukang.

Nyimpen unggal detik ogé moal jalan - sabab terus dumping 20 GB ka disk mangrupakeun ide nu kitu-kitu.

Pikeun ieu, konsép log tulis-payun diciptakeun sareng dilaksanakeun. Kalayan pitulung na, pikeun tiap parobahan dina data, rékaman dijieun dina file log nulis-hareup leutik.

Unggal éntri nepi ka pos pamariksaan disimpen di dinya. Pikeun file ieu, urang nyetel ukuran - contona, 64 mb. Nalika ngeusian, ngarékam dimimitian ka file kadua. Sareng saatos balikan deui, Tarantool pulih tina pos pamariksaan anu terakhir teras ngagulung sadaya transaksi engké dugi ka lirén.

Dina Tarantool, anjeun tiasa ngagabungkeun database super-gancang sareng aplikasi pikeun dianggo sareng aranjeunna. Kieu kumaha gampangna

Pikeun ngalakukeun rékaman sapertos kitu, anjeun kedah netepkeun pilihan dina setélan box.cfg (dina file example.lua):

wal_mode = “write”;

pamakéan data

Kalayan naon anu kami tulis ayeuna, anjeun tiasa nganggo Tarantula pikeun nyimpen data sareng éta bakal tiasa dianggo gancang pisan salaku pangkalan data. Sareng ayeuna céri dina jajan - naon anu anjeun tiasa laksanakeun sareng éta sadayana.

Nulis aplikasi

Contona, hayu urang nulis aplikasi misalna pikeun Tarantula

Tempo aplikasi dina 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()

Urang dibewarakeun sababaraha tabel di lua nu ngahartikeun simbol. tabél ieu diperlukeun pikeun ngahasilkeun string 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

Saatos éta, urang nyatakeun fungsi - randomString sareng masihan nilai panjang dina 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

Teras urang sambungkeun router http sareng server http kana server Tarantula kami, JSON, anu bakal kami pasihan ka klien.

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

Sanggeus éta, urang mimitian on port 8080 on sadayana interfaces server http, nu bakal asup sagala requests jeung kasalahan.

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

Salajengna, urang dibewarakeun jalur yén lamun pamundut kalawan metoda GET sumping dina port 8080 / count, lajeng urang nelepon fungsi tina hiji garis. Ieu mulih status a - 200, 404, 403 atanapi naon urang tangtukeun.

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

Dina awak, urang balik json.encode, urang nangtukeun count na getcount di dinya, nu disebut tur nembongkeun jumlah rékaman dina database urang.

Metodeu kadua

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)

Dimana dina garis router: route ({metode = 'GET', jalur = '/ token'}, fungsi () urang nelepon fungsi jeung ngahasilkeun token a.

Jalur token lokal = randomString(32) mangrupakeun string acak tina 32 karakter.
Baris lokal panungtungan = box.space.example:len() urang tarik kaluar unsur panungtungan.
Jeung dina garis box.space.example:selapkeun {pamungkas + 1, token} urang nulis data kana database urang, nyaeta, urang ngan nambahan ID ku 1. Ieu bisa dipigawé, ku jalan, teu ukur ku cara kagok. Tarantula gaduh sekuen pikeun hal ieu.

Urang nulis token di dinya.

Ku kituna, urang nulis hiji aplikasi dina hiji file. Anjeun tiasa ngaksés data langsung, sareng modul kotak bakal ngalakukeun sagala padamelan anu kotor pikeun anjeun.

Éta ngadangukeun http sareng tiasa dianggo sareng data, sadayana aya dina hiji conto - boh aplikasi sareng data. Ku alatan éta, sagalana lumangsung cukup gancang.

Pikeun ngajalankeun, urang masang modul http:

Kumaha urang ngalakukeun eta, tingali handapeun spoiler nu

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

Urang ogé peryogi prometheus pikeun ngajalankeun:

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

Urang mimitian tur 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 masihan kami status 200.
/ token ngaluarkeun token sareng nyerat token ieu kana pangkalan data.

laju nguji

Hayu urang ngajalankeun patokan pikeun 50 queries. Paménta kalapa bakal 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:/#

Token dikaluarkeun. Sarta kami terus ngarekam data. 99% tina requests réngsé dina 42 milliseconds. Sasuai, urang boga ngeunaan 3500 requests per detik dina mesin leutik, dimana aya 2 cores na 4 gigabyte memori.

Anjeun oge bisa milih sababaraha 50000 token tur tingal nilaina.

Anjeun tiasa make teu ngan http, ngajalankeun fungsi tukang nu ngolah data anjeun. Sajaba ti éta, aya rupa-rupa pemicu. Contona, anjeun tiasa nelepon fungsi dina apdet, pariksa hal - ngalereskeun bentrok.

Anjeun tiasa nyerat aplikasi skrip langsung dina server database sorangan, sareng henteu diwatesan ku nanaon, sambungkeun modul naon waé sareng nerapkeun logika naon waé.

Pangladén aplikasi tiasa ngaksés pangladén éksternal, ngumpulkeun data sareng nambihan kana pangkalan datana. Data tina pangkalan data ieu bakal dianggo ku aplikasi anu sanés.

Ieu bakal dilakukeun ku Tarantula sorangan, sarta teu perlu nulis aplikasi misah.

dina kacindekan

Ieu ngan bagian kahiji tina pakasaban badag. Anu kadua bakal diterbitkeun pas pisan dina blog Grup Mail.ru, sareng kami pasti bakal nambihan tautan kana tulisan ieu.

Upami anjeun resep ngahadiran acara dimana urang nyiptakeun hal-hal ieu sacara online sareng naroskeun patarosan sacara real waktos, sambungkeun ka DevOps ku saluran REBRAIN.

Upami anjeun kedah ngalih ka awan atanapi gaduh patarosan ngeunaan infrastruktur anjeun, Ngarasa Luncat ka ngalebetkeun pamundut a.

PS Urang boga 2 bebas audits per bulan, meureun proyék anjeun bakal salah sahijina.

sumber: www.habr.com

Tambahkeun komentar