Обновлена 15 сентября 2026 г. в 08:55
Триггеры
Триггеры, которые также называют обратными вызовами — это функции, которые выполняет сервер при наступлении определенных событий.
Чтобы связать событие с функцией обратного вызова, передайте её в соответствующую функцию обработки событий on_{event}:
- box.session.on_connect() или box.session.on_disconnect();
- box.session.on_auth();
- space_object:on_replace() или space_object:before_replace();
- box.on_commit() или box.on_rollback();
- net.box.on_connect() или net.box.on_disconnect();
- net.box.on_schema_reload();
- box.ctl.on_schema_init() или box.ctl.on_shutdown();
- swim_object:on_member_event();
- box.session.on_access_denied().
Тогда сервер сохранит функцию обратного вызова и будет выполнять ее при наступлении соответствующего события.
У всех триггеров есть следующие особенности:
- Триггеры определяются только пользователем
admin. - Триггеры хранятся в памяти экземпляра Tarantool, а не в базе данных. Поэтому триггеры исчезают при остановке экземпляра. Чтобы сделать их постоянными, поместите определения функций и настройки триггеров в скрипт запуска Tarantool.
- Накладные расходы на триггеры невелики. Если триггер не определен, они минимальны: лишь разыменование указателя и проверка. Если триггер определен, они эквивалентны накладным расходам на вызов функции.
- Для одного события может быть назначено несколько триггеров. В этом случае триггеры выполняются в порядке, обратном порядку их определения.
- Триггеры должны работать в контексте события, то есть использовать переменные, переданные как аргументы функции триггера. Триггеры не должны влиять на глобальное состояние программы или изменять объекты, не связанные с событием. Если триггер вызывает такие функции, как, например, 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(), чтобы получить таблицу всех функций-триггеров подключения. - Триггеры могут быть полезны при решении проблем с репликацией. Подробнее см. в разделе Решение конфликтов репликации.
Пример:
Здесь мы записываем события подключения и отключения в журнал сервера Tarantool.
log = require('log')function on_connect_impl()log.info("connected "..box.session.peer()..", sid "..box.session.id())endfunction on_disconnect_impl()log.info("disconnected, sid "..box.session.id())endfunction on_auth_impl(user)log.info("authenticated sid "..box.session.id().." as "..user)endfunction on_connect() pcall(on_connect_impl) endfunction on_disconnect() pcall(on_disconnect_impl) endfunction on_auth(user) pcall(on_auth_impl, user) endbox.session.on_connect(on_connect)box.session.on_disconnect(on_disconnect)box.session.on_auth(on_auth)