Sa Tarantool, mahimo nimong ikombinar ang usa ka super-paspas nga database ug usa ka aplikasyon aron magtrabaho uban kanila. Ania kung unsa kadali kini buhaton

Lima ka tuig ang milabay gisulayan nako nga magtrabaho kauban ang Tarantool, apan wala kini molihok alang kanako. Apan bag-o lang nagpahigayon ako usa ka webinar diin naghisgot ako bahin sa Hadoop, kung giunsa ang pagtrabaho sa MapReduce. Didto gipangutana ako sa pangutana - "Ngano nga dili gamiton ang Tarantool alang niini nga buluhaton?".

Alang sa pagkamausisaon, nakahukom ko nga ibalik kini, sulayan ang pinakabag-o nga bersyon - ug niining higayona ganahan kaayo ko sa proyekto. Karon ipakita nako kung giunsa pagsulat ang usa ka yano nga aplikasyon sa Tarantool, i-load kini ug susiha ang pasundayag, ug imong makita kung unsa kadali ug kabugnaw ang tanan didto.

Sa Tarantool, mahimo nimong ikombinar ang usa ka super-paspas nga database ug usa ka aplikasyon aron magtrabaho uban kanila. Ania kung unsa kadali kini buhaton

Unsa ang Tarantool

Gipahimutang sa Tarantool ang kaugalingon ingon usa ka ultra-paspas nga database. Mahimo nimong ibutang ang bisan unsang datos nga gusto nimo didto. Dugang pa, kopyaha kini, shard - nga mao, pagbahin sa daghang mga datos sa daghang mga server ug isagol ang mga resulta gikan kanila - paghimo mga link nga master-master nga adunay pagtugot sa sayup.

Ikaduha, kini usa ka server sa aplikasyon. Mahimo nimong isulat ang imong mga aplikasyon niini, magtrabaho uban ang datos, pananglitan, pagtangtang sa daan nga mga entry sa background sumala sa pipila nga mga lagda. Mahimo nimong isulat ang usa ka Http server direkta sa Tarantula nga magamit sa datos: ihatag ang ilang numero, isulat ang bag-ong datos didto ug ipaubos kini tanan sa usa ka agalon.

Nabasa nako ang usa ka artikulo kung giunsa paghimo sa mga lalaki ang usa ka 300-linya nga linya sa mensahe, nga naghilak ug nag-thrash - sila adunay labing gamay nga pasundayag nga 20 nga mga mensahe matag segundo. Dinhi mahimo ka nga moliko ug magsulat sa usa ka dako kaayo nga aplikasyon, ug kini dili tipigan, sama sa PostgreS.

Gibana-bana nga ingon nga usa ka server, yano ra, sulayan nako nga ihulagway sa kini nga artikulo.

Pag-instalar

Alang sa pagsulay, gisugdan nako ang tulo ka standard nga virtual machine - usa ka 20 gigabyte nga hard drive, Ubuntu 18.04. 2 virtual CPU ug 4 gigabytes sa memorya.

Gi-install namon ang Tarantool - pagpadagan sa usa ka script sa bash o pagdugang usa ka repositoryo ug dali nga ma-install ang Tarantool. Link sa script - (curl -L https://tarantool.io/installer.sh | VER=2.4 sudo -E bash). Kita adunay mga sugo sama sa:

tarantoolctl mao ang nag-unang sugo alang sa pagdumala sa mga higayon sa Tarantula.
/etc/tarantool - dinhi nahimutang ang tibuok nga configuration.
var/log/tarantool - ania ang mga troso.
var/lib/tarantool - dinhi nahimutang ang datos, ug unya gibahin kini sa mga higayon.

Adunay mga instance-available ug instance-enable nga mga folder - kini naglangkob sa kung unsa ang ilunsad - ang instance configuration file nga adunay lua code, nga naghulagway kung asa nga mga pantalan kini paminawon, unsa nga memorya ang anaa niini, Vinyl engine settings, code nga nagtrabaho sa pagsugod mga server, sharding, pila, pagtangtang sa wala na magamit nga datos, ug uban pa.

Ang mga higayon nagtrabaho sama sa PostgreS. Pananglitan, gusto nimo nga magpadagan og daghang mga kopya sa usa ka database nga nagbitay sa lainlaing mga pantalan. Kini nahimo nga daghang mga kaso sa database ang gilunsad sa usa ka server, nga nagbitay sa lainlaing mga pantalan. Mahimo silang adunay hingpit nga lainlain nga mga setting - usa ka pananglitan nagpatuman sa usa ka lohika, ang ikaduha - lain.

Pagdumala sa Instance

Kami adunay tarantoolctl nga sugo nga nagtugot kanamo sa pagdumala sa mga higayon sa Tarantula. Pananglitan, ang tarantoolctl check example magsusi sa configuration file ug moingon nga ok ang file kung walay syntax errors.

Makita nimo ang status sa instance - tarantoolctl status example. Sa parehas nga paagi, mahimo nimo pagsugod, paghunong, pagsugod usab.

Sa higayon nga ang usa ka pananglitan nagdagan, adunay duha ka paagi sa pagkonektar niini.

1. Administrative console

Sa kasagaran, ang Tarantool nagbukas sa usa ka socket ug nagpadala sa yano nga ASCII nga teksto aron makontrol ang Tarantula. Ang koneksyon sa console kanunay mahitabo ubos sa admin user, walay panghimatuud, mao nga dili nimo kinahanglan nga kuhaon ang console port aron makontrol ang Tarantula sa gawas.

Aron makonektar niining paagiha, kinahanglan nimong isulod ang Tarantoolctl enter instance name. Ang mando maglunsad sa console ug magkonektar isip admin user. Ayaw ibutyag ang console port sa gawas - mas maayo nga ibilin kini ingon usa ka socket sa yunit. Unya kadto lamang adunay access sa pagsulat sa socket ang makakonektar sa Tarantula.

Kini nga pamaagi gikinahanglan alang sa administratibo nga mga butang. Aron magtrabaho uban ang datos, gamita ang ikaduhang pamaagi - ang binary protocol.

2. Paggamit sa binary protocol aron makonektar sa usa ka piho nga pantalan

Adunay usa ka direktiba sa pagpamati sa pagsumpo, nga nagbukas sa pantalan alang sa mga eksternal nga komunikasyon. Kini nga pantalan gigamit sa binary protocol ug ang pag-authenticate gipalihok didto.

Alang niini nga koneksyon, gigamit ang tarantoolctl connect to port number. Pinaagi sa paggamit niini, mahimo ka makonektar sa hilit nga mga server, mogamit sa pag-authenticate ug maghatag lainlaing mga katungod sa pag-access.

Pagrekord sa Data ug Module sa Kahon

Tungod kay ang Tarantool usa ka database ug usa ka server sa aplikasyon, kini adunay lainlaing mga module. Interesado kami sa module sa kahon - kini nagpatuman sa trabaho uban sa datos. Kung nagsulat ka sa usa ka butang sa usa ka kahon, gisulat ni Tarantool ang data sa disk, gitipigan kini sa memorya, o adunay lain nga gibuhat niini.

Pagrekord

Pananglitan, moadto kami sa module sa kahon ug tawagan ang box.once function. Kini mopugos sa Tarantool sa pagpadagan sa atong code sa diha nga ang server gisugdan. Naghimo kami og usa ka luna diin ang among datos itago.

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

Pagkahuman niana, maghimo kami usa ka panguna nga indeks - panguna - diin kami makapangita sa datos. Sa kasagaran, kung walay mga parameter ang gitakda, ang unang field sa matag entry alang sa primer index gamiton.

Dayon naghimo kami og grant sa bisita nga tiggamit, diin kami nagkonektar pinaagi sa binary protocol. Gitugotan namon ang pagbasa, pagsulat ug pagpatuman sa tibuuk nga higayon.

Kung itandi sa naandan nga mga database, ang tanan yano ra dinhi. Kita adunay luna - usa ka dapit diin ang atong data gitipigan lamang. Ang matag entry gitawag nga tuple. Giputos kini sa usa ka MessagePack. Kini usa ka cool kaayo nga pormat - kini binary ug gamay ra ang espasyo - 18 bytes kumpara sa 27.

Sa Tarantool, mahimo nimong ikombinar ang usa ka super-paspas nga database ug usa ka aplikasyon aron magtrabaho uban kanila. Ania kung unsa kadali kini buhaton

Kombenyente nga magtrabaho uban kaniya. Hapit matag linya, matag data entry mahimong adunay hingpit nga lainlain nga mga kolum.

Atong malantaw ang tanang luna gamit ang Box.space command. Para makapili ug espisipikong instance, among isulat ang box.space nga pananglitan ug kuhaa ang tibuok impormasyon bahin niini.

Adunay duha ka matang sa mga makina nga gitukod sa Tarantool: Memory ug Vinyl. Gitipigan sa memorya ang tanan nga datos sa memorya. Busa, ang tanan molihok nga yano ug dali. Ang datos gilabay sa disk, ug adunay usa usab ka mekanismo sa pagsulat sa unahan nga log, mao nga dili kami mawad-an bisan unsa kung ang server nahagsa.

Ang vinyl nagtipig sa datos sa disk sa mas pamilyar nga porma - nga mao, mahimo nimong tipigan ang mas daghang datos kay sa atong memorya, ug basahon kini ni Tarantula gikan sa disk.

Karon atong gamiton ang Memorya.

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:

Ang usa ka nag-unang index kinahanglan nga himoon alang sa bisan unsa nga luna, tungod kay walay bisan unsa nga molihok kon wala kini. Sama sa bisan unsang database, gihimo namon ang una nga uma - ang record ID.

Mga bahin:

Dinhi among gitino kung unsa ang gilangkuban sa among indeks. Kini naglangkob sa usa ka bahin - ang unang field nga atong gamiton, type unsigned - usa ka positibo nga integer. Sa akong nahinumduman gikan sa dokumentasyon, ang maximum nga gidaghanon nga mahimo mao ang 18 quintillion. Daghan kaayo.

Mahimo namong isulod ang datos gamit ang insert command.

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>

Ang unang field gigamit isip nag-unang yawe, busa kinahanglan nga talagsaon kini. Wala kami gilimitahan sa gidaghanon sa mga kolum, aron makasulod kami sa daghang datos nga gusto namon didto. Gipiho sila sa format sa MessagePack, nga akong gihulagway sa ibabaw.

Output sa datos

Dayon mahimo natong ipakita ang datos gamit ang pinili nga sugo.

Box.example.select gamit ang yawe {1} magpakita sa gusto nga entry. Kon atong laktawan ang yawe, atong makita ang tanang mga rekord nga anaa kanato. Tanan sila lahi sa gidaghanon sa mga kolum, apan dinhi, sa prinsipyo, wala’y konsepto sa mga kolum - adunay mga numero sa uma.

Mahimong adunay hingpit nga daghang datos nga gusto nimo. Ug pananglitan, kinahanglan naton pangitaon sila sa ikaduha nga uma. Aron mahimo kini, maghimo kami usa ka bag-ong sekondaryang indeks.


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

Gigamit namo ang Create_index nga sugo.
Gitawag namo ni nga Secondary.

Human niana, kinahanglan nimo nga itakda ang mga parameter. Ang tipo sa indeks kay TREE. Mahimong dili kini talagsaon, mao nga mosulod kami sa Unique = bakak.

Dayon among gipakita kung unsa nga mga bahin ang gilangkoban sa among indeks. Ang field mao ang gidaghanon sa field diin atong gibugkos ang index, ug gipiho ang klase sa string. Ug mao nga kini gibuhat.

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>

Karon kini mao ang paagi nga atong matawag kini:

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

Pagpreserba

Kung atong i-restart ang pananglitan ug sulayan nga tawagan pag-usab ang datos, atong makita nga wala sila didto - ang tanan walay sulod. Nahitabo kini tungod kay ang Tarantool naghimo og mga checkpoint ug nagtipig sa datos sa disk, apan kung mohunong kami sa pagtrabaho sa wala pa ang sunod nga pagluwas, mawala ang tanan nga mga operasyon - tungod kay mabawi kami gikan sa katapusang checkpoint, nga, pananglitan, duha ka oras ang milabay.

Ang pagtipig matag segundo dili usab molihok - tungod kay ang kanunay nga paglabay sa 20 GB sa disk usa ka kaayo nga ideya.

Alang niini, ang konsepto sa write-ahead log naimbento ug gipatuman. Uban sa tabang niini, alang sa matag pagbag-o sa datos, usa ka rekord ang gihimo sa usa ka gamay nga write-ahead log file.

Ang matag entry hangtod sa checkpoint gitipigan diha kanila. Alang sa kini nga mga file, among gitakda ang gidak-on - pananglitan, 64 mb. Kung napuno na, ang pagrekord magsugod sa pag-adto sa ikaduha nga file. Ug pagkahuman sa pag-restart, ang Tarantool nabawi gikan sa katapusan nga checkpoint ug dayon giligid ang tanan nga ulahi nga mga transaksyon hangtod nga kini mohunong.

Sa Tarantool, mahimo nimong ikombinar ang usa ka super-paspas nga database ug usa ka aplikasyon aron magtrabaho uban kanila. Ania kung unsa kadali kini buhaton

Aron mahimo ang ingon nga pagrekord, kinahanglan nimo nga magbutang usa ka kapilian sa mga setting sa box.cfg (sa example.lua file):

wal_mode = “write”;

paggamit sa datos

Uban sa among gisulat karon, mahimo nimong gamiton ang Tarantula sa pagtipig sa datos ug kini molihok nga paspas kaayo ingon usa ka database. Ug karon ang cherry sa cake - unsa ang imong mahimo sa tanan.

Pagsulat og aplikasyon

Pananglitan, isulat nato ang ingon nga aplikasyon alang sa Tarantula

Tan-awa ang aplikasyon sa ilawom sa 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()

Gipahayag namo ang pipila ka lamesa sa lua nga naghubit sa mga simbolo. Kini nga lamesa gikinahanglan aron makamugna og random string.

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

Pagkahuman niana, gipahayag namon ang usa ka function - randomString ug gihatag ang kantidad sa gitas-on sa mga bracket.

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

Dayon among ikonektar ang http router ug http server sa among Tarantula server, JSON, nga among ihatag sa kliyente.

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

Pagkahuman niana, magsugod kami sa port 8080 sa tanan nga mga interface sa http server, nga mag-log sa tanan nga mga hangyo ug mga sayup.

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

Sunod, gipahayag namon ang usa ka ruta nga kung ang usa ka hangyo nga adunay pamaagi sa GET moabut sa port 8080 / ihap, unya gitawag namon ang function gikan sa usa ka linya. Nagbalik kini og status - 200, 404, 403 o bisan unsa nga among gitino.

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

Sa lawas, gibalik namo ang json.encode, among gipiho ang count ug getcount niini, nga gitawag ug nagpakita sa gidaghanon sa mga rekord sa among database.

Ang ikaduha nga pamaagi

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)

Diin sa linya router:route({pamaagi = 'GET', path = '/ token'}, function() gitawag namo ang function ug makamugna og token.

Linya lokal nga timaan = randomString(32) usa ka random string nga 32 ka karakter.
Sa linya lokal nga katapusan = box.space.example:len() gikuha namo ang katapusang elemento.
Ug sa linya box.space.example:insert{ last + 1, token } gisulat namo ang datos sa among database, nga mao, gidugangan lang namo ang ID sa 1. Mahimo kini, sa paagi, dili lamang sa ingon nga clumsy nga paagi. Ang Tarantula adunay mga han-ay alang niini nga kaso.

Gisulat namo ang token didto.

Sa ingon, nagsulat kami usa ka aplikasyon sa usa ka file. Mahimo nimong ma-access dayon ang datos, ug ang module sa kahon ang mobuhat sa tanan nga hugaw nga trabaho alang kanimo.

Kini naminaw sa http ug nagtrabaho uban sa data, ang tanan anaa sa usa ka higayon - ang aplikasyon ug ang data. Busa, ang tanan mahitabo sa madali.

Aron makadagan, among i-install ang http module:

Giunsa naton kini buhaton, tan-awa sa ilawom sa 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:/#

Kinahanglan usab namon ang prometheus nga modagan:

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

Nagsugod kami ug maka-access sa mga module

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 naghatag kanato og status 200.
Ang /token nag-isyu og token ug gisulat kini nga token sa database.

Katulin sa pagsulay

Maghimo kita og benchmark alang sa 50 ka mga pangutana. Ang mga hangyo sa kompetisyon mahimong 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:/#

Gihatag ang mga token. Ug kami kanunay nga nagrekord sa datos. 99% sa mga hangyo nahuman sa 42 milliseconds. Tungod niini, kami adunay mga 3500 nga hangyo matag segundo sa usa ka gamay nga makina, diin adunay 2 nga mga cores ug 4 gigabytes nga memorya.

Makapili ka usab ug mga 50000 nga token ug makita ang kantidad niini.

Mahimo nimong gamiton dili lamang ang http, pagpadagan sa mga function sa background nga nagproseso sa imong datos. Dugang pa, adunay lainlaing mga hinungdan. Pananglitan, mahimo nimong tawagan ang mga function sa mga update, susihon ang usa ka butang - ayohon ang mga panagbangi.

Mahimo nimong isulat ang mga aplikasyon sa script direkta sa database server mismo, ug dili limitado sa bisan unsang butang, ikonektar ang bisan unsang mga module ug ipatuman ang bisan unsang lohika.

Ang application server maka-access sa mga external server, makakolekta og data ug makadugang niini sa database niini. Ang datos gikan niini nga database gamiton sa ubang mga aplikasyon.

Buhaton kini sa Tarantula mismo, ug dili kinahanglan nga magsulat usa ka bulag nga aplikasyon.

Sa konklusyon

Kini mao lamang ang unang bahin sa usa ka dako nga trabaho. Ang ikaduha imantala sa dili madugay sa Mail.ru Group blog, ug siguradong magdugang kami og link niini niini nga materyal.

Kung interesado ka sa pagtambong sa mga panghitabo diin among gibuhat kini nga mga butang online ug pagpangutana sa tinuud nga oras, sumpay sa DevOps pinaagi sa REBRAIN channel.

Kung kinahanglan nimo nga mobalhin sa panganod o adunay mga pangutana bahin sa imong imprastraktura, Mobati nga gawasnon sa pagsumite sa usa ka hangyo.

PS Adunay kami 2 nga libre nga pag-audit matag bulan, tingali ang imong proyekto usa na niini.

Source: www.habr.com

Idugang sa usa ka comment