rockspec_format = '3.0' package = 'tnt-event' version = 'scm-1' source = { url = 'git+https://github.com/tnt-skein/tnt-event.git', branch = 'main', } description = { summary = 'Шина событий внутри узла Tarantool: слушатели на файберах, итог обработчика, отправка после фиксации', detailed = [[ События на файберах одного узла, без спейсов, брокеров и сети: event.listen объявляет слушателя, event.dispatch рассылает событие и отдаёт его опознаватель. У каждого слушателя своя очередь в памяти и свои работники, поэтому медленный слушатель не держит быстрого, а отправитель не ждёт ни одного из них. Подтверждение — то, что вернул обработчик: значение подтверждает, nil, err возвращает событие с отсрочкой retry_after или растущим отступом, последняя попытка и err.retriable == false зарывают его в список зарытых. Событие несёт конверт с ULID отправителя и заголовками контекста, и обработчик идёт в контексте того, кто отправил. Ключ порядка выбирает полосу работника: события одного ключа идут по одному и по порядку при любом числе работников. В транзакции box событие уходит после фиксации и пропадает при откате. Очередь слушателя ограничена, и полная отказывает сразу отказом overflow, а не ждёт места: dispatch зовут и из box.on_commit, где ждать нельзя. Крюки отправки и обработки дают трассу и замеры, не делая пакет зависимым от них. Гарантия — не больше раза: всё, что в памяти, пропадает с процессом. Шина видна в выкладке метрик рядами договора очереди с именем события меткой destination: разослано, отказы overflow, итог обработки, сбои работника, ожидание первой выдачи и глубина — сколько ждёт в полосах, в обработке, в отсрочке и в зарытых. Зависит от tnt-message (конверт, проверка настроек и тела, приговор обработчику, область обработчика, крюки и ряды метрик — общие для очередей договора), tnt-must (проверки аргументов), tnt-clock (время зарытого), tnt-log (журнал), tnt-storage (отказ overflow) и tnt-external (подмена транзакции в проверках). Покрытие строк и убитых мутантов — 100 %. ]], homepage = 'https://github.com/tnt-skein/tnt-event', issues_url = 'https://github.com/tnt-skein/tnt-event/issues', maintainer = 'tnt-skein', license = 'MIT', labels = { 'tarantool', 'events', 'event-bus', 'pubsub', 'messaging', 'fibers' }, } dependencies = { 'lua >= 5.1', -- Общая часть договора очереди: конверт, настройки отправки и тело, -- приговор обработчику, его область, крюки и ряды метрик. 'tnt-message', -- Проверки имени события, обработчика и потолка очереди слушателя -- на строке вызывающего. 'tnt-must', -- Стенное время зарытого. 'tnt-clock', -- Записи о зарытом, пропавшем событии и шаге работника. 'tnt-log', -- Подмена транзакции вызывающего в проверках. 'tnt-external', -- Отказ overflow переполненной очереди слушателя. 'tnt-storage', } build = { type = 'builtin', modules = { ['tnt.event'] = 'tnt/event.lua', ['tnt.event.listener'] = 'tnt/event/listener.lua', }, }