Mecanismo de fluxo de trabalho determinístico construído sobre o modelo de componentes WASM
Status do projeto/Isenção de responsabilidade
Este é um pré-lançamento .
Este repositório contém código de back-end para desenvolvimento e teste local. O software não possui garantias de compatibilidade com versões anteriores para CLI, gRPC ou esquema de banco de dados.
Plataformas suportadas
Linux x64
Princípios fundamentais
Esquema primeiro, usando a linguagem WIT do modelo de componente WASM como interface entre fluxos de trabalho e atividades.
A alegria do desenvolvedor backend
Processo único para execução do executor, fluxos de trabalho e atividades, com saída de emergência para atividades externas (planejadas).
Novas tentativas automáticas em caso de erros, tempos limite e execuções de fluxo de trabalho que continuam após uma falha do servidor.
Observabilidade (planejada) – parâmetros e resultados juntamente com hierarquia de funções devem ser preservados.
Composição - aninhamento de fluxos de trabalho, chamada de atividades escritas em qualquer linguagem suportada
Reproduza e bifurque fluxos de trabalho existentes (planejados). Corrija os problemas e continue.
Conceitos e recursos
Atividades que devem ser idempotentes (retritáveis), para que possam ser interrompidas e repetidas a qualquer momento. Este contrato deve ser cumprido pela própria atividade.
As atividades WASI são executadas em uma sandbox WASM
Capaz de entrar em contato com servidores HTTP usando o cliente HTTP WASI 0.2.
Capaz de ler/gravar no sistema de arquivos (planejado).
Suporte à duração máxima de execução, após o qual a execução é suspensa em tempo limite intermitente.
Novas tentativas em caso de erros - em armadilhas WASM (pânico) ou ao retornar um resultado de Erro.
Novas tentativas em tempos limite com espera exponencial.
O resultado da execução é persistido.
Opção de desempenho para manter a execução do fluxo de trabalho pai ativa ou descarregar e reproduzir o histórico de eventos.
Fluxos de trabalho determinísticos
São reproduzíveis: a execução persiste a cada mudança de estado, para que possa ser reproduzida após uma interrupção ou erro.
Executando em uma sandbox WASM, isolada do ambiente
Novas tentativas automáticas em caso de falhas, como erros de banco de dados, tempos limite ou até mesmo armadilhas (pânico).
Capaz de gerar fluxos de trabalho ou atividades filho, bloqueando até que o resultado chegue ou aguardando o resultado de forma assíncrona.
Os fluxos de trabalho podem ser reproduzidos com mensagens de log adicionadas e outras alterações que não alterem o determinismo da execução (planejada).
Os conjuntos de junção permitem a simultaneidade estruturada, bloqueando até que as execuções dos filhos sejam concluídas ou cancelando aquelas que não foram aguardadas (planejadas).
Webhooks WASI
Montado como um caminho de URL, atendendo ao tráfego HTTP.
Capaz de gerar fluxos de trabalho ou atividades infantis.
Executor de roubo de trabalho
Bloquear periodicamente um lote de execuções atualmente pendentes, inicia/continua sua execução
Limpando antigas execuções suspensas com bloqueios expirados. As execuções que possuem orçamento serão repetidas (planejadas).
Controle de simultaneidade - limite no número de trabalhadores que podem ser executados simultaneamente.
docker exec$CONTAINER_ID obelisk client component list
# See Usage for more details
Binário pré-construído
Baixe a versão mais recente na página de lançamento do GitHub.
Usando a versão mais recente de crates.io
Baixe usando cargo-binstall
cargo binstall --locked obelisk
ou construir usando carga
cargo install --locked obelisk
Flocos Nix
nix --extra-experimental-features nix-command --extra-experimental-features flakes run github:obeli-sk/obelisk
Uso
Gerando um arquivo de configuração de amostra
obelisk server generate-config
Iniciando o servidor
obelisk server run
Obtendo a lista de funções carregadas
obelisk client component list
Enviando uma função para execução (fluxo de trabalho ou atividade)
# Call fibonacci(10) activity from the workflow 500 times in series.
obelisk client execution submit testing:fibo-workflow/workflow.fiboa ' [10, 500] ' --follow
Conquistas
Marco 1: Liberar o binário - concluído
Colocando o aplicativo obelisk em funcionamento como um binário Linux
Agendamento de fluxos de trabalho e atividades wasm, novas tentativas em tempos limite e falhas
Persistência usando sqlite
Lançar fluxos de trabalho/atividades filhos simultaneamente usando conjuntos de junção
CLI básica para configuração e agendamento de componentes wasm
Lançamento do Github, imagem docker, publicação em crates.io, suporte para cargo-binstall
Marco 2: Permitir interação remota via CLI - concluído
Mova o componente e a configuração geral para um arquivo TOML
Extrair componentes de um registro OCI
Publique a imagem do obelisco no Docker Hub (ubuntu, alpine)
push do componente cliente obelisco
API gRPC para gerenciamento de execução
Rastreie o pai mais alto
Typecheck de parâmetros na criação, introspecção de tipos de todas as funções do sistema
Configuração de registro e rastreamento, envio de eventos para um coletor OTLP
Marco 3: Webhooks, verificação, simultaneidade estruturada, UI da Web - iniciado
Gatilhos de webhook HTTP capazes de iniciar novas execuções (fluxos de trabalho e atividades), capazes de aguardar o resultado antes de enviar a resposta.
Encaminhar stdout e stderr (configurável) de atividades e webhooks
Suporte para rastreamento distribuído e registro de componentes coletados pelo OTLP
Mapeamento de qualquer resultado de execução (por exemplo, armadilhas, tempos limite, variantes err) para outros resultados de execução via -await-next
Verificação do servidor - baixa componentes, verifica a configuração TOML e combina importações de componentes com exportações.
Simultaneidade estruturada para conjuntos de junção - bloqueando o pai até que todas as execuções filho sejam concluídas
UI baseada em HTML para mostrar execuções, histórico de eventos e relações
Imprima as importações e exportações de cada componente no formato WIT
Conjuntos de junção heterogêneos, permitindo que um conjunto de junção combine múltiplas assinaturas de função e atrasos
Expor o sistema de arquivos com mapeamento de diretório para atividades, webhooks
Expor a configuração de rede para atividades, webhooks
Keepalives para atividades, estendendo o bloqueio até a conclusão
Exemplos com C#, Go, JS, Python
Ideias futuras
CLI interativo para gerenciamento de execução
API gRPC de atividades externas
Gerador de atividade OpenAPI
Gerando processos de atividades WASM, lendo seus resultados
Contrapressão: Limites em filas pendentes, ou uma estratégia de despejo, desaceleram no LimitReached
Suporte a executores externos - iniciando execuções exclusivamente com base em exportações WIT. Os executores externos devem compartilhar o acesso de gravação ao banco de dados sqlite.
Rótulos que restringem fluxos de trabalho/atividades aos executores
Agendamento periódico
Propagação de prazo
Propagação de cancelamento
Configuração de capacidade de fila, adicionando contrapressão ao envio de execução
Capacidade de simular o comportamento do sistema com falhas injetadas
Notificar atividades. Quando chamado, o valor de retorno deve ser fornecido por meio de um endpoint de API.
Uma API para listar execuções com suas atividades de notificação aberta.
Função de consulta somente leitura que pode ser chamada durante um ponto de espera ou após o término da execução.
Roteamento de dependência inteligente de um chamador por meio de uma importação de interface para um dos muitos componentes que o exportam.
Tentativas inteligentes - Orçamento de novas tentativas, desativando novas tentativas quando a atividade falha em determinada porcentagem de solicitações
Jitter configurável adicionado às novas tentativas
Instantâneos de memória de fluxo de trabalho para reprodução mais rápida
Depurador de viagem no tempo para fluxos de trabalho, que funciona em implantações WASM
Capacidade de corrigir um conjunto de fluxos de trabalho, com um sistema de aprovação quando for detectado não determinismo
Rastreie strings até sua origem em fluxos de trabalho e atividades
Mapeamentos de webhook: executando uma única função, traduzindo entre parâmetros definidos HTTP e WIT e valor de retorno
Encaminhamento de contexto de rastreamento distribuído para HTTP de saída, bem como webhooks
Permitir especificar variantes de erro permanentes como anotações no WIT
Suporte para sagas (distribuídas) - defina reversões em atividades, chame-as em fluxos de trabalho com falha
Construindo a partir da fonte
Configure as dependências de desenvolvimento usando nix flakes:
nix develop
# or `direnv allow`, after simlinking .envrc-example -> .envrc
Ou baixe manualmente todas as dependências, consulte dev-deps.txt e verificação baseada em Ubuntu Dockerfile Execute o programa
cargo run --release
Executando testes
./scripts/test.sh
Testes determinísticos utilizando o simulador madsim
./scripts/test-madsim.sh
Contribuindo
Este projeto possui um roteiro e os recursos são adicionados e testados em uma determinada ordem. Se você gostaria de contribuir com um recurso, discuta o recurso no GitHub. Para que possamos aceitar patches e outras contribuições, você precisa adotar nosso Contrato de Licença de Colaborador (o "CLA"). A versão atual do CLA pode ser encontrada aqui.