Skip to content

Latest commit

 

History

History
138 lines (87 loc) · 6.06 KB

README.rus.md

File metadata and controls

138 lines (87 loc) · 6.06 KB

Введение

Данный набор скриптов предназначен для серверной поддержки системы доставки сообщений клиентам о происходящих событиях. В качестве транспорта возможно использовать механизмы long polling или websocket.

Сервер, поддерживающий данные протоколы не входит в данный репозитарий. Здесь только часть связанная с хранением/доставкой данных.

Масштабирование

Несмотря на то, что тарантул поддерживает асинхронную мастер-мастер, однако делать push можно только в один инстанс. Subscribe можно делать на любом инстансе. Таким образом при увеличении нагрузки нужно просто добавлять инстансы-реплики которые будут обслуживать клиентов, которые принимают сообщения, а все генерируемые сообщения отправлять на выделенный инстанс.

Работа

Для работы с данным лонгпулингом требуется

  1. драйвер к тарантулу, поддерживающий асинхронный доступ (множество запросов по одному коннекту). Например DR::Tnt
  2. асинхронный вебсервер. Например Twiggy или Coro::Twiggy
  3. Tarantool версии 1.6 и больше
  4. данный набор lua

Использование LUA

    lp = require 'lp'
    lp:init{ ... }


    lp:push(key, value)
    lp:push_list(key1, value1, key2, value2, ...)

    ...

    local events = lp:subscribe(12345, 25, key1, key2, ...)

Установка

Для установки необходимы файлы из директории lua/

Инициализация

    lp = require 'lp'
    lp:init{ option = value }

Опции инициализации:

  • expire_timeout = 1800 - Максимальное время жизни события в БД
  • serialize_key_method = 'none' - Способ сериализации ключа
  • lsn_check_interval = 1 - Интервал проверки на наличие новых событий (данная опция актуальна только для реплик)
  • run_expired = true - Запускать или нет на данном инстансе процесс удаления устаревших записей

Хранение сообщений в базе данных

Каждое сообщение хранится в виде тапла:

  1. id - идентификатор сообщения (присваивается push)
  2. created - время когда создано сообщение (используется процессом expiration)
  3. key - ключ сообщения
  4. data - данные связанные с сообщением (в обычном случае - сериализованный (например JSON) объект).

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

Доступные механизмы сериализации:

  • none (по умолчанию) - не сериализовать ключ
  • msgpack - сериализовать при помощи msgpack
  • json - сериализовать при помощи json
  • colon - сериализовать в строку при помощи конкатенации через двоеточие

API

Добавление сообщения

Есть два метода, позволяющие добавить одно или несколько сообщений:

    lp:push(key, value)
    lp:push_list(key1, value1, key2, value2, ...)

Второй метод просто перевызывает первый в цикле.

Подписка на сообщения

    local list = lp:subscribe(id, timeout, key1, key2, ...)

Подписывается на получение сообщений с ключами key1, key2, итп. Подписка осуществляется на интервал времени timeout.

В качестве id необходимо передать стартовый id с которого необходимо получать сообщения. id=0 означает: "ожидать все сообщения, начиная от текущего времени".

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

Таким образом алгоритм работы клиента выглядит следующим образом.

  1. начало: id=0
  2. запрос lp:subscribe(id, timeout, key1, key2, ...)
  3. обработка списка полученных сообщений (все элементы полученного списка кроме последнего)
  4. id=id из последнего элемента списка
  5. перейти к шагу 2

Для случая "лонгпулинг на сайте" пункты 1, 3, 4, 5 делаются на клиенте при помощи JavaScript. Пункт 2 делается на сервере при помощи асинхронного вебсервера (например Twiggy или Node.JS).