Триггеры
Триггеры, которые также называют обратными вызовами, представляют собой функции, которые выполняет сервер при наступлении определенных событий.
В Tarantool’е есть шесть типов триггеров:
- box.session.on_connect() (при установлении соединения) или box.session.on_disconnect() (при разрыве соединения),
- box.session.on_auth(),
- space_object:on_replace() or space_object:before_replace(),
- box.on_commit() or box.on_rollback(),
- net.box.on_connect() or net.box.on_disconnect(),
- net.box.on_schema_reload(),
- box.ctl.on_schema_init() or box.ctl.on_shutdown(),
- swim_object:on_member_event().
У всех триггеров есть следующие особенности:
- Триггеры связывают функцию с событием. Запрос «определить триггер» подразумевает передачу функции триггера в одну из функций обработки событий «on_event()»:
- box.session.on_connect() (при установлении соединения) или box.session.on_disconnect() (при разрыве соединения),
- box.session.on_auth(),
- net.box.on_connect() or net.box.on_disconnect(),
- net.box.on_schema_reload(),
- space_object:on_replace() or space_object:before_replace(),
- box.on_commit() or box.on_rollback(),
- box.ctl.on_schema_init() or box.ctl.on_shutdown(),
- swim_object:on_member_event().
- Только пользователь „admin“ определяет триггеры.
- Триггеры хранятся в памяти экземпляра Tarantool’а, а не в базе данных. Поэтому триггеры пропадают, когда экземпляр отключают. Чтобы сохранить их, поместите определения функции и настройки триггера в скрипт инициализации Tarantool’а.
- Триггеры не тратят много ресурсов. Если триггер не задан, то требуется минимум вычислений — разыменование и проверка указателя. Если триггер определен, то стоимость вызова равна стоимости вызова функции.
- There can be multiple triggers for one event. In this case, triggers are executed in the reverse order that they were defined in. (Exception: member triggers are executed in the order that they appear in the member list.)
- Триггеры должны работать в контексте события. Однако результат не определен, если функция содержит запросы, которые при нормальных условиях не могут быть выполнены непосредственно после события, а только после возврата из события. Например, если указать os.exit() или box.rollback() в триггерной функции, запросы не будут выполняться в контексте события.
- Триггеры можно заменять. Запрос на «замену триггера» подразумевает передачу новой триггерной функции и старой триггерной функции в одну из функций обработки событий «on_event()».
- Во всех функциях обработки событий «on_event()» есть параметры, которые представляют собой указатели функции, и все они возвращают указатели функции. Следует запомнить, что определение Lua-функции, например, «function f() x = x + 1 end» совпадает с «f = function () x = x + 1 end» – в обоих случаях
f
получит указатель функции. А «trigger = box.session.on_connect(f)» – это то же самое, что «trigger = box.session.on_connect(function () x = x + 1 end)» – в обоих случаяхtrigger
получит переданный указатель функции. - Если вызвать любую из «on_event()» функций без аргументов, то она вернет список соответствующих триггеров. Например,
box.session.on_connect()
вернет таблицу со всеми connect-trigger функциями. - Triggers can be useful in solving problems with replication. See details in
Resolving replication conflicts
Пример
Здесь мы записываем события подключения и отключения в журнал на сервере Tarantool’а.
log = require('log')
function on_connect_impl()
log.info("connected "..box.session.peer()..", sid "..box.session.id())
end
function on_disconnect_impl()
log.info("disconnected, sid "..box.session.id())
end
function on_auth_impl(user)
log.info("authenticated sid "..box.session.id().." as "..user)
end"
function on_connect() pcall(on_connect_impl) end
function on_disconnect() pcall(on_disconnect_impl) end
function on_auth(user) pcall(on_auth_impl, user) end
box.session.on_connect(on_connect)
box.session.on_disconnect(on_disconnect)
box.session.on_auth(on_auth)