Tareas programadas dentro de tu servidor — schedules, webhooks y jobs sin otro servicio
cron_every toma un intervalo o una expresión cron de cinco campos y corre una tarea en su propio hilo, al lado de tus rutas. Sin crontab, sin flota de workers, sin broker de mensajes — y con una compuerta humana cuando un job la necesita.
Un producto chico suele necesitar tres procesos antes de necesitar tres funcionalidades: la API, un worker para los jobs y algo que los programe. En Synsema el planificador es un builtin y los jobs son tareas, así que los tres viven en el archivo que ya estás sirviendo.
Una programación es una línea§
require serve(8080)
require net("api.warehouse.com")
task sync_inventory()
let r be http_get("https://api.warehouse.com/stock")
share json_decode(body of r) as "inventory"
task daily_report()
log "report sent"
cron_every(300, sync_inventory) -- every 5 minutes
cron_every("30 8 * * mon-fri", daily_report, {"tz": "-03:00"}) -- weekdays 08:30, fixed offset
cron_every("@hourly", sync_inventory)
serve on 8080
route "GET /inventory"
observe "inventory" as stock
give stock
Un número es un intervalo medido desde el final de una corrida hasta el comienzo de la siguiente; un texto es una expresión cron (, rangos, /n, jan..dec, mon..fri, @daily y compañía), alineada al minuto. Cada job corre en su propio hilo, estacionado entre tick y tick; las corridas nunca se superponen; cron_list() y cron_cancel(name) los administran en tiempo de ejecución.
Un job que necesita a una persona§
Algunos jobs no deberían terminar solos: la limpieza nocturna que borraría mucho, la corrida de pagos por encima de cierto monto. Bajo serve, approve encola la compuerta y el pedido espera a un humano:
task nightly_cleanup()
let n be count_stale()
when n > 1000 and not (approve "Delete " + text(n) + " stale rows?" within 30m)
give nothing
delete_stale()
La consola imprime la aprobación pendiente con un token de un solo uso; con SYNSEMA_HUMAN_WEBHOOK configurado, cada compuerta además avisa en tu canal con enlaces de sí/no listos para tocar. Si nadie responde a tiempo, deniega. Un agente no puede falsificar la respuesta.
Qué reemplaza esto§
Un demonio de cron, una cola, un proceso worker y el pegamento entre ellos, para el caso común de "corré esto cada N y avisame". Y cuando de verdad necesitás una cola, el mismo archivo habla Redis y Postgres de forma nativa.
Empezá acá: instalá Synsema, pegá el primer fragmento y corré synsema serve app.syn. La referencia del planificador está en la documentación; Lampson usa exactamente esto para sus tareas programadas — mirá lampson.org.