Pular para o conteúdo principal
O Flowker chama serviços externos (como motores de fraude, processadores de pagamento e provedores de KYC) por configurações de provedor. Uma configuração de provedor é a sua conexão com uma instância viva de um serviço externo. Neste guia, você explora o catálogo, cria uma configuração de provedor e a referencia a partir de um nó de workflow. Depois você mapeia campos entre os seus dados e o serviço, e aprende como o Flowker repete e protege essas chamadas.

Passo 1: Explore o catálogo


O catálogo é o registro dos provedores, executores de catálogo e gatilhos que vêm com o Flowker.
1

Liste os provedores disponíveis

Chame o endpoint Listar provedores do catálogo para ver os tipos de serviço a que o Flowker se conecta. O catálogo sempre inclui o conector HTTP genérico. Provedores nativos como ledger (Midaz) e tracer são sintetizados a partir de especificações OpenAPI publicadas e aparecem apenas quando o registro nativo de esquemas está configurado e a síntese tem sucesso.
2

Liste os executores de catálogo disponíveis

Chame o endpoint Listar executores do catálogo para ver as operações que um nó de workflow pode invocar. Use Listar executores por provedor para estreitar a lista a um provedor.
3

Liste os gatilhos disponíveis

Chame o endpoint Listar gatilhos do catálogo para ver os tipos de gatilho nativos: webhooks e agendamentos. A API de executar workflow começa um workflow, mas não é um gatilho de catálogo.
4

Escolha o que você precisa

Anote o providerId e o id do executor de catálogo que combinam com a sua integração. Você usa o primeiro no Passo 2 e o segundo no Passo 3.
O catálogo mostra o que o Flowker pode chamar. As configurações de provedor guardam a URL base, as credenciais e as configurações de cada instância de serviço que você usa.

Passo 2: Crie uma configuração de provedor


Chame POST /v1/provider-configurations para definir a sua conexão com uma instância de um serviço externo.
Um providerId é um identificador de catálogo, e nem sempre combina com o nome do produto. O catálogo registra o Midaz como ledger. Pegue sempre o valor em Listar provedores do catálogo em vez de adivinhá-lo pelo nome do produto.
O providerId na configuração e o executorId no nó que a usa devem pertencer ao mesmo provedor de catálogo. O conector HTTP genérico usa http nos dois. O Flowker rejeita um workflow que junta uma configuração de um provedor com um executor de outro, com FLK-0151.
O exemplo abaixo monta a conexão que este guia usa daqui em diante: um serviço de pontuação de fraude alcançado pelo conector HTTP genérico.
A resposta devolve o id da nova configuração. Guarde-o. O Passo 3 e o Passo 4 o colocam no providerConfigId do nó que chama o serviço.

Autenticação

O bloco config.auth guarda a autenticação que o serviço externo exige, como um par { type, config }. Use o método que o seu serviço espera. Uma leitura nunca retorna a credencial que o tipo de autenticação declara. Guarde credenciais apenas nos campos que o tipo de autenticação declara. Para rotacionar um secret, envie o novo valor em uma atualização. Para manter o atual, omita o campo ou envie-o em branco. Isso funciona enquanto auth.type continua o mesmo. Uma atualização que muda auth.type deve carregar um valor para cada secret que o novo tipo exige e o anterior não exigia. Caso contrário o Flowker a rejeita com FLK-0952. Uma mudança entre dois tipos que usam o mesmo secret, como oidc_user para oidc_client_credentials, não precisa desse valor de novo.
Para integrações OAuth 2.0, use oidc_client_credentials. O Flowker cuida da obtenção e da renovação de token automaticamente.

Como habilitar e desabilitar

Configurações de provedor têm dois status: active (em uso) e disabled (temporariamente fora). Uma nova configuração de provedor começa no status active. Use Desabilitar configuração de provedor para tirar uma conexão de serviço e Habilitar configuração de provedor para trazê-la de volta. Veja a API de configurações de provedor para a referência completa.

Passo 3: Referencie a configuração de provedor a partir de um nó de workflow


Cada nó executor carrega um providerConfigId, o identificador da configuração de provedor pela qual ele chama. O Flowker rejeita um workflow cujo nó executor não tem providerConfigId, e rejeita um valor que não é um UUID. Em tempo de execução, ele monta cada requisição de saída com a URL base daquela configuração de provedor mais o caminho no nó. O nó falha se a configuração de provedor não estiver active. Estes são os campos que um nó executor define no seu objeto data quando chama pelo conector HTTP genérico: Um nó que chama uma operação de um documento OpenAPI que você subiu a nomeia com operation_path e operation_method em vez de um executorId. O Flowker preenche o executorId para você a partir da configuração de provedor para a qual o nó aponta. Como conectar sua própria API percorre esse caminho inteiro.

Valide a configuração de um nó antes de salvar

Chame o endpoint Validar a configuração de um nó (POST /v1/catalog/executors/{id}/validate) para conferir a configuração de um nó contra o JSON Schema do executor de catálogo. Isso faz apenas a validação de JSON Schema. Confere se o seu objeto de configuração combina com a estrutura que o executor de catálogo espera (campos obrigatórios, tipos, formatos). Não chama o serviço externo, então a primeira ida e volta real acontece quando um workflow roda o nó. Passe mappedTargets para nomear os campos que o seu nó fornece por um inputMapping em vez de um valor fixo. Esses campos contam como satisfeitos, então um nó que mapeia um campo obrigatório vindo do gatilho valida antes de você salvá-lo.

Mapeamento de campos e transformação de dados


Use mapeamentos de campo e transformações quando os dados do workflow não combinam com o formato que um serviço externo espera. Use-os também quando um serviço devolve dados em um formato que a próxima etapa não consome. Você define os mapeamentos de campo e as transformações dentro do objeto data dos nós executores. O Flowker aplica os mapeamentos de entrada antes de chamar o serviço externo, e os mapeamentos de saída depois de receber a resposta. Um target de entrada é um caminho no corpo da requisição de saída, escrito exatamente como o serviço externo espera. Não há objeto envolvente nem prefixo a acrescentar. Um source de saída é um caminho dentro do envelope da resposta, então os campos da resposta ficam sob body.
Os nós seguintes leem a saída mapeada sob o ID deste nó: ${executor-balance.balance}.
Para integrações complexas, você também pode anexar transformações a entradas individuais de mapeamento (por exemplo, remover caracteres, adicionar prefixos, mudar a caixa). Você pode definir operações Kazaam para transformações avançadas de JSON para JSON. Trabalhar com dados de requisição e de resposta percorre o caminho inteiro. Cobre como declarar os mapeamentos, escolher o que monta o corpo da requisição e remodelar valores em trânsito. Cobre também como ler a resposta de volta e conferir a requisição montada antes de chamar o serviço.

Passo 4: Rode o workflow


Referencie a configuração de provedor em um nó de workflow do tipo executor. O exemplo abaixo cria um workflow de validação de pagamento em cima da conexão FraudShield do Passo 2. Quando um pagamento chega, o Flowker chama o serviço de checagem de fraude, avalia a pontuação de risco e aprova ou rejeita o pagamento conforme o resultado. O workflow tem cinco nós. Um gatilho de webhook recebe o pagamento, e um nó executor chama o serviço de checagem de fraude. Um nó condicional avalia a pontuação, e há dois nós de ação para os resultados de aprovar e rejeitar. Arestas os conectam em sequência, com o nó condicional ramificando para um caminho ou outro conforme o limiar da pontuação. Use o endpoint Criar workflow para definir o workflow, depois Ative e por fim Execute.
O nó check-fraud nomeia http, o conector HTTP genérico do catálogo. Ele também nomeia a configuração FraudShield do Passo 2, que guarda a URL base e as credenciais. Os dois lados nomeiam o mesmo provedor, então o workflow salva. O Flowker envia a requisição para https://api.fraudshield.example.com/score-transaction.O nó não declara outputMapping, então a saída dele mantém o formato do envelope da resposta. A pontuação fica então em check-fraud.body.score, que é o que a condição evaluate-score lê. Adicione um outputMapping quando você preferir um nome mais raso. Veja Mapeamento de campos e transformação de dados.

Como disparar workflows


Você dispara execuções de workflow pelo endpoint Executar workflow:
O corpo da requisição contém o inputData da execução. Todos os campos ficam disponíveis para os nós seguintes pelo namespace workflow (por exemplo, workflow.transactionId ou workflow.amount). As saídas dos nós ficam disponíveis pelo ID do nó (por exemplo, check-fraud.body.score para um nó que não declara outputMapping).

Idempotência

Cada requisição de Executar workflow deve incluir um header Idempotency-Key. Uma requisição sem ele falha com 400 Bad Request (erro FLK-0509). Gere um UUID novo para cada nova execução, e reutilize a mesma chave apenas ao repetir a requisição idêntica.

Gatilhos de webhook


Webhooks são a principal forma de sistemas externos dispararem workflows do Flowker. Em vez de o seu sistema chamar a API de execuções diretamente, você registra um caminho de webhook em um workflow. Os serviços externos então enviam requisições HTTP para esse caminho.

Como funciona

  1. Adicione um nó de gatilho do tipo webhook ao seu workflow com um path e um method no seu data. Defina input_contract explicitamente em nós novos quando você precisa de validação open, xsd ou openapi.
  2. Quando você ativa o workflow, o Flowker registra o caminho no seu registro de webhooks.
  3. Sistemas externos enviam requisições para POST /v1/webhooks/{path} (ou o método que você configurou).
  4. O Flowker resolve o caminho para o workflow correspondente e o executa.

Como definir um nó de gatilho de webhook

O gatilho de webhook é um nó com type: "trigger" e triggerType: "webhook" no seu data, mais um path, um method e um input_contract opcional. Como configurar um gatilho de webhook cobre cada campo, os três modos de input_contract e o que cada um exige, e traz um nó resolvido para cada modo. A configuração do gatilho segue um contrato fechado. Salvar um workflow falha com FLK-0934 quando o gatilho de webhook dele omite path ou method, ou deixa de fora um campo que o modo de input_contract escolhido exige. Também falha quando o gatilho nomeia o id de schema ou o campo de operação de outro modo. Falha também quando o gatilho carrega uma chave ou um valor que o schema não aceita. Um nome em accepted_headers que não é um nome de header válido, repete outro nome ou está na lista de bloqueio falha com FLK-0957. O schema também declara os campos opcionais response_mode, response_view e accepted_headers. Veja Como configurar um gatilho de webhook.

Como proteger um webhook

Com PLUGIN_AUTH_ENABLED=true, as requisições a /v1/webhooks/* exigem um token Bearer e a permissão execute no recurso webhooks. Os deployments em produção exigem a autenticação do plugin. Conceda essa permissão a uma identidade máquina a máquina para cada sistema que você deixa chamar os seus webhooks, e gerencie a concessão no Access Manager. Isso mantém o acesso ao webhook sob o mesmo modelo de papéis e políticas da gestão de workflows, em vez de uma credencial presa ao caminho.

Metadados do webhook

O Flowker injeta automaticamente um objeto _webhook no inputData da execução com metadados sobre a requisição que chegou: Esses metadados ficam disponíveis para todos os nós do workflow pelo namespace workflow._webhook.

Regras de caminho e tamanho do corpo

  • Ativar um workflow cujo caminho e método de webhook outro workflow ativo já ocupa falha com FLK-0360.
  • Caminhos de webhook aceitam segmentos aninhados (por exemplo, payments/stripe/received).
  • O tamanho máximo do corpo da requisição é 1 MB.
Veja a referência da API Disparar um webhook para a documentação completa do endpoint.

Modo de resposta síncrona

Por padrão, um gatilho de webhook responde com um recibo 202 assim que a execução começa (o modo assíncrono). Quem chama deve consultar o status da execução em separado. Defina response_mode como "sync" no data do nó de gatilho para que o Flowker mantenha a conexão HTTP aberta e devolva o resultado da execução direto na resposta: Se a execução não chega a um estado terminal antes de o limite interno de espera se esgotar, o Flowker recorre ao recibo 202 do modo assíncrono. Esse recibo carrega um header Location apontando para o endpoint de resultados. response_view escolhe o formato do corpo da resposta síncrona: O finalOutput de uma execução que falhou na visão final_output carrega status: "failed" e errorMessage, e errorClass quando o Flowker conseguiu classificar a falha, nunca um {} vazio. Sem um override de responseStatusCode (veja abaixo), o status HTTP síncrono continua 200 para full/final_output/receipt (ele reporta a saúde do transporte, não o resultado de negócio). Um responseStatusCode válido em um nó set_output que roda sobrepõe esse status nessas três visões. Um nó de ação com actionType: "set_output" pode carregar um responseStatusCode opcional (inteiro, 200–599) para sobrepor o status HTTP que uma resposta de webhook sync devolve. Um valor fora do intervalo ou não inteiro falha na hora de salvar (FLK-0122). Para passthrough, o status de provedor repassado por um executor terminal vence o override. Um set_output terminal depois de um executor dá forma à resposta como a saída dele mesmo. O Flowker nunca volta atrás para a resposta de um executor anterior. Em uma execução que falhou, a etapa que parou é a etapa terminal, então o Flowker repassa um 4xx de provedor que parou o workflow como o 4xx real. Os valores na saída de um nó set_output aceitam referências ${...} resolvidas contra o contexto do workflow, incluindo ${workflow.<field>} (payload do gatilho), ${execution.id}, ${execution.startedAt} e ${execution.now} (carimbado no momento da interpolação). Uma referência ${...} que não resolve faz a etapa falhar (fail-closed).

Tratamento de erros


Se um nó falha, a execução para e o status dela vira failed. Não existe fallback automático. Depois que as novas tentativas acabam, a execução falha. Os resultados da execução reportam o status da execução e os stepResults. Uma etapa que falhou fornece stepNumber, nodeId, status e errorMessage, com statusCode e errorClass quando disponíveis. O campo output é opcional.

Novas tentativas e circuit breaker


O Flowker inclui resiliência nativa para chamadas de executor.

Novas tentativas

Quando uma chamada de executor falha com um erro transitório (um erro de rede, um timeout na tentativa, qualquer status 5xx, ou status 408 ou 429), o Flowker tenta de novo automaticamente. O comportamento de nova tentativa é configurável por nó, no data do nó executor: As novas tentativas valem apenas quando a operação é segura de repetir. Por padrão, o Flowker trata chamadas POST e PATCH como não idempotentes e não as repete (uma única tentativa), enquanto GET, PUT, DELETE e outros verbos são repetidos normalmente. Um retry.max_attempts maior que 1 faz aquele nó aderir às novas tentativas seja qual for o método. Um retry.max_attempts de 1 não é uma adesão. Ele define uma única tentativa. Erros que não permitem nova tentativa vão direto para uma única tentativa, seja qual for a configuração. Entre eles estão circuit breaker aberto, contexto cancelado e falhas ao resolver secrets. Incluem também um corpo de requisição acima do limite de tamanho configurado, um corpo de resposta de provedor acima do mesmo limite e respostas 4xx de provedor que não são transitórias. Isso significa qualquer 4xx exceto 408 e 429. A nova tentativa vale por execução de nó. Se todas as tentativas falham, a etapa falha e a execução para.

Circuit breaker

O Flowker usa um circuit breaker para que chamadas que falham repetidamente não sobrecarreguem serviços externos: Uma resposta 4xx do provedor não conta para o limiar, exceto 408 e 429: ela reflete a requisição, não a saúde do provedor. Quando o circuito está aberto, as chamadas de executor falham na hora com FLK-0507 em vez de alcançar o serviço externo. Isso evita falhas em cascata e dá tempo ao serviço externo para se recuperar.
Estados do circuit breaker

Transições de estado do circuit breaker

O circuito começa no estado Closed, onde todas as requisições passam normalmente. Depois que o circuito alcança o limiar de falhas, ele passa para Open e bloqueia todas as requisições na hora. Depois de 30 segundos, ele vai para Half-Open e permite uma requisição de teste. Se essa requisição funciona, o circuito volta para Closed. Se falha, o circuito reabre por outro ciclo de 30 segundos.
O circuit breaker opera por configuração de provedor, no escopo do seu tenant. Falhas contra uma conexão não afetam outra, e um tenant não pode abrir o circuito de outro. Os limiares do circuit breaker (contagem de falhas, timeout de recuperação) são padrões globais do deploy. Você não pode personalizá-los por conexão.

O que vem a seguir


Conceitos centrais

Entenda workflows, nós, arestas e execuções.

API de configurações de provedor

Explore a API de configuração de provedor.