Освоюємо Tarantool 1.6



Євген Шадрін (Sberbank Digital Ventures)
Відстежуючи новини останніх декількох років, можна помітити, що нові NoSQL-рішення, якісь релізи з'являються мало не кожні два тижні. Звичайно, багато хто з них не виживають, програють конкуренцію, пропадають, але світ NoSQL поповнюється новими рішеннями дуже часто.

На конференції є як люди, які ніколи в житті не використовували NoSQL, так і люди, які більше п'яти років використовують NoSQL у своїх проектах, компаніях. Деякі навіть беруть участь в open-source проектах. Їх небагато, але такі теж є.

Мене звати Євген. Я працюю у невеликій підрозділі Ощадбанку Digital Ventures, яка займається впровадженням інноваційних продуктів і рішень, тобто ми робимо IT-прототипи на стику нових технологій.

У цій доповіді я хочу розповісти про свій кейс використання NoSQL-рішення з боку користувача, тому на початку хотілося б коротко пройтися по теорії.

Що ж таке NoSQL?



Я використовую акронім not only SQL, тобто не тільки SQL. Це рішення, які містять у собі моделі даних, відмінні від реляційних і покликані вирішувати якісь питання, наприклад, питання простоти масштабування. Найчастіше за рахунок того, що в NoSQL-рішеннях для зберігання і роботи з даними не потрібно ставити конкретні схеми, сутності і багато конфігурацій, дуже легко і просто вирішувати питання масштабування, розгортати великі кластери з великою кількістю вузлів, додавати та видаляти ці вузли. Також NoSQL-рішення часто досить спеціалізовані, тобто кожна команда розробників не завжди намагається зробити великий універсальний проект, а намагається вирішити якусь задачу. Така спеціалізація рішень дозволяє досягти досить високих показників продуктивності в конкретних завданнях. І в таких завданнях використовувати NoSQL-рішення може бути зручно і просто.



Тут я навів найбільш популярні бази даних у порядку класифікації. Ви чули про key-value сховища Redis і Riak — вони використовують модель «ключ-значення» для зберігання даних. Документоориентированная база даних MongoDB дуже поширена і відома. Документоориентированная модель трохи більш складна, ніж модель «ключ-значення» і дозволяє зберігати досить велику ієрархічну інформацію. Далі йдуть табличні, матричні бази даних — наприклад, Apache HBase. У них можна працювати з великою кількістю розподіленої інформації. Окремо варто OrientDB — база даних, яка підтримує мультипарадигмы, але я привів її в якості прикладу баз даних, які підтримують графову модель. У графової моделі є перевага: дуже зручно простежувати зв'язки між даними, що буває непогано при роботі з проектами-аналогами соцмереж.

Як же з усього цього розмаїття вибрати те рішення, яке підходить саме вам? Я користуюся наступними принципами:



  • Не варто винаходити велосипед. Я зустрічав команди розробників, які рвалися в бій, кажучи, що зараз вони швидко напишуть своє невелике сховище, яке підходить саме їм, яке зберігає ті типи даних, які їм потрібні. Все виявляється не так просто. Ось база даних Tarantool розробляється більше чотирьох років командою професійних розробників, і постійно виникають якісь питання, які варто вирішувати, вирішувати і вирішувати. Багато NoSQL-рішення старше десяти років. Тому правильно вибирати потрібне вам рішення, виходячи з вашого конкретного завдання.
  • Більшість баз даних покликані вирішувати якусь проблему. Якщо ви зрозумієте, яку проблему вирішуєте, ви, швидше за все, зможете підібрати потрібне рішення.
  • Сподіваюся, пункт «спирайтеся на досвід інших» зрозумілий. У світі Інтернету не так складно залізти, погуглити, почитати книжки, зрештою, нахабно взяти і написати розробникам і сказати: «У мене є такий кейс. Скажіть, будь ласка, як ви порадите його вирішити?». Багато розробники дуже чуйні і допомагають.
  • Якщо вам пощастило і для вашої задачі існує кілька рішень, то не варто дуже довго заглиблюватися в порівняння продуктивності, побудова тестових стендів, розуміння того, що ж краще — А чи Б. Виберіть те, що знаєте. Заощаджуйте час на вивчення, на розбирання продукту. Якщо знаєте ви — добре, якщо знає ваш колега — теж непогано, завжди можна до нього звернутися.
І короткий перелік тих кейсів, які вирішує NoSQL.



З більшістю з них я стикався особисто.

  • «Кешування даних — всім відома база даних Memcached. Сюди можна додати зберігання проміжних даних, тобто це ті дані, які ми хочемо отримати доступ швидко, зараз, в потрібний момент.
  • «Робота з великими обсягами даних», напевно, не зовсім коректно звучить, тому що реляційні бази даних теж працюють з великими, величезними потоками даних… Я мав на увазі саме слово «потоки», тобто, наприклад, нам ллються звідкись запити серверів, і ми хочемо їх швидко зберегти, а потім розбиратися, що з ними робити далі. Цю задачу, наприклад, непогано вирішує HBase в рамках продукту Hadoop.
  • Сервіси черг. NoSQL може виступати як частина сервісу черг. Приміром, зв'язка RabbitMQ і Redis пару разів зустрічалася на моїй практиці — простий і зручний бекенд у вигляді NoSQL.
  • Окремо я виніс платформи для статистичної обробки даних. Це коли ми отримуємо дані і не хочемо зберігати їх все: у нас немає пам'яті, у нас обмежені ресурси. Ми можемо ці дані відразу ж обробляти. Наприклад, отримуємо якісь ознаки користувачів, непотрібні ознаки можемо викидати, інші нормалізувалася і просто зберігати їх у вигляді векторів «ключ-значення», приміром, Redis.
  • Ще можна використовувати NoSQL в якості невеликого зручного бекенду для зберігання, тобто просто взяли і зберегли. MongoDB — достатньо швидко і зручно развертываемая база даних, яка підходить для цього кейса.
Кейсів, звичайно, набагато більше, але я розповів про тих, з якими стикався. Взагалі, в Sberbank Digital Ventures я займаюся розробкою систем, які працюють в режимі реального часу і основне призначення яких — отримати інформацію з сервера, зберегти її, обробити, зрозуміти, що вона з себе представляє, і видати сервера потрібну відповідь.

Наприклад, я отримую потрібну інформацію про користувача, який ходить десь у надрах Інтернету. Я отримую всі дані, які зміг зібрати, аналізую їх і можу сегментувати користувача, віднести його до тієї чи іншої категорії, тобто дізнатися, що, скажімо, це молодий чоловік 25 років, який цікавиться автомобілями, або це молода дівчина 18 років, яка хоче вступити в університет і шукає, де візьмуть хабар за вступ.



Для вирішення свого завдання я використовую NoSQL базу даних Tarantool. Надалі я розповім, чому і для чого її використовую і як вона допомагає вирішувати завдання, які переді мною виникають.

На слайді — цитата з головної сторінки сайту розробників, це їх позиціонування проекту. «A NoSQL database running in a Lua application server», тобто самі розробники позиціонують Tarantool як проект, який складається з двох частин: 1-а частина — це нереляционная база даних, 2-а частина — це Lua application server, тобто сервер додатків з використанням мови Lua.

До речі, зверніть увагу, що більшість сучасних значків NoSQL баз даних використовують сірий та червоний кольори. Напевно, це в тренді =)

Далі я буду приводити вам приклади коду. Якщо у когось є можливість, можете пройти по посиланню try.tarantool.org — це інтерактивний сервіс, де одразу можна використовувати Tarantool, тобто це якийсь інтерактивний Tarantool, який виділяється під вас на серверах розробників. Можливо, хтось захоче приклади коду відразу туди вбити.

Що ж виділяє Tarantool з великого стека NoSQL-технологій?



Tarantool зберігає всі свої дані в пам'яті, завдяки чому ми отримуємо до них швидкий доступ. Те, що Tarantool зберігає їх у пам'яті, не означає, що це небезпечно і дані ми можемо втратити. У Tarantool є механізми збереження даних: логи журналів і бінарні знімки станів. Ці два механізми працюють разом: у нас є точки з збереженими даними і опису дій, які робилися до або після з цими даними. Маючи таку інформацію, ми завжди можемо прийти в потрібний стан.

У свій час зберігання даних в пам'яті призводило до того, що ця пам'ять дуже швидко закінчувалася. Вона закінчується і зараз, але все-таки обсяги оперативної пам'яті постійно ростуть, і схожі бази даних отримують більш широкий спектр застосування. Tarantool використовує документоориентированную модель даних, тобто всі дані він зберігає в якійсь абстракції, званої документ. Документ має свої поля, з якими Tarantool і працює.

Одна з особливостей Tarantool як бази даних — це наявність вторинних індексів. Наявність вторинних індексів дозволяє зробити дії з даними більш живими, цікавими і швидкими.

Я поки не використовував транзакції в своїх проектах, але Tarantool підтримує повноцінні транзакції. Наскільки я знаю, у деяких компаніях   Mail.Ru Group, Avito — успішно використовують їх для вирішення своїх кейсів. У Tarantool є модель легковагих потоків, або green threads. Це багатопотокова модель, тільки потоки створюються не на рівні Unix, а всередині самого додатка, що дозволяє реалізовувати якісь асинхронні речі, подієві моделі.

Також Tarantool працює з мережею і файлами: у нього є свій HTTP-сервер, свої бібліотеки, які зберігають і відкривають файли; це теж знадобилося мені при вирішенні завдань.

Tarantool — це Lua application server, а Lua — це вбудована мова Tarantool. Тут я навів приклад дуже штучного, абсолютно не використовується на практиці скрипта для того, щоб показати, що таке Lua:

#!/usr/bin/tarantool
-- This is lua script

function hw(a, b)
print (a.hello..b.world)
end

b = {}
a = { hello = 'Hello' }

b['world'] = 'world!'

hw(a, b)

Мову Lua був розроблений в Бразилії, в католицькому університеті; він походить від мови SOL, який працює саме з даними і був заточений " під роботу з базами даних. Тут ми можемо бачити, що це не просто скрипт, а виконуваний скрипт. Решіточка і знак оклику — це механізм, який дозволяє нам встановити, хто і як повинен запускати цей скрипт. Ввівши в консолі
tarantool script.lua
, ми отримаємо на екрані
hello world
. Тут ми бачимо функцію, яка працює з двома об'єктами, і нижче ініціалізуємо самі ці об'єкти.

Основна структура даних Lua — це таблиці. Об'єкти
a
та
b
— це таблиці, і я спеціально ініціалізував їх по-різному, щоб показати, що мову Lua дуже гнучкий і синтаксично приємний. Ці таблиці можуть містити усередині себе інші дані — наприклад, такі ж таблиці, які, в свою чергу, можуть містити в собі інші таблиці. Іноді через недосвідченість складалися дуже великі вкладеності. Функції теж можуть зберігатися всередині таблиці. Взагалі, з об'єктом «функції» теж можна працювати як з таблицею для цього є свої методи.

Далі я наведу приклад більш практичного скрипта, який можна допрацьовувати і використати в якомусь вашому продакшне. Він вирішує маленьку задачку, і вирішує досить тривіально: вважає кількість унікальних відвідувачів на сторінці.

#!/usr/bin/tarantool
-- Tarantool init script

local log = require('log')
local console = require('console')
local server = require('http.server')

local HOST = 'localhost'
local PORT = 8008

box.cfg {
log_level = 5,
slab_alloc_arena = 1,
}
console.listen('127.0.0.1:33013')

if not box.space.users then
s = box.schema.space.create('users')
s:create_index('primary',
{type = 'tree', parts = {1, 'NUM'}})
end

function handler(self)
local id = self:cookie('tarantool_id')
local ip = self.peer.host
local data = "
log.info('Users id = %s', id)
if not id then
data = 'Welcome to tarantool server!'
box.space.користувачі:auto_increment({ip})
id = box.space.користувачі:len()
return self:render({ text = data}):
setcookie({ name = 'tarantool_id', value = id, expires = '+1y' })
else
local count = box.space.користувачі:len()
data = 'You id is' .. id .. '. We have '.. count .. 'users'
return self:render({ text = data })
end
end

httpd = server.new(HOST, PORT)
httpd:route({ path = '/' }, handler)
httpd:start()

Це так званий виконуваний Lua-скрипт, який буде запускатися в Tarantool і виконувати ту послідовність дій, яка в ньому закладена.

Коротко пройдемо по блокам того, що тут є, а потім розберемо деталі.

Вгорі я підключаю ті пакети, які мені знадобляться, через луашный механізм require: log, console, server. Визначаю якісь константи, які використовую.

Далі йде конфігурування бази даних Tarantool з допомогою модуля
box.cfg
, де я ставлю два необхідних мені параметра. Я запускаю консоль і створюю сутності нашої бази даних за допомогою
box.schema.space.create('users')
— тобто я створив простір users. Про все це розповім трохи пізніше.

Друга частина скрипта — це робота з сервером Tarantool: я описую функцію
handler
(обробник запитів), а внизу створюю сервер, створюю
route
для обробки і стартую цей сервер.

З боку користувача результат виконання цього скрипта виглядає приблизно так:



Користувач зайшов, наприклад, на localhost і побачив вітальне повідомлення. Надалі, якщо він буде оновлювати сторінку, у нього вже буде посилання на
cookie
, йому буде надано якийсь
id
, і він буде знати кількість унікальних користувачів, яке заходить на цю сторінку.

Цей невеликий скрипт вирішує якусь потрібну мені завдання — це відповідь на питання, чому ми використовуємо мову Lua.

Мову Lua досить простий. Існують цілі набори статей «Lua за 15 хвилин», «за 30 хвилин»… Вам дійсно потрібно небагато, щоб познайомитися з цим цікавою мовою. За пару годин ви дізнаєтеся всі його особливості.

Дуже зручно, що основна структура даних — це таблиці. Це дозволяє одноманітно працювати з усіма іншими даними.

Сам по собі стандартний інтерпретатор Lua не дуже швидкий, вірніше — зовсім нешвидкий, але існує аналогічний інтерпретатор LuaJIT, який робить JIT-компіляції, і він набагато швидше. Саме він робить Lua дуже продуктивним мовою.

Є така бібліотечка luafun, яка дозволяє програмувати на Lua у функціональному стилі. Завдяки LuaJIT ця бібліотека працює дуже швидко. Ви можете погуглити, почитати про неї, подивитися відгуки про її продуктивності — дуже цікаво.

Також Lua — дуже добре вбудовується мову, у нього чудова інтеграція з мовою С. Завдяки тому, що сишные процедури можна запустити всередині Lua, а Lua можна запустити всередині мови, Lua дуже широко застосовується в геймдеве. Досить багато розширень, квестів і різної ігрової механіки і логіки у відомій грі World of Warcraft написано і досі пишеться на Lua.

Tarantool — це повноцінний Lua-інтерпретатор, тобто якщо ви просто запустіть Tarantool, ви можете банально працювати з Lua.



Tarantool можна запустити в дві сутності:

  • Перша — як інтерпретатор, тобто запустити Tarantool і порядково виконувати якісь команди. Це буває корисно, якщо ви чогось не знаєте або хочете виконати якусь команду документації.
  • Друга — з допомогою стартового скрипта
    init.lua
    (називати його можна як завгодно), у якому записана послідовність команд.
Розберемо більш докладно наведений вище приклад стартового скрипту init.lua.



Починається робота з базою з її конфігурування, тобто механізм
box.cfg
— це пакет
box
, який всередині себе містить табличку
cfg
, і я можу ставити якісь її параметри. Box — це ящик, коробка. Цей пакет безпосередньо відповідає за базу даних. Ви можете просто так запустити Tarantool, виконати процедури, функції, написати якісь повідомлення і т. д., але без конфігурування
box.cfg
базу даних ви не запустите. В даному випадку я поставив два параметри, які мені хотілося б бачити. По-перше, я задав рівень логів, які будуть друкуватися — це п'ятий рівень, DEBUG. Ще я поставив дуже важливий параметр
slab_alloc_arena
— це та пам'ять, яка виділяється в Tarantool — точніше, в оперативній пам'яті — під аллоцирование і розміщення даних. В даному випадку «1» — це 1 Гб.

Також пакет box містить багато інших допоміжних речей та засобів, таких як:
  • box.info
      бібліотечка, яка виводить загальну інформацію про Tarantool.
  • box.slab
      важлива табличка, з допомогою якої ми моніторимо дані нашого Tarantool і дивимося, скільки у нас залишилося місця.
  • box.stat
      бібліотечка статистики, показує кількість
    insert
    ,
    select
    та інших операцій, які ви зробили.


Якщо в інтерпретаторі Tarantool після завдання параметрів набрати
box.cfg
, то ви отримаєте об'єкт з описом всіх параметрів, які є, — не тільки тих, які поставив я, але і тих, які задаються за умовчанням.

Тут ми бачимо, що я задав
slab_alloc_arena
  простір для алокації в 1 Гб, бачимо
log_level
п'ятого рівня (DEBUG), також бачимо важливий параметр
snapshot_count
— це кількість знімків стану, яке Tarantool буде зберігати. В даному випадку він буде зберігати останні 6 знімків, які робилися за певний період. До речі, цей період теж тут задається за допомогою параметра
snapshot_period
; типове його значення — 3600 секунд, тобто Tarantool буде робити знімок стану раз в годину. Ви самі можете вибирати необхідний рівень безпеки, можна робити знімок хоч кожну секунду чи хвилину, але це буде дуже сильно забирати ваші ресурси. Параметри
snap_dir
та
wal_dir
визначають, де ви зберігаєте свої знімки стану і логи, відповідно.



Ось приклад пакету
box.info
. Тут можна подивитися інформацію про Tarantool, тобто якщо Tarantool запущений як демон, ви можете дізнатися його pid, версію (на даний момент актуальна версія 1.6.5), час безперервної роботи та статус, в якому перебуває ваша машинка.

Після того, як ви вас є відповідні дані, можна переходити до створення самих сутностей, самих даних всередині Tarantool.



Тут я навів картинку з документації. Це зображення моделі даних Tarantool, тобто в Tarantool дані зберігаються в спейсах, в кожному спейс є сутність tuple — це записи і індекси, які ви задаєте, первинні або вторинні.

Покінчивши з конфігуруванням, переходимо до заповнення баз даних, тобто мені потрібно простір, в якому я буду задавати інформацію про користувачів.



Ви можете помітити, що я помістив цю інформацію в умовну конструкцію. Зроблено це з певною метою: якщо з якоїсь причини ваш Tarantool був зупинений і ви запускаєте його заново при збережених знімках і икслогах, він, перш ніж запуститися, відновлює свій стан, тобто бере знімок стану і проробляє дію з xlog. Якщо ви запустили так, він не дасть вам створити потрібний простір users, але воно швидше всього вам і не треба, тому дуже часто вставляємо таку перевірку для того, щоб не отримати помилку. Якщо у нас такого простору не створено, то ми створюємо спейс та індекс до нього. В даному випадку це
primary
  первинний індекс у вигляді дерев, який представляє собою одне число.

Надалі в скрипті мені необхідно додавати нові записи про користувачів. Можна це робити за допомогою стандартної операції
insert
, де ми передаємо пару ключ-значення, але в моєму випадку в цьому простому скрипті зручно це зробити за допомогою
auto_increment
. Користувач буде заходити, і йому автоматично буде присвоюватися ключ на одиницю більше, ніж кількість записів в базі на даний момент. Якщо я хочу дізнатися кількість записів на своїй базі, я можу скористатися стандартним механізмом
len()
. Як бачите, синтаксис досить простий і зрозумілий.



Як вже говорилося вище, Tarantool — це не просто база даних, а повноцінний Lua application server. Ймовірно, розробники тут мали на увазі те, що мовою Lua ви можете писати будь-які модулі та пакети і тим самим реалізовувати необхідну вам логіку. По суті, ви не изобретаете великий велосипед — ви можете винайти кілька маленьких, якщо вам дуже потрібно або цього немає в інших рішеннях.

Подивитися все це ви можете в репозиторіях на GitHub. Основні модулі, які так чи інакше використовуються, — це http і queue. Наприклад, try.tarantool.org написаний повністю на Tarantool, там використовується Tarantool-сховище, Tarantool-сервер. Також Tarantool підтримує LuaRocks, пакетний менеджер, який працює зі своїм репозиторієм і через який дуже зручно встановлювати пакети. Це робиться однією командою.



Пакети. Пакети потрібно підключити.

Під пакетом мається на увазі якийсь інший Lua-скрипт, що реалізує якусь логіку. Підключивши цей пакет, ви можете отримати методи з цього файлу, якісь дані з цього файлу, якісь змінні. На цьому прикладі я підключаю з допомогою луашного механізму
require
два пакета  
console
та
log
.

console
я запускаю на localhost і вішаю на порт 33013. За допомогою пакету
log
я можу робити записи в журнал логів. Під консоллю тут мається на увазі консоль адміністратора або віддалена консоль управління, яка дозволяє вам стежити за станом Tarantool. Зробити це нескладно: якщо у вас запущена консоль, підійдуть стандартні засоби Unix або ще які-небудь, наприклад, telnet і rlwrap. telnet потрібен для підключення на порт та його прослуховування, a rlwrap для зручного введення команд і збереження історії команд.

Ви можете зайти на той Tarantool, який у вас працює, і подивитися якусь інформацію з
box.info
або
box.stat
.



Пакет, який я використовую і який досить часто необхідний, — http. Це поки ще обмежений HTTP-сервер, але працює з багатьма потрібними механізмами. В даному випадку я підключив пакет, створив сервер, повісив
route
для обробки, запустив його. А потім у функції
handler
я повернув відповідь сервера у вигляді текстової інформації і встановив
cookie
користувачеві  
tarantool_id
,
value = id
. Задав час експірації, тобто час видалення; тут
cookie
зберігаються рік.



Основні механізми пакету
http
дозволяють реалізовувати мінімальну логіку, тобто тут є досить повноцінний сервер, є клієнт. Цей пакет працює з cookie і підтримує Lua як якийсь вбудований мова яких-небудь змінних всередині Template, тобто ми можемо на Lua писати маленькі процедурки всередині HTML.

#!/usr/bin/tarantool
-- Tarantool init script

local log = require('log')
local console = require('console')
local server = require('http.server')

local HOST = 'localhost'
local PORT = 8008

box.cfg {
log_level = 5,
slab_alloc_arena = 1,
}
console.listen('127.0.0.1:33013')

if not box.space.users then
s = box.schema.space.create('users')
s:create_index('primary',
{type = 'tree', parts = {1, 'NUM'}})
end

Я постарався розповісти основні моменти цього скрипта, тому вам повинно бути вже більш зрозуміло. Щоб закріпити, можна ще раз пройтися. У нас виконуваний скрипт Tarantool з коментарем. Далі у нас відбувається підключення пакетів через
require
. У нас є дві змінні  
HOST
та
PORT
. Далі відбувається конфігурування Tarantool через
box.cfg
, і я ставлю два параметри:
log_level
(рівень журналювання) і
slab_alloc_arena
(простір для аллокаций).

Я створюю консоль адміністратора, якою буду користуватися. Далі, якщо у мене немає потрібного спейсу, я створюю спейс
users
з допомогою
box.schema.space.create
і створюю до нього індекс.

function handler(self)
local id = self:cookie('tarantool_id')
local ip = self.peer.host
local data = "
log.info('Users id = %s', id)
if not id then
data = 'Welcome to tarantool server!'
box.space.користувачі:auto_increment({ip})
id = box.space.користувачі:len()
return self:render({ text = data}):
setcookie({ name = 'tarantool_id', value = id, expires = '+1y' })
else
local count = box.space.користувачі:len()
data = 'You id is' .. id .. '. We have '.. count .. 'users'
return self:render({ text = data })
end
end

httpd = server.new(HOST, PORT)
httpd:route({ path = '/' }, handler)
httpd:start()

У функції обробки я отримую
cookie
, які містяться у користувача, що зайшов на мою сторінку. Я дивлюся його IP, роблю запис в лог. Якщо
id
немає
tarantool_id
, тоді я заношу автоинкрементом інформацію про IP користувача в базу, дивлюся його
id
і повертаю вітальну інформацію
data
і присваиваю
cookie
значення
id
. В іншому випадку я вважаю кількість записів у нас в таблицях і повертаю користувачеві просто кількість унікальних відвідувачів. І в кінці, коли я описав функцію, я запускаю сам сервер і вже з ним працюю.

Це нескладний приклад, але завдяки модулям і розширення доступу мови Lua його можна дописувати, дописувати, дописувати і через якийсь час довести до такого стану, яке використовується в реальних проектах.



У Tarantool дуже багато різних пакетів. Є пакет для роботи з JSON, є пакет fiber (нижче я розповім про нього трохи детальніше), yaml, криптографічний бібліотека digest (містить основні необхідні механізми шифрування). Є свій пакет неблокирующих сокетів, і ви можете самі працювати по мережі, реалізовувати якісь протоколи. Є робота з MessagePack, є бібліотечка fio (file input/output) для роботи з файлами. І є цікавий механізм net.box, який дозволяє Tarantool працювати за бінарним протоколу — наприклад, з іншим Tarantool; виходить дуже швидко і зручно. Також реалізований net.box.sql для роботи з якою-небудь реляційної SQL бази даних.



Файберы — це так звані легкі потоки, які працюють за моделлю green threads. Основне відміну їх від стандартних потоків в тому, що вони створюються і працюють усередині Tarantool, тому створюються вони достатньо швидко і мають непогану продуктивність перемикання. Вони можуть стати в нагоді вам, якщо ви реалізуєте якусь асинхронну модель або вам потрібно, щоб був запущений якийсь демон, що виконує паралельно з основною логікою ще щось.

Основні принципи роботи з файбером: файбер потрібно створити, файбер можна поставити в режим очікування за допомогою fiber.sleep, і fiber_object — це є fiber.create, ви завжди можете його кансельнуть і завершити роботу з ним.

Дуже зручна бібліотечка fiber.time, яка подієвого циклу, вважає час, завжди може вивести нам потрібне значення.

З допомогою бібліотечки fiber написана дуже популярна бібліотека expirationd, яка може виробляти видалення з бази за якимись ознаками; зазвичай це час, тобто все, що зберігається, скажімо, місяць, може віддалятися і очищатися.

Про Tarantool можна говорити довго, ми теж не знаємо всього. Не знаю, чи знають самі розробники все про нього. Завжди можна почитати документацію на tarantool.org, останнім часом вона змінилася і стала більш читабельною.



Tarantool підтримує більшість Unix-подібних систем, у них є свій Buildbot, і ми завжди стежимо за появою нових пакетів — ми працюємо на Red Hat Enterprise Linux. Також розробники Tarantool офіційно підтримують пакет Tarantool в тому ж Debian.

І дуже важливий пункт, який мені подобається: в Tarantool можлива зв'язок з розробниками. У мене були питання, я знайшов розробників Skype. Костя Осипов, головний розробник Tarantool, читав на цій конференції невелику доповідь про черги. Розробникам, особливо початківцям, дуже важливо звернутися за порадою та дізнатися з перших вуст, як робити те чи інше. Треба бути готовим, що хлопці, які розробляють open-source програми, досить своєрідні, там вельми своєрідне ком'юніті. Можливо, ця картинка зможе сказати більше, ніж зміг би я:



Але в той же час спілкування в ком'юніті може бути дуже цікавим досвідом, який дозволить вам рости самому і робити свої проекти трохи краще.

В кінці хотів би підвести підсумки по доповіді.



У кожного NoSQL-рішення є своя сфера застосування. Найчастіше дуже складно сказати, яка база краще або гірше, яка продуктивніше. Вони дійсно часто вирішують різні завдання.

Інструмент розробки — це дуже важливо правильно підібраний інструмент дозволяє вам розробляти швидко і легко і уникнути маси проблем. Але не варто забувати, що важливіше ідея, мета; все-таки завдання кожного розробника — це вирішувати проблему, реалізовувати якісь свої ідеї і робити цей світ трішки краще.

Сподіваюся, я зміг показати вам, що Tarantool зовсім нескладний і ви теж можете спробувати використовувати його. Дякую за увагу.

Ця доповідь — розшифровка одного з кращих виступів на навчальній конференції розробників високонавантажених систем HighLoad++ Junior.

Також деякі з цих матеріалів використовуються нами в навчальному онлайн-курс по розробці високонавантажених систем HighLoad.Guide — це ланцюжок спеціально підібраних листів, статей, матеріалів, відео. Вже зараз у нашому підручнику понад 30 унікальних матеріалів. Підключайтеся!

Ну і головна новина — ми почали підготовку весняного фестивалю "Російські інтернет-технології", в який входить вісім конференцій, включаючи HighLoad++ Junior.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.