Внутриигровой сервис с обработкой 7,5 млн транзакций в минуту в режиме реального времени

Для нас, технарей, нет ничего более захватывающего, чем работать над передовыми решениями, использовать новые продукты и решать проблемы, для которых нет рецепта на StackOverflow. Недавно мы столкнулись с одной из таких проблем и обнаружили одну из таких технологий для ее решения.

Мы разработали новый высокопроизводительный сервис обработки валютных транзакций на основе Tarantool, высокопроизводительной платформы данных. Она выступила в качестве SSOT(single source of truth, единый источник достоверных данных) для поддержки нового функционала.

Почему мы вообще рассматривали Tarantool?

Нам нужно было создать внутриигровую систему валютных транзакций, которая смогла бы обеспечить получение койнов в режиме реального времени для 150 тысяч пользователей . Пользователи должны иметь возможность воспользоваться койнами сразу после получения. Для нас «в режиме реального времени» означает за ~300 мс. Для всех наших пользователей, для всех 150 тысяч пользователей одновременно.

Одно из возможных решений — взять Redis. А именно использовать его в качестве кэша со сквозной записью для базы данных NoSQL. Но такой подход быстро начинает буксовать. Приходится поддерживать когерентность, регулировать состояние гонки, бороться с аннулированием элементов кэша, откачкой, истечением срока действия и т.д.

Долговечность — Redis ориентирован на обработку транзакций в оперативной памяти с возможностью регулярного создания снимков. А в Tarantool есть полнофункциональный журнал упреждающей записи (WAL) и снимки, управлением которыми нам не приходится заниматься, в отличие от работы с Redis.

Атомарность — Нет простого способа выполнять атомарные операции в Redis и резервной базе данных NoSQL. Это означает, что в этом решении нет SSOT(единого источника достоверных данных).

Есть и множество других проблем.

Звучит просто, правда? Всего несколько сотен тысяч транзакций базы данных в секунду.

Что? Не согласны?

Как Tarantool решил нашу проблему

Tarantool — это полномасштабная платформа данных NoSQL со встроенным сервером приложений Lua, транзакциями, хранимыми процедурами, и поддержкой постоянного хранения данных.

В Tarantool есть два движка базы данных: memtx(in-memory движок) и vinyl(дисковый движок). Любой из них обеспечивает надежность транзакций в соответствии с требованиями ACID.

Чтобы обеспечить согласованность при отказе, в memtx используются журнал упреждающей записи (WAL) и снимки.

В memtx может быть любое количество вторичных индексов.

Он поддерживает серверные сценарии на Lua для пакетных операций, что само по себе представляет собой отличную функцию.

В Tarantool операции CRUD действительно быстрые

Это достигается путем использования файберов в одном потоке для выполнения транзакций.

Что это значит?

В базе данных несколько потоков не могут работать одновременно. Файбер — это легковесный поток. Поток обработки транзакций будет выполнять все команды в файбере до передачи управления, а затем перейдет к следующему файберу. Предполагается, что файберы работают в среде кооперативной многозадачности, чтобы предотвратить зависание процесса. Кроме того, все задачи ввода-вывода (дисковые, сетевые и т.д.) вызывают неявную передачу управления. В большинстве случаев разработчикам не нужно беспокоиться о передаче управления файберами.

И какая же у него скорость?

Нашей целью были 5 секунд на 500 тысяч транзакций.

С memtx'ом мы справились за 3,6 секунды! 500 тысяч транзакций за 3,6 секунды!

Не забывайте, что все транзакции полностью соответствуют требованиям ACID.

И это еще не всё. Для нас транзакция состоит из одной операции записи и одной операции обновления.

Tarantool использовался лишь в порядке эксперимента. Мы помнили о рисках. Мы преуспели и получили хорошие результаты тестов. А теперь мы его внедрили в эксплуатацию!

Преимущества:

  1. Очень быстрый.
  2. Пользовательские Lua-функции на стороне сервера (можно снизить вызовы сети для пакетных операций).
  3. Однопоточный (только один поток процессора транзакций в Tarantool).
  4. In-memory база данных (memtx).
  5. Администрирование сервера (утилита tarantoolctl).
  6. Шардинг (vshard) и репликация базы данных.
  7. Движок базы данных vinyl может быть хорошей заменой баз данных NoSQL.
  8. Группа поддержки Tarantool в Telegram (сами разработчики Tarantool'а отвечают в этой группе).

Недостатки:

  1. Инфраструктура. При использовании версии для сообщества Community Edition приходится самостоятельно контролировать экземпляры, шардинг, регулярное резервное копирование снимков.
  2. Не слишком большое сообщество. При любых запросах приходится полагаться на группу в Telegram.
  3. Не предлагается облачными платформами, такими как AWS или Azure(старая версия присутствует на рынке AWS.) Поэтому приходится создавать собственные системы мониторинга для экземпляров Tarantool.

В версии Tarantool для предприятий есть функции, которые устраняют некоторые из перечисленных здесь недостатков. Но она не бесплатная.

Стоит ли пробовать пользоваться Tarantool?

Это вопрос на миллион долларов. В некоторых случаях буквально.

Задайте себе эти вопросы:

  1. Вам действительно нужна быстродействующая база данных? Будет ли это критическим требованием для пользователя?
  2. Для вашего сценария не хватает окончательной согласованности (eventual consistency)?
  3. Вы уже планируете использовать слой Redis/кэша перед другой базой данных?
  4. Готовы ли вы управлять всеми требованиями инфраструктуры, которые обычно поддерживаются облачными платформами?

Если вы ответили "да" на любой из этих вопросов, тогда да! Выбирайте Tarantool прямо сейчас. Можете попробовать в работе с небольшим микро-сервисом, а затем добиться колоссальных успехов!

Лично мы действительно любим Tarantool. Три месяца в производственной среде, нет никаких серьезных проблем!