Запуск приложения
Используя Tarantool в качестве сервера приложений, можно писать собственные приложения. Родной язык для написания приложений в Tarantool — Lua, поэтому типичное приложение представляет собой файл со скриптом на Lua. Также приложения можно писать на C или C++.
Создадим и запустим первое приложение на Lua для Tarantool. Вот простейшее приложение на Lua — классическое «Hello, world!»:
#!/usr/bin/env tarantoolprint('Hello, world!')
Сохраним его в файл. Пусть это будет myapp.lua в текущем каталоге.
Теперь рассмотрим способы запуска приложения с помощью Tarantool.
Если Tarantool запускается в контейнере Docker, следующая команда запустит Tarantool без приложения:
$ # create a temporary container and run it in interactive mode$ docker run --rm -t -i tarantool/tarantool:latest
Чтобы запустить Tarantool с приложением, выполним:
$ # create a temporary container and$ # launch Tarantool with our application$ docker run --rm -t -i \-v `pwd`/myapp.lua:/opt/tarantool/myapp.lua \-v /data/dir/on/host:/var/lib/tarantool \tarantool/tarantool:latest tarantool /opt/tarantool/myapp.lua
В этом примере в контейнер монтируются два ресурса с хоста:
- файл приложения (
myapp.lua) и - каталог данных Tarantool (
/data/dir/on/host).
По умолчанию каталог для кода приложения Tarantool внутри контейнера — /opt/tarantool, а
каталог для данных — /var/lib/tarantool.
Если Tarantool установлен из пакета или собран из исходного кода, приложение можно запустить:
- в режиме скрипта,
- как серверное приложение, или
- как службу-демон.
Простейший способ — передать имя файла при запуске Tarantool:
$ tarantool myapp.luaHello, world!$
Tarantool запускается, выполняет скрипт в режиме скрипта и завершает работу.
Теперь превратим этот скрипт в серверное приложение. Воспользуемся функцией box.cfg из встроенного модуля Lua Tarantool, чтобы:
- запустить базу данных (база данных имеет постоянное состояние на диске, которое необходимо восстановить при запуске приложения) и
- настроить Tarantool в качестве сервера, принимающего запросы на TCP-порте.
Также добавим простую логику работы с базой данных, используя space.create() и create_index() для создания спейса с первичным индексом. Воспользуемся функцией box.once(), чтобы гарантировать выполнение логики только один раз — при первой инициализации базы данных. Это позволит избежать попыток создания уже существующего спейса или индекса при каждом запуске скрипта:
#!/usr/bin/env tarantool-- Configure databasebox.cfg {listen = 3301}box.once("bootstrap", function()box.schema.space.create('tweedledum')box.space.tweedledum:create_index('primary',{ type = 'TREE', parts = {1, 'unsigned'}})end)
Запустим приложение так же, как и раньше:
$ tarantool myapp.luaHello, world!2017-08-11 16:07:14.250 [41436] main/101/myapp.lua C> version 2.1.0-429-g4e52317022017-08-11 16:07:14.250 [41436] main/101/myapp.lua C> log level 52017-08-11 16:07:14.251 [41436] main/101/myapp.lua I> mapping 1073741824 bytes for tuple arena...2017-08-11 16:07:14.255 [41436] main/101/myapp.lua I> recovery start2017-08-11 16:07:14.255 [41436] main/101/myapp.lua I> recovering from `./00000000000000000000.snap'2017-08-11 16:07:14.271 [41436] main/101/myapp.lua I> recover from `./00000000000000000000.xlog'2017-08-11 16:07:14.271 [41436] main/101/myapp.lua I> done `./00000000000000000000.xlog'2017-08-11 16:07:14.272 [41436] main/102/hot_standby I> recover from `./00000000000000000000.xlog'2017-08-11 16:07:14.274 [41436] iproto/102/iproto I> binary: started2017-08-11 16:07:14.275 [41436] iproto/102/iproto I> binary: bound to [::]:33012017-08-11 16:07:14.275 [41436] main/101/myapp.lua I> done `./00000000000000000000.xlog'2017-08-11 16:07:14.278 [41436] main/101/myapp.lua I> ready to accept requests
В этот раз Tarantool выполняет скрипт и продолжает работать как сервер, принимая TCP-запросы на порту 3301. Tarantool можно увидеть в списке процессов текущей сессии:
$ ps | grep "tarantool"PID TTY TIME CMD41608 ttys001 0:00.47 tarantool myapp.lua <running>
Но экземпляр Tarantool остановится, если закрыть текущее окно терминала.
Чтобы отвязать Tarantool и приложение от окна терминала, можно запустить
их в режиме демона. Для этого добавим несколько параметров в box.cfg{}:
- background =
true— указывает, что Tarantool должен работать как служба-демон, - log =
'dir-name'— указывает демону Tarantool, где хранить файл журнала (другие настройки журнала доступны в модуле, и - pid_file =
'file-name'— указывает демону Tarantool, где хранить pid-файл.
Например:
box.cfg {listen = 3301,background = true,log = '1.log',pid_file = '1.pid'}
Запустим приложение так же, как и раньше:
$ tarantool myapp.luaHello, world!$
Tarantool выполняет скрипт, отсоединяется от текущей сессии оболочки
(его не будет видно по команде ps | grep "tarantool") и продолжает
работать в фоновом режиме как демон, привязанный к глобальной сессии (с
SID = 0):
$ ps -ef | grep "tarantool"PID SID TIME CMD42178 0 0:00.72 tarantool myapp.lua <running>
Теперь, когда мы разобрались с созданием и запуском приложения на Lua для Tarantool, перейдем к более детальному рассмотрению практики программирования.