Перейти к содержимому

Типы записей Lua

Конфигурация Lua-записей: функций, процессов, workflows и библиотек.

ТипОписание
function.luaФункция без состояния, запускается по запросу
process.luaДолгоживущий актор с состоянием
workflow.luaУстойчивый workflow (Temporal)
library.luaРазделяемый код, импортируемый другими записями
module.luaМодульная поверхность (библиотека с несколькими методами)

Каждый тип имеет предкомпилированный аналог в виде байткода (function.lua.bc, library.lua.bc, process.lua.bc, workflow.lua.bc), который создаётся wippy pack --bytecode. Авторы пишут .lua-записи; типы байткода создаются автоматически при упаковке.

Все Lua-записи имеют эти поля:

ПолеОбязательноОписание
nameдаУникальное имя в пространстве имён
kindдаОдин из Lua-типов выше
sourceдаПуть к Lua-файлу (file://path.lua)
methodfunction/process/workflowЭкспортируемая функция (библиотеки её не используют)
modulesнетРазрешённые модули для require()
importsнетДругие записи как локальные модули
metaнетПоисковые метаданные

Функция без состояния, вызываемая по запросу. Каждый вызов независим.

- name: handler
kind: function.lua
source: file://handler.lua
method: main
modules:
- http
- json

Используйте для: HTTP-обработчиков, трансформаций данных, утилит.

Долгоживущий актор, хранящий состояние между сообщениями. Общается через передачу сообщений.

- name: worker
kind: process.lua
source: file://worker.lua
method: main
modules:
- process
- sql

Используйте для: фоновых воркеров, сервисных демонов, акторов с состоянием.

Для запуска как супервизируемого сервиса:

- name: worker_service
kind: process.service
process: app:worker
host: app:processes
lifecycle:
auto_start: true
restart:
max_attempts: 10

Устойчивый workflow, переживающий перезапуски. Состояние сохраняется в Temporal.

- name: order_processor
kind: workflow.lua
source: file://order_workflow.lua
method: main
modules:
- workflow
- time

Используйте для: многошаговых бизнес-процессов, длительных оркестраций.

Разделяемый код, импортируемый другими записями.

- name: helpers
kind: library.lua
source: file://helpers.lua
modules:
- json
- base64

Другие записи ссылаются через imports:

- name: handler
kind: function.lua
source: file://handler.lua
method: main
imports:
helpers: app.lib:helpers

В Lua-коде:

local helpers = require("helpers")
helpers.format_date(timestamp)

Поле modules контролирует, какие модули загружаются через require():

modules:
- http
- json
- sql
- process

channel, print, subscribe и unsubscribe загружаются как Lua-глобалы — их не нужно указывать в modules:.

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

  • Безопасность: запрет доступа к системным модулям
  • Явные зависимости: понятно, что нужно коду
  • Детерминизм: workflows получают только детерминированные модули

См. Lua Runtime для доступных модулей.

Импорт других записей как локальных модулей:

imports:
utils: app.lib:utils # require("utils")
auth: app.auth:helpers # require("auth")

Ключ становится именем модуля в Lua-коде. Значение — ID записи (namespace:name).

Настройка пула выполнения для функций:

- name: handler
kind: function.lua
source: file://handler.lua
method: main
pool:
type: adaptive # по умолчанию
size: 4 # начальное число воркеров
max_size: 16 # верхний предел для эластичных пулов
ПолеПулыОписание
typeвсеРеализация планировщика (см. таблицу ниже)
sizestatic, lazy, adaptiveНачальное число воркеров
workersengine v2Число рабочих потоков
bufferstatic, adaptiveРазмер очереди задач (по умолчанию workers * 64)
warm_startadaptiveПрекомпиляция записей при старте
max_sizelazy, adaptiveВерхний предел эластичного роста (по умолчанию 16)
ТипПоведение
inlineСинхронное выполнение в горутине вызывающего. Минимальная задержка, без изоляции между вызовами.
lazyНет idle-воркеров, создаются по требованию, удаляются в простое.
staticПул фиксированного размера на каналах. Предсказуем при стабильной нагрузке.
adaptiveСамомасштабирующийся пул — растёт под нагрузкой, сжимается в простое. По умолчанию.

Используйте meta для маршрутизации и обнаружения:

- name: api_handler
kind: function.lua
meta:
type: handler
version: "2.0"
tags: [api, users]
source: file://api.lua
method: handle
modules:
- http
- json

Метаданные доступны для поиска через реестр:

local registry = require("registry")
local handlers = registry.find({type = "handler"})