Tarantoolissa voit yhdistää supernopean tietokannan ja sovelluksen työskentelemään niiden kanssa. Näin helppoa se on

Viisi vuotta sitten yritin työskennellä Tarantoolin kanssa, mutta silloin se ei toiminut minulle. Mutta äskettäin pidin webinaarin, jossa puhuin Hadoopista, siitä, kuinka MapReduce toimii. Siellä minulta kysyttiin kysymys - "Miksi et käytä Tarantolia tähän tehtävään?".

Uteliaisuuden vuoksi päätin palata siihen, testata uusinta versiota - ja tällä kertaa pidin projektista todella. Nyt näytän kuinka kirjoittaa yksinkertainen sovellus Tarantoolissa, ladata se ja tarkistaa suorituskyky, ja näet kuinka helppoa ja siistiä kaikki siellä on.

Tarantoolissa voit yhdistää supernopean tietokannan ja sovelluksen työskentelemään niiden kanssa. Näin helppoa se on

Mikä on Tarantool

Tarantool asettuu erittäin nopeaksi tietokannaksi. Voit laittaa sinne mitä tahansa tietoja. Lisäksi kopioi ne, sirpale - eli jaa valtava määrä dataa useille palvelimille ja yhdistä niiden tulokset - luo vikasietoisia master-master-linkkejä.

Toiseksi se on sovelluspalvelin. Voit kirjoittaa siihen sovelluksiasi, työskennellä tietojen kanssa, esimerkiksi poistaa vanhoja merkintöjä taustalla tiettyjen sääntöjen mukaisesti. Voit kirjoittaa suoraan Tarantulaan Http-palvelimen, joka toimii datan kanssa: anna niiden numero, kirjoita sinne uutta dataa ja pienennä se kaikki masteriksi.

Luin artikkelin siitä, kuinka kaverit tekivät 300-rivisen viestijonon, joka vain repii ja iskee - heidän vähimmäissuorituskykynsä on 20 000 viestiä sekunnissa. Täällä voit todella kääntyä ja kirjoittaa erittäin suuren sovelluksen, eikä niitä tallenneta, kuten PostgreS:ssä.

Suunnilleen tällainen palvelin, vain yksinkertainen, yritän kuvata tässä artikkelissa.

Asennus

Testiä varten käynnistin kolme tavallista virtuaalikonetta - 20 gigatavun kiintolevyn, Ubuntu 18.04. 2 virtuaalista prosessoria ja 4 gigatavua muistia.

Asennamme Tarantoolin - suorita bash-skripti tai lisää arkisto ja asenna Tarantool. Linkki käsikirjoitukseen - (curl -L https://tarantool.io/installer.sh | VER=2.4 sudo -E bash). Meillä on komennot, kuten:

tarantoolctl on pääkomento Tarantula-instanssien hallintaan.
/etc/tarantool - Tässä on koko kokoonpano.
var/log/tarantool - tässä lokit.
var/lib/tarantool - tässä on tiedot, ja sitten ne jaetaan tapauksiin.

On olemassa ilmentymiä käytettävissä olevia ja instanssia sallivia kansioita - se sisältää mitä käynnistetään - ilmentymän määritystiedosto lua-koodilla, joka kuvaa mitä portteja se kuuntelee, mikä muisti on käytettävissä, Vinyylimoottorin asetukset, koodi, joka toimii käynnistyksen yhteydessä palvelimet, jakaminen, jonot, vanhentuneiden tietojen poistaminen ja niin edelleen.

Instanssit toimivat kuten PostgreS:ssä. Haluat esimerkiksi suorittaa useita kopioita tietokannasta, joka roikkuu eri porteissa. Osoittautuu, että yhdelle palvelimelle käynnistetään useita tietokantailmentymiä, jotka roikkuvat eri porteissa. Niillä voi olla täysin erilaiset asetukset - yksi ilmentymä toteuttaa yhtä logiikkaa, toinen - toista.

Instanssien hallinta

Meillä on tarantoolctl-komento, jonka avulla voimme hallita Tarantula-ilmentymiä. Esimerkiksi tarantoolctl-tarkistusesimerkki tarkistaa määritystiedoston ja sanoo, että tiedosto on kunnossa, jos syntaksivirheitä ei ole.

Voit nähdä ilmentymän tilan - tarantoolctl status esimerkki. Samalla tavalla voit käynnistää, pysäyttää ja käynnistää uudelleen.

Kun ilmentymä on käynnissä, on kaksi tapaa muodostaa yhteys siihen.

1. Hallintakonsoli

Oletuksena Tarantool avaa pistorasian ja lähettää tavallisen ASCII-tekstin ohjatakseen Tarantulaa. Yhteys konsoliin tapahtuu aina admin-käyttäjän alaisuudessa, todennusta ei ole, joten sinun ei tarvitse irrottaa konsoliporttia ohjataksesi Tarantulaa ulkona.

Voit muodostaa yhteyden tällä tavalla kirjoittamalla Tarantoolctl enter instanssin nimi. Komento käynnistää konsolin ja muodostaa yhteyden järjestelmänvalvojana. Älä koskaan altista konsolin porttia ulkopuolelle - on parempi jättää se yksikön pistorasiaksi. Sitten vain ne, joilla on kirjoitusoikeus pistorasiaan, voivat muodostaa yhteyden Tarantulaan.

Tätä menetelmää tarvitaan hallinnollisiin asioihin. Työskentele tietojen kanssa käyttämällä toista menetelmää - binaariprotokollaa.

2. Binaariprotokollan käyttäminen yhteyden muodostamiseen tiettyyn porttiin

Konfiguraatiossa on kuunteluohje, joka avaa portin ulkoista viestintää varten. Tätä porttia käytetään binääriprotokollan kanssa ja todennus on käytössä siellä.

Tätä yhteyttä varten käytetään tarantoolctl connect to portin numeroon. Sen avulla voit muodostaa yhteyden etäpalvelimiin, käyttää todennusta ja antaa erilaisia ​​käyttöoikeuksia.

Tiedontallennus ja laatikkomoduuli

Koska Tarantool on sekä tietokanta että sovelluspalvelin, siinä on useita moduuleja. Olemme kiinnostuneita laatikkomoduulista - se toteuttaa työn tietojen kanssa. Kun kirjoitat jotain laatikkoon, Tarantool kirjoittaa tiedot levylle, tallentaa ne muistiin tai tekee jotain muuta sillä.

Ennätys

Esimerkiksi menemme laatikkomoduuliin ja kutsumme box.once-funktiota. Se pakottaa Tarantoolin suorittamaan koodimme, kun palvelin alustetaan. Luomme tilan, johon tietomme tallennetaan.

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

Sen jälkeen luomme ensisijaisen indeksin - ensisijaisen - jonka avulla voimme etsiä tietoja. Oletusarvon mukaan, jos parametreja ei ole määritetty, alukeindeksin jokaisen merkinnän ensimmäistä kenttää käytetään.

Sitten teemme vieraskäyttäjälle luvan, jonka alaisuudessa muodostamme yhteyden binääriprotokollan kautta. Sallimme lukemisen, kirjoittamisen ja suorittamisen koko tapauksessa.

Verrattuna perinteisiin tietokantoihin täällä kaikki on melko yksinkertaista. Meillä on tilaa – alue, jolle tietomme yksinkertaisesti tallennetaan. Jokaista merkintää kutsutaan tupleksi. Se on pakattu MessagePackiin. Tämä on erittäin siisti muoto - se on binääri ja vie vähemmän tilaa - 18 tavua vs. 27.

Tarantoolissa voit yhdistää supernopean tietokannan ja sovelluksen työskentelemään niiden kanssa. Näin helppoa se on

Hänen kanssaan on mukava työskennellä. Lähes jokaisella rivillä ja jokaisella tietosyötöllä voi olla täysin erilaisia ​​sarakkeita.

Voimme tarkastella kaikkia välilyöntejä Box.space-komennolla. Tietyn esiintymän valitsemiseksi kirjoitamme esimerkki box.space ja saamme siitä täydelliset tiedot.

Tarantoolissa on kahden tyyppisiä moottoreita: muisti ja vinyyli. Muisti tallentaa kaikki tiedot muistiin. Siksi kaikki toimii yksinkertaisesti ja nopeasti. Tiedot syötetään levylle, ja siellä on myös kirjoitus eteenpäin -lokimekanismi, joten emme menetä mitään, jos palvelin kaatuu.

Vinyyli tallentaa tiedot levylle tutummassa muodossa - eli voit tallentaa enemmän tietoa kuin meillä on muistia, ja Tarantula lukee sen levyltä.

Nyt käytämme muistia.

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>

Indeksi:

Ensisijainen hakemisto on luotava mille tahansa tilalle, koska mikään ei toimi ilman sitä. Kuten missä tahansa tietokannassa, luomme ensimmäisen kentän - tietuetunnuksen.

Osat:

Tässä määritämme, mistä indeksimme koostuu. Se koostuu yhdestä osasta - ensimmäisestä käyttämästämme kentästä, kirjoita unsigned - positiivisesta kokonaisluvusta. Sikäli kuin muistan asiakirjoista, enimmäismäärä, joka voi olla, on 18 kvintiljoonaa. Paljon mahtavaa.

Voimme sitten lisätä tietoja käyttämällä insert-komentoa.

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>

Ensimmäistä kenttää käytetään ensisijaisena avaimena, joten sen on oltava yksilöllinen. Sarakkeiden määrä ei rajoita meitä, joten voimme lisätä sinne niin paljon tietoja kuin haluamme. Ne on määritelty MessagePack-muodossa, jonka kuvasin edellä.

Tietojen ulostulo

Sitten voimme näyttää tiedot Select-komennolla.

Box.example.select näppäimellä {1} näyttää halutun merkinnän. Jos jätämme pois avaimen, näemme kaikki tietueet, jotka meillä on. Ne ovat kaikki erilaisia ​​​​sarakkeiden lukumäärässä, mutta tässä periaatteessa ei ole sarakkeiden käsitettä - on kenttänumeroita.

Dataa voi olla aivan niin paljon kuin haluat. Ja esimerkiksi meidän täytyy etsiä niitä toisesta kentästä. Tätä varten teemme uuden toissijaisen indeksin.


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

Käytämme Create_index -komentoa.
Kutsumme sitä toissijaiseksi.

Sen jälkeen sinun on määritettävä parametrit. Indeksin tyyppi on PUU. Se ei välttämättä ole ainutlaatuinen, joten kirjoitamme Unique = false.

Sitten osoitamme, mistä osista indeksimme koostuu. Kenttä on sen kentän numero, johon sidomme indeksin, ja määrittää merkkijonotyypin. Ja niin se luotiin.

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>

Nyt voimme kutsua sitä näin:

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

säilytys

Jos käynnistämme ilmentymän uudelleen ja yritämme kutsua tietoja uudelleen, näemme, että niitä ei ole - kaikki on tyhjä. Tämä johtuu siitä, että Tarantool tekee tarkistuspisteitä ja tallentaa tiedot levylle, mutta jos lopetamme työskentelyn ennen seuraavaa tallennusta, menetämme kaikki toiminnot - koska palaamme edellisestä tarkistuspisteestä, joka oli esimerkiksi kaksi tuntia sitten.

Joka sekunnin tallentaminen ei myöskään toimi - koska 20 Gt:n jatkuva tallentaminen levylle on niin hyvä idea.

Tätä varten keksittiin ja otettiin käyttöön käsite kirjoittava loki. Sen avulla jokaisesta tietojen muutoksesta luodaan tietue pieneen eteenpäinkirjoitettavaan lokitiedostoon.

Jokainen merkintä tarkastuspisteeseen asti tallennetaan niihin. Näille tiedostoille asetamme koon - esimerkiksi 64 mb. Kun se täyttyy, tallennus alkaa siirtyä toiseen tiedostoon. Ja uudelleenkäynnistyksen jälkeen Tarantool toipuu viimeisestä tarkistuspisteestä ja siirtää sitten kaikki myöhemmät tapahtumat, kunnes se pysähtyy.

Tarantoolissa voit yhdistää supernopean tietokannan ja sovelluksen työskentelemään niiden kanssa. Näin helppoa se on

Suorittaaksesi tällaisen tallennuksen, sinun on määritettävä vaihtoehto box.cfg-asetuksissa (example.lua-tiedostossa):

wal_mode = “write”;

Datan käyttö

Nyt kirjoittamamme avulla voit käyttää Tarantulaa tietojen tallentamiseen ja se toimii erittäin nopeasti tietokantana. Ja nyt kirsikka kakun päällä - mitä sille kaikelle voi tehdä.

Hakemuksen kirjoittaminen

Esimerkiksi, kirjoitetaan tällainen hakemus Tarantulalle

Katso hakemus spoilerin alta

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

Ilmoitamme lua:ssa jonkin taulukon, joka määrittelee symbolit. Tätä taulukkoa tarvitaan satunnaisen merkkijonon luomiseen.

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

Sen jälkeen julistamme funktion - randomString ja annamme pituusarvon suluissa.

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

Sitten yhdistämme http-reitittimen ja http-palvelimen Tarantula-palvelimeemme JSON, jonka annamme asiakkaalle.

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

Sen jälkeen aloitamme kaikkien http-palvelinliitäntöjen portista 8080, joka kirjaa kaikki pyynnöt ja virheet.

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

Seuraavaksi määritetään reitti, että jos pyyntö GET-metodilla saapuu porttiin 8080 /count, niin kutsumme funktiota yhdeltä riviltä. Se palauttaa tilan - 200, 404, 403 tai mitä tahansa määrittelemme.

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

Rungossa palautamme json.encoden, määritämme siihen count ja getcount, jota kutsutaan ja näyttää tietokannassamme olevien tietueiden määrän.

Toinen menetelmä

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)

Missä jonossa reititin:route({method = 'GET', polku = '/token'}, function() kutsumme funktiota ja luomme tunnuksen.

Linja paikallinen merkki = randomString(32) on satunnainen 32 merkin merkkijono.
Linjassa paikallinen viimeinen = box.space.example:len() vedämme ulos viimeisen elementin.
Ja jonossa box.space.example:insert{ viimeinen + 1, tunnus } kirjoitamme tiedot tietokantaamme, eli yksinkertaisesti lisäämme ID:tä yhdellä. Tämä voidaan tehdä muuten, ei vain niin kömpelöllä tavalla. Tarantulassa on jaksoja tähän tapaukseen.

Kirjoitamme tokenin sinne.

Näin ollen kirjoitimme hakemuksen yhteen tiedostoon. Pääset käsiksi tietoihin heti, ja laatikkomoduuli tekee kaiken likaisen työn puolestasi.

Se kuuntelee http ja toimii tietojen kanssa, kaikki on yhdessä esiintymässä - sekä sovellus että tiedot. Siksi kaikki tapahtuu melko nopeasti.

Asennamme http-moduulin suorittamista varten:

Kuinka teemme sen, katso spoilerin alta

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

Tarvitsemme myös prometheusta toimiaksemme:

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

Aloitamme ja pääsemme moduuleihin

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 antaa meille tilan 200.
/token antaa tunnuksen ja kirjoittaa sen tietokantaan.

Testausnopeus

Suoritetaan vertailuarvo 50 000 kyselylle. Kilpailuhakemuksia tulee olemaan 500.

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

Tokenit myönnetään. Ja tallennamme jatkuvasti tietoja. 99 % pyynnöistä suoritettiin 42 millisekunnissa. Vastaavasti meillä on noin 3500 pyyntöä sekunnissa pienellä koneella, jossa on 2 ydintä ja 4 gigatavua muistia.

Voit myös valita 50000 XNUMX tokenin ja nähdä sen arvon.

Voit käyttää http:n lisäksi taustatoimintoja, jotka käsittelevät tietojasi. Lisäksi on erilaisia ​​laukaisimia. Voit esimerkiksi kutsua toimintoja päivitysten yhteydessä, tarkistaa jotain - korjata ristiriitoja.

Voit kirjoittaa komentosarjasovelluksia suoraan tietokantapalvelimeen itse, etkä ole rajoittunut mihinkään, kytkeä moduuleja ja toteuttaa mitä tahansa logiikkaa.

Sovelluspalvelin voi käyttää ulkoisia palvelimia, kerätä tietoja ja lisätä niitä tietokantaansa. Tämän tietokannan tietoja käyttävät muut sovellukset.

Tämän tekee Tarantula itse, eikä erillistä hakemusta tarvitse kirjoittaa.

lopuksi

Tämä on vasta ensimmäinen osa suuresta työstä. Toinen julkaistaan ​​pian Mail.ru Group -blogissa, ja lisäämme ehdottomasti linkin siihen tähän materiaaliin.

Jos olet kiinnostunut osallistumaan tapahtumiin, joissa luomme näitä asioita verkossa, ja kysymään kysymyksiä reaaliajassa, ota yhteyttä DevOps by REBRAIN -kanava.

Jos sinun on siirryttävä pilveen tai sinulla on kysyttävää infrastruktuuristasi, Voit vapaasti lähettää pyynnön.

PS Meillä on 2 ilmaista auditointia kuukaudessa, ehkä projektisi on yksi niistä.

Lähde: will.com

Lisää kommentti