Diferentemente de um scheduled workflow, que segue uma programação predefinida (como todos os dias à 1h), um workflow acionado é um modelo de processamento de dados sob demanda e orientado a eventos. Um sinal externo — como upload de arquivo, chegada de mensagem, chamada de API ou clique manual — inicia sua execução em tempo real, oferecendo alta capacidade de resposta e flexibilidade para o processamento de dados.
|
Recurso |
Workflow agendado |
Workflow acionado |
|
Mecanismo de acionamento |
Agendamento fixo (expressão cron) |
Sinal externo (evento, API, manual) |
|
Modelo de execução |
Agendado e previsível |
Reativo e sob demanda |
|
Casos de uso |
Data warehouse em lote T+1, relatórios agendados |
Processamento de arquivos na chegada, integração com sistemas de negócios, reparo manual de dados |
|
Principais vantagens |
Confiabilidade e agendamento previsível |
Alta capacidade de resposta em tempo real e flexibilidade |
Métodos de acionamento compatíveis
Um workflow acionado oferece suporte a três métodos de acionamento. Escolha um conforme seu cenário.
|
Método de acionamento |
Iniciador |
Cenários principais |
Pontos-chave |
|
Acionamento por evento |
Fonte de evento externa (como OSS ou ApsaraMQ for Kafka) |
ETL orientado a eventos: processe arquivos assim que chegarem ou inicie computação em tempo real a partir de mensagens. |
Crie primeiro um Create a trigger e associe-o ao workflow. Isso só entra em vigor no ambiente de produção. |
|
Acionamento manual |
Usuário (desenvolvedor/engenheiro de O&M) |
Tarefas ad hoc: processamento ou análise pontual de dados. |
Execute o workflow manualmente tanto nos ambientes de desenvolvimento quanto de produção. Esta é a alternativa recomendada aos workflows manuais. |
|
Acionamento por API |
Sistema externo (via OpenAPI) |
Integração de sistemas: acionado por callbacks de sistemas de negócios (como CRM ou ERP) para iniciar o processamento de dados. |
Chame uma operação OpenAPI e tenha as permissões necessárias. |
Início rápido: crie um workflow acionado manualmente
Esta seção orienta você na criação de um workflow acionado simples e na sua execução manual, permitindo experimentar rapidamente todo o processo de ponta a ponta.
Etapa 1: crie um workflow acionado
Acesse a página Workspaces no console do DataWorks. Na barra de navegação superior, selecione a região desejada. Localize o workspace desejado e escolha na coluna Actions.
No painel de navegação à esquerda, clique em
e, em seguida, clique em no lado direito de Project Directory para acessar a página Create Workflow.Na caixa de diálogo exibida, na página Create Workflow, defina Scheduling Type como Triggered scheduling. Insira um Name para o workflow e clique em Confirm para criar o workflow.
Etapa 2: orquestre o workflow e desenvolva nós
Clique em + Add Node na barra de ferramentas para abrir a lista de nós. Arraste um nó Shell da lista de tipos de nós à esquerda para a tela, insira um nome e conclua a criação.
-
Clique duas vezes no nó Shell para acessar a página de edição de código e insira o seguinte código:
echo "Hello, Trigger Workflow! Current time is ${bizdate}" Clique no botão Save na barra de ferramentas.
Etapa 3: depure e execute (ambiente de desenvolvimento)
Retorne à tela do workflow e clique no ícone
na barra de ferramentas superior.Na caixa de diálogo exibida, insira o Value Used in This Run para o workflow (por exemplo, se hoje for 20260310, substitua
bizdatepor20260309).Após alguns instantes, no log de execução na parte inferior, visualize o status de execução do nó e a saída do comando
echo.
Etapa 4: implante e execute (ambiente de produção)
Na tela do workflow, clique no botão Deploy
e siga as instruções para concluir o processo de implantação.Após a implantação bem-sucedida, acesse Operation Center > Manually Triggered Task O&M > Manually Triggered Task> Triggered Workflow.
Localize o workflow recém-implantado e clique em Run na coluna Operation.
Na caixa de diálogo exibida, clique em Run novamente para acionar uma instância do workflow no ambiente de produção. Visualize os detalhes desta execução na página Manual Instances.
Agora você domina o uso básico de workflows acionados. A seguir, exploraremos os recursos mais avançados de acionamento por eventos.
Exemplo avançado: crie um workflow acionado por evento
Cenário 1: chegada de novo arquivo no OSS aciona automaticamente o processamento de dados
Objetivo: quando um novo arquivo CSV for carregado em um diretório especificado no OSS, acione automaticamente um workflow que imprime o caminho do arquivo.
Etapa 1: crie um gatilho do OSS
Acesse Operation Center > Scheduling Settings > Trigger Management.
-
Clique em Create Trigger e configure conforme abaixo:
NotaPara descrições detalhadas dos parâmetros, consulte OSS trigger.
Trigger Name: insira um nome personalizado, como
oss_new_file_trigger.Applicable Workspace: selecione o workspace de destino onde o workflow reside.
Trigger Event Type: selecione Object Storage Service (OSS).
Trigger Event: selecione
oss:ObjectCreated:PutObject(ou outro evento de upload).Bucket Name: selecione seu bucket do OSS.
File Name: especifique o caminho e o formato do arquivo a serem monitorados. Há suporte para caracteres curinga. Por exemplo, para monitorar todos os arquivos
.csvno diretórioinput/, insirainput/*.csv.-
Role Configuration: no primeiro uso, realize a One-Click Authorization e selecione a função chamada DataWorks-EventBridge-OSS-MNS-Role-***.
*** representa um número de ID de 13 dígitos gerado aleatoriamente para garantir unicidade.
Clique em Confirm para concluir a criação do gatilho.
Etapa 2: crie e associe um workflow
Siga as etapas em Quick start: Create a manually triggered workflow para criar um novo workflow acionado chamado
process_oss_file_workflow.No painel à direita da tela do workflow, acesse Scheduling Settings > Scheduling Policy.
-
Na lista suspensa Trigger, selecione o gatilho
oss_new_file_triggerrecém-criado.Após selecionar um gatilho, utilize
${workflow.triggerMessage}nas tarefas internas para obter o corpo completo da mensagem, ou use${workflow.triggerMessage.xxx}para obter o valor de um campo específico no corpo da mensagem.
Etapa 3: desenvolva um nó e analise parâmetros de evento
Clique em + Add Node na barra de ferramentas para abrir a lista de nós. Arraste um nó Shell da lista de tipos de nós à esquerda para a tela, insira um nome e conclua a criação.
-
Clique duas vezes no nó e escreva o código para recuperar e imprimir o caminho do arquivo a partir do evento de acionamento.
-
Uso geral: o uso de parâmetros a seguir aplica-se à maioria das mensagens de evento.
# When a trigger fires the workflow, event info is passed in via the built-in variable workflow.triggerMessage # We can get the full path of the uploaded file via ${workflow.triggerMessage.data.oss.object.key} echo "========= Start Processing OSS File =========" message='${workflow.triggerMessage}' echo "Raw Value: ${message}" # Extract the file name from the event message FILE_PATH='${workflow.triggerMessage.data.oss.object.key}' echo "A new file has arrived: ${FILE_PATH}" # Add specific processing logic here echo "========= Finish Processing OSS File =========" -
Caso especial: alguns nós, como os nós Shell, possuem regras de sintaxe próprias. Antes da execução do nó, o mecanismo de agendamento primeiro substitui o conteúdo da mensagem no texto do script e depois o passa para o interpretador Shell executar. Consequentemente, aspas, espaços e quebras de linha na mensagem participam diretamente da análise sintática do Shell. Isso pode fazer com que espaços ou quebras de linha no parâmetro quebrem a estrutura original do código após o nó recuperar o parâmetro. Nesse caso, utilize um heredoc para ler a mensagem, evitando a maioria dos problemas com caracteres especiais:
# Use a heredoc to safely capture the raw text substituted from ${workflow.triggerMessage}. message=$(cat <<'__DW_TRIGGER_MESSAGE__' ${workflow.triggerMessage} __DW_TRIGGER_MESSAGE__ ) # Scenario 1: Get the entire raw message printf 'Raw Value: %s\n' "$message" # Scenario 2: If you need only a specific field, use Python to parse the JSON and extract the value dt=$(printf '%s' "$message" | /home/tops/bin/python3 -c 'import json,sys; print(json.load(sys.stdin).get("body",{}).get("dt",""))') printf 'dt=%s\n' "$dt"Nota${workflow.triggerMessage}: recupera o corpo completo da mensagem de evento no formato JSON. Obtenha o formato específico da mensagem para OSS em EventBridge > Event Bus >
DATAWORKS_TRIGGER_FOR_BUCKET_<OSS_Bucket_Name>> Event Tracing > Event Details.
-
Etapa 4: depure e publique
-
Depuração:
Retorne à tela do workflow e clique no botão Run
.-
Na caixa de entrada Trigger Message Body, cole um JSON simulando um evento do OSS. Copie e modifique o valor de
keydo "Exemplo de Formato de Mensagem" na página de configuração do gatilho. Abaixo está um exemplo simples.{ "data": { "oss":{ "object": { "key": "input/test_file_20260310.csv" } } } } Clique em Run e verifique se
input/test_file_20260310.csvfoi impresso corretamente nos logs.
Publicação: após a depuração bem-sucedida, clique no botão Publish para implantar o workflow no ambiente de produção. Gatilhos de evento entram em vigor apenas no ambiente de produção.
Etapa 5: verifique em produção
-
Utilize o console do OSS ou uma ferramenta cliente para carregar um arquivo CSV no bucket e no caminho (por exemplo, o diretório
input/) configurados no gatilho. Acesse o Operation Center do DataWorks > Manually Triggered Task O&M > Manually Triggered Task > Triggered Workflow. O workflow
process_oss_file_workflowpublicado com sucesso aparecerá na lista.-
Aguarde alguns instantes e acesse o Operation Center do DataWorks > Manually Triggered Task O&M > Triggered Workflow Instance. Uma nova instância de workflow será acionada automaticamente. Clique para visualizar seus logs e confirmar que o caminho do arquivo foi processado corretamente.
===== Start Processing 0SS File ===== Raw Value: {"datacontenttype":"application/json;charset=utf-8","aliyunaccountid":"1162423445433459","data":{"eventVersion":"1.0","responseElements":{"requestId":"69B1083F7A439F343040ABCD"}, "eventSource":"acs:oss","eventTime":"2026-03-11T06:14:23.000Z","requestParameters":{"sourceIPAddress":"140.205.11.13"},"eventName":"0bjectCreated:Post0bject","userIdentity":{"principalId":"1162423445433459"}, "region":"cn-hangzhou","oss":{"bucket":{"name":"dwoss1024","arn":"acs:oss:cn-hangzhou:1162423445433459:dwoss1024","virtualBucket":"","ownerIdentity":"1162423445433459"},"ossSchemaVersion":"1.0","object":{"size":59537,"objectMeta": {"mimeType":"text/csv"},"deltaSize":0,"eTag":"63B4BA5A45AEFC679B9A917E8DDF0D32","key":"input/2013-2020-global-PS4-game-sales.csv"}}},"subject":"acs:oss:cn-hangzhou:1162423445433459:dwoss1024/input/2013-2020-global-PS4-game-sales.csv","aliyunoriginalaccountid":"1162423445433459","source":"acs.oss","type":"oss:0bjectCreated:Post0bject","aliyunpublishtime":"2026-03-11T06:14:23.959Z","specversion":"1.0","aliyuneventbusname":"DATAW0RKS_TRIGGER_F0R_BUCKET_dwoss1024","id":"69B1083F7A439F343040ABCD","time":"2026-03-11T06:14:23.000Z","aliyunregionid":"cn-hangzhou"}A new file has arrived: input/2013-2020-global-PS4-game-sales.csv ====== Finish Processing 0SS File =========
Melhor prática: design idempotente
Devido a fatores como flutuações de rede, eventos do OSS podem ser entregues mais de uma vez. Para evitar processamento duplicado de dados, recomenda-se implementar idempotência na lógica de negócios. Uma abordagem comum é verificar uma tabela de registros (como uma tabela do MaxCompute) antes de processar um arquivo. Utilize o ETag do arquivo ou seu caminho único como identificador e ignore o arquivo caso já tenha sido processado.
Cenário 2: chegada de mensagem do Kafka impulsiona computação em tempo real
Objetivo: monitore logs de comportamento de usuário no Kafka. Quando novas mensagens chegarem, acione um workflow para analisá-las e execute lógicas diferentes com base no conteúdo.
Etapa 1: crie um gatilho do Kafka
Acesse Operation Center > Scheduling Settings > Trigger Management e clique em Create Trigger.
-
Configure os seguintes parâmetros:
Trigger Name:
kafka_user_action_trigger.Trigger Event Type: selecione ApsaraMQ for Kafka.
Kafka Instance e Topic: selecione a instância e o tópico que deseja monitorar.
ConsumerGroupId: recomenda-se selecionar Quick Create. O sistema gera automaticamente um ID de grupo de consumidores para evitar conflitos com outras aplicações.
Key (opcional): especifique uma chave de mensagem. Apenas mensagens cuja chave corresponda exatamente ao valor especificado acionarão o workflow.
Clique em OK.
Etapa 2: crie e associe um workflow
Siga as etapas em Quick start: Create a manually triggered workflow para criar um workflow acionado chamado
handle_user_action_workflow.No painel à direita da tela do workflow, selecione Scheduling Settings > Scheduling Policy.
-
Na lista suspensa Trigger, selecione o gatilho
kafka_user_action_triggerrecém-criado.Após selecionar um gatilho, utilize
${workflow.triggerMessage}nos nós internos para recuperar o corpo completo da mensagem, ou use${workflow.triggerMessage.xxx}para recuperar o valor de um campo específico no corpo da mensagem. (Importante) Como as mensagens podem chegar com alta frequência, recomenda-se configurar o Máximo de Instâncias Paralelas para Tarefas Internas, como
100, para evitar que um pico repentino de mensagens sobrecarregue os recursos de agendamento.
Etapa 3: desenvolva nós e analise JSON aninhado
Suponha que o campo value da mensagem do Kafka seja uma string JSON no seguinte formato: {"user_id": "1001", "action_type": "login", "timestamp": 1688888888}.
Clique em + Add Node na barra de ferramentas para abrir a lista de nós. Arraste um nó Python da lista de tipos de nós à esquerda para a tela.
-
Escreva o código para analisar a mensagem. Como o campo
valueé uma string, é necessário realizar uma segunda análise JSON no código.import json # 1. Use the built-in variable to get the value field of the Kafka message, which is a JSON string message_value_str = '${workflow.triggerMessage.value}' print(f'Received raw message value string: ${message_value_str}') try: # 2. Parse this string into a JSON object (dictionary) in Python message_data = json.loads(message_value_str) user_id = message_data.get("user_id") action_type = message_data.get("action_type") print(f"Successfully parsed message. User ID: ${user_id}, Action: ${action_type}") # 3. Execute different business logic based on the action_type if action_type == 'login': # o.run_sql(f"INSERT OVERWRITE TABLE user_login_record PARTITION(ds='{bizdate}') VALUES ('{user_id}');") print("Processing login action...") elif action_type == 'purchase': print("Processing purchase action...") else: print("Unknown action type.") except json.JSONDecodeError as e: print(f"Error decoding JSON: {e}") # Exception handling logic, e.g., write the error message to a dedicated log table raise e # Raise the exception to fail the node for easier troubleshooting
Etapa 4: depure e publique
-
Depuração:
Retorne à tela do workflow e clique no botão Run
.-
No Trigger Message Body, cole o evento simulado do Kafka. Note que o campo
valueé uma string JSON escapada.{ "topic": "user-behavior-topic", "key": "some-key", "value": "{\"user_id\": \"1001\", \"action_type\": \"login\", \"timestamp\": 1688888888}" } Execute o workflow e verifique nos logs se o nó Python conseguiu analisar corretamente
user_ideaction_type.
Publicação: após a depuração bem-sucedida, publique o workflow no ambiente de produção.
Etapa 5: verificação em produção
-
Envie uma mensagem formatada corretamente para o tópico do Kafka configurado.
Na página de detalhes do Tópico, clique em Quick Experience Message Sending and Receiving e selecione o método de envio Console. Insira
some-keyem Message Key, insira{"user_id": "1001", "action_type": "login", "timestamp": 1688888888}em Message Content, defina Send to Specified Partition como No e clique em Send. Se a página exibir Message sent successfully, a verificação foi aprovada. Acesse o Operation Center do DataWorks > Manually Triggered Task O&M > Manually Triggered Task > Triggered Workflow. O workflow
handle_user_action_workflowpublicado com sucesso aparecerá na lista.-
Em Operation Center > Manually Triggered Task O&M > Manual instance > Triggered Workflow Instance, verifique se uma nova instância de workflow foi acionada e revise seus logs de execução.
2026-xxx 14:55:40 INFO ======================================================================== Received raw message value string: ${"user_id": "1001", "action_type": "login", "timestamp": 1688888888} Successfully parsed message. User ID: $1001, Action: $login Processing login action... 2026-xxx 14:55:40 INFO ========================================================================
Melhores práticas: concorrência e ordenação
Controle de concorrência: garanta a definição de um número máximo razoável de instâncias paralelas para lidar com picos de mensagens.
Garantia de ordenação: o agendamento do DataWorks não garante o processamento estrito de mensagens em ordem. Caso precise assegurar que mensagens do mesmo usuário (ou partição) sejam processadas sequencialmente, implemente bloqueio distribuído no código de negócios (por exemplo, baseado em Redis ou MaxCompute) ou delegue a lógica de processamento para um mecanismo de computação que garanta consumo ordenado por partição (como Flink).
Design e configuração principais
Orquestração de workflow
O processo central de orquestração para workflows acionados é semelhante ao de workflows agendados. Para mais informações, consulte Node/workflow orchestration.
Parâmetros de agendamento
No painel Scheduling Settings no lado direito da tela do workflow, defina parâmetros globais para o workflow. Todos os nós dentro do workflow podem referenciar esses parâmetros.
Método de referência: no código do nó, referencie parâmetros do workflow no formato
${workflow.parameter_name}.-
Prioridade de parâmetros: os parâmetros no DataWorks seguem uma regra hierárquica de substituição. A ordem de prioridade é: Parâmetros de nó > Parâmetros de workflow.
Para mais informações sobre parâmetros, consulte Parameter design and flow .
Política de agendamento
Quando múltiplos workflows ou tarefas são acionados simultaneamente e os recursos do sistema se tornam um gargalo, utilize Priority e Weighting Strategy para implementar agendamento inteligente de recursos e garantir que as tarefas mais importantes sejam executadas primeiro.
Proteja o negócio principal: defina uma prioridade mais alta para workflows de negócios essenciais, garantindo que sempre executem antes de outros workflows não essenciais.
-
Reduza a duração do caminho crítico: dentro da mesma instância de workflow, ao usar a Priority weighting strategy, influencie a ordem de execução dos nós. Por exemplo, com a estratégia Downstream weighting, nós no caminho crítico que possuem mais dependências upstream recebem pesos dinâmicos maiores e são executados primeiro, reduzindo efetivamente a duração total da execução do workflow.
Item de configuração
Descrição
Priority
Define o nível absoluto de prioridade das instâncias de workflow na fila de agendamento. Os níveis disponíveis são 1, 3, 5, 7 e 8 (quanto maior o número, maior a prioridade). Tarefas ou workflows com prioridade mais alta sempre adquirem recursos de agendamento antes daqueles com prioridade mais baixa.
Priority weighting strategy
Define como o peso dinâmico de cada nó (tarefa) dentro de um workflow é calculado no mesmo nível de prioridade. Nós com pesos maiores são executados primeiro.
-
Sem ponderação: todos os nós têm o mesmo peso base fixo.
-
Ponderação downstream: os pesos dos nós são ajustados dinamicamente. Quanto mais dependências upstream um nó tiver, maior será seu peso. Essa estratégia ajuda os nós no caminho crítico do DAG (grafo acíclico direcionado) a serem executados primeiro. O peso é calculado como:
valor de peso inicial + soma das prioridades de todos os nós upstream.
Máximo de Instâncias Paralelas para Tarefas Internas
Controla o número máximo de instâncias deste workflow que podem ser executadas simultaneamente. Usado para controle de concorrência e proteção de recursos. Quando o número de instâncias em execução atinge o limite, novas instâncias acionadas subsequentemente entram em estado de espera. Defina como Allowed ou especifique um valor máximo personalizado (até 100.000).
NotaSe definir o limite com um valor que exceda a capacidade máxima do grupo de recursos, o gargalo real de concorrência será determinado pelo limite físico do grupo de recursos.
-
O sistema de prioridades no DataWorks segue uma regra hierárquica de substituição: Especificação em tempo de execução > Configuração no nível do nó > Configuração no nível do workflow.
Configuração no nível do workflow (linha de base): configurada na Scheduling Policy do workflow e serve como configuração padrão para todos os nós.
Configuração no nível do nó (local): em Scheduling Settings > Scheduling Policy de um nó individual dentro do workflow, defina uma Priority mais alta para um nó específico, substituindo a configuração no nível do workflow.
Especificação em tempo de execução (temporária): especificada através do alternador Runtime Priority Reset ao acionar manualmente uma execução no Operation and Maintenance Center. Esta configuração tem a maior prioridade, entra em vigor apenas para a execução atual e não modifica nenhuma configuração permanente.
O&M e gerenciamento
Monitoramento de instâncias: todas as instâncias acionadas ou executadas manualmente podem ser visualizadas, reexecutadas, encerradas e ter problemas resolvidos na página Operation Center > Manually Triggered Task O&M > Manual Instance.
Monitoramento e alertas: crie uma regra personalizada em Operation Center > Monitoring and Alerting > Rule Management. Após ativar Monitor Triggered Workflows, a regra monitorará apenas instâncias de workflow acionado. Para mais informações sobre como configurar a regra, consulte Rule management.
Clonar um workflow: clique com o botão direito em um workflow no Project Directory e selecione Clone para criar rapidamente uma cópia que inclui todos os nós e dependências. Para mais informações, consulte Clone a workflow para workflows agendados.
Gerenciamento de versões: no painel Versions no lado direito da tela do workflow, visualize, compare e restaure versões históricas de um workflow. Para mais informações, consulte Version management para workflows agendados.
Limites de uso e considerações
Ambiente efetivo: o mecanismo de acionamento por evento entra em vigor apenas após o workflow ser implantado no ambiente de produção (Operation Center).
Quantidade de nós: um único workflow suporta até 400 nós. Recomenda-se manter o número abaixo de 100 para simplificar a manutenção.
Restrição de grupo de recursos: nós criados em um workflow acionado podem usar apenas serverless resource groups.
Limite de concorrência: o número máximo de instâncias paralelas é 100.000, mas a concorrência real é limitada pelas especificações do grupo de recursos de agendamento adquirido.
Agendamento no nível do nó: ao configurar o agendamento no nível do nó, apenas Priority é suportado. Priority Weighting Policy não é suportado.
Tipos de nós não suportados: EMR Spark Streaming, Flink SQL Streaming, Flink JAR Streaming, Flink Python Streaming e nós de verificação de dependência não podem ser usados em workflows acionados. Esses tipos de nós só podem ser desenvolvidos e executados como nós independentes.