Motor de flujo de trabajo determinista construido sobre el modelo de componentes WASM
Estado del proyecto / Descargo de responsabilidad
Este es un prelanzamiento .
Este repositorio contiene código de backend para desarrollo y pruebas locales. El software no tiene garantías de compatibilidad con versiones anteriores para CLI, gRPC o esquema de base de datos.
Plataformas compatibles
Linuxx64
Principios básicos
Primero el esquema, utilizando el lenguaje WIT del modelo WASM Component como interfaz entre los flujos de trabajo y las actividades.
El deleite del desarrollador backend
Proceso único para ejecutar el ejecutor, flujos de trabajo y actividades, con trampilla de escape para actividades externas (planificadas).
Reintentos automáticos en caso de errores, tiempos de espera y ejecuciones de flujo de trabajo que continúan después de una falla del servidor.
Observabilidad (planificada): se deben preservar los parámetros y resultados junto con la jerarquía de funciones.
Componibilidad: anidar flujos de trabajo y llamar a actividades escritas en cualquier idioma compatible.
Reproducir y bifurcar flujos de trabajo existentes (planificados). Solucione los problemas y continúe.
Conceptos y características
Actividades que deben ser idempotentes (retritables), para que puedan detenerse y reintentarse en cualquier momento. Este contrato deberá ser cumplido por la propia actividad.
Las actividades WASI se ejecutan en un sandbox WASM
Capaz de contactar servidores HTTP utilizando el cliente HTTP WASI 0.2.
Capaz de leer/escribir en el sistema de archivos (planificado).
Soporte de duración máxima de ejecución, después del cual la ejecución se suspende en un tiempo de espera intermitente.
Reintentos en caso de errores: en trampas WASM (pánicos) o al devolver un resultado de error.
Reintentos en tiempos de espera con retroceso exponencial.
El resultado de la ejecución persiste.
Opción de rendimiento para mantener activa la ejecución del flujo de trabajo principal o descargar y reproducir el historial de eventos.
Flujos de trabajo deterministas
Son reproducibles: la ejecución persiste en cada cambio de estado, de modo que pueda reproducirse después de una interrupción o un error.
Ejecutando en un sandbox WASM, aislado del entorno
Reintentado automáticamente ante fallas como errores de base de datos, tiempos de espera o incluso trampas (pánicos).
Capaz de generar flujos de trabajo o actividades secundarios, ya sea bloqueando hasta que llegue el resultado o esperando el resultado de forma asincrónica.
Los flujos de trabajo se pueden reproducir con mensajes de registro agregados y otros cambios que no alteran el determinismo de la ejecución (planificada).
Los conjuntos de uniones permiten la concurrencia estructurada, ya sea bloqueando hasta que finalicen las ejecuciones secundarias o cancelando aquellas que no estaban esperadas (planificadas).
Webhooks WASI
Montado como una ruta URL, sirviendo tráfico HTTP.
Capaz de generar flujos de trabajo o actividades secundarios.
Ejecutor de robo de trabajo
Bloquear periódicamente un lote de ejecuciones actualmente pendientes, inicia/continúa su ejecución
Limpiando ejecuciones antiguas ahorcadas con cerraduras caducadas. Las ejecuciones que tengan el presupuesto serán reintentadas (planificadas).
Control de concurrencia: límite en la cantidad de trabajadores que pueden ejecutarse simultáneamente.
docker exec$CONTAINER_ID obelisk client component list
# See Usage for more details
Binario prediseñado
Descargue la última versión desde la página de versiones de GitHub.
Usando la última versión de crates.io
Descargar usando cargo-binstall
cargo binstall --locked obelisk
o construir usando carga
cargo install --locked obelisk
copos de nada
nix --extra-experimental-features nix-command --extra-experimental-features flakes run github:obeli-sk/obelisk
Uso
Generando un archivo de configuración de muestra
obelisk server generate-config
Iniciando el servidor
obelisk server run
Obteniendo la lista de funciones cargadas
obelisk client component list
Enviar una función para ejecutar (ya sea flujo de trabajo o actividad)
# Call fibonacci(10) activity from the workflow 500 times in series.
obelisk client execution submit testing:fibo-workflow/workflow.fiboa ' [10, 500] ' --follow
Hitos
Hito 1: Liberar el binario - listo
Cómo poner en marcha la aplicación obelisk como un binario de Linux
Programación de flujos de trabajo y actividades wasm, reintentos en tiempos de espera y fallas.
Persistencia usando sqlite
Lanzar flujos de trabajo/actividades secundarios simultáneamente usando conjuntos de unión
CLI básica para la configuración y programación de componentes wasm
Lanzamiento de Github, imagen de Docker, publicación en crates.io, soporte cargo-binstall
Hito 2: Permitir la interacción remota a través de CLI - listo
Mover componentes y configuración general a un archivo TOML
Extraer componentes de un registro OCI
Publicar la imagen del obelisco en Docker Hub (ubuntu, alpine)
empuje del componente del cliente obelisco
API gRPC para gestión de ejecución
Seguimiento del padre superior
Verificación de tipos de parámetros en la creación, introspección de tipos de todas las funciones en el sistema.
Configuración de registro y seguimiento, envío de eventos a un recopilador OTLP
Hito 3: Webhooks, verificación, simultaneidad estructurada, interfaz de usuario web (iniciado)
Activadores de webhook HTTP capaces de iniciar nuevas ejecuciones (flujos de trabajo y actividades), capaces de esperar el resultado antes de enviar la respuesta.
Reenviar stdout y stderr (configurable) de actividades y webhooks
Soporte para rastreo distribuido y registro de componentes recopilados por OTLP
Mapeo de cualquier resultado de ejecución (por ejemplo, trampas, tiempos de espera, variantes de error) a otros resultados de ejecución mediante -await-next
Verificación del servidor: descarga componentes, verifica la configuración TOML y relaciona las importaciones de componentes con las exportaciones.
Simultaneidad estructurada para conjuntos de unión: bloqueo del padre hasta que finalicen todas las ejecuciones secundarias
UI basada en HTML para mostrar ejecuciones, historial de eventos y relaciones
Imprima las importaciones y exportaciones de cada componente en formato WIT.
Conjuntos de unión heterogéneos, lo que permite que un conjunto de unión combine múltiples firmas de funciones y retrasos
Exponer el sistema de archivos con mapeo de directorios para actividades y webhooks.
Exponer la configuración de red para actividades, webhooks.
Keepalives para actividades, extendiendo el bloqueo hasta su finalización.
Ejemplos con C#, Go, JS, Python
Ideas futuras
CLI interactiva para gestión de ejecución
API gRPC de actividades externas
Generador de actividad OpenAPI
Generar procesos a partir de actividades WASM, leer sus resultados.
Contrapresión: los límites en las colas pendientes, o una estrategia de desalojo, disminuyen la velocidad en LimitReached
Soporte para ejecutores externos: inicio de ejecuciones basadas únicamente en exportaciones WIT. Los ejecutores externos deben compartir el acceso de escritura a la base de datos sqlite.
Etiquetas que restringen flujos de trabajo/actividades a los ejecutores
Programación periódica
Propagación de la fecha límite
Propagación de cancelación
Configuración de capacidad de cola, agregando contrapresión al envío de ejecución
Capacidad de simular el comportamiento del sistema con fallas inyectadas.
Notificar actividades. Cuando se llama, su valor de retorno debe proporcionarse a través de un punto final API.
Una API para enumerar ejecuciones con sus actividades de notificación abierta.
Función de consulta de solo lectura que se puede llamar durante un punto de espera o después de que finalice la ejecución.
stdout opcional, persistencia/reenvío stderr
Enrutamiento de dependencia inteligente desde una persona que llama a través de una importación de interfaz a uno de los muchos componentes que lo exportan.
Reintentos inteligentes: reintentar el presupuesto, deshabilitar los reintentos cuando la actividad falla en cierto porcentaje de solicitudes
Jitter configurable agregado a los reintentos
Instantáneas de la memoria del flujo de trabajo para una reproducción más rápida
Depurador que viaja en el tiempo para flujos de trabajo, que funciona en implementaciones WASM
Capacidad de corregir un conjunto de flujos de trabajo, con un sistema de aprobación cuando se detecta no determinismo.
Rastree cadenas hasta su origen en flujos de trabajo y actividades
Asignaciones de webhook: ejecutar una única función, traducir entre parámetros definidos HTTP y WIT y valor de retorno
Reenvío de contexto de seguimiento distribuido para HTTP saliente y webhooks
Permitir especificar variantes de error permanente como anotaciones en WIT
Soporte para sagas (distribuidas): defina reversiones en actividades, llámelas en flujos de trabajo fallidos
Construyendo desde la fuente
Configure las dependencias de desarrollo utilizando nix flakes:
nix develop
# or `direnv allow`, after simlinking .envrc-example -> .envrc
O descargue manualmente todas las dependencias, consulte dev-deps.txt y Dockerfile de verificación basado en Ubuntu. Ejecute el programa.
cargo run --release
Ejecución de pruebas
./scripts/test.sh
Pruebas deterministas utilizando el simulador madsim
./scripts/test-madsim.sh
Contribuyendo
Este proyecto tiene una hoja de ruta y las funciones se agregan y prueban en un orden determinado. Si desea contribuir con una función, analice la función en GitHub. Para que podamos aceptar parches y otras contribuciones, debe adoptar nuestro Acuerdo de licencia de colaborador (el "CLA"). La versión actual del CLA se puede encontrar aquí.