Casos de uso do Workflow Engine

90

Eu gostaria de saber sobre problemas específicos que você - leitor do SO - resolveu usando Workflow Engines e quais bibliotecas / frameworks você usou se não criou o seu próprio. Eu também gostaria de saber quando um Workflow Engine não era a melhor escolha e se / como você escolheu algo mais simples, como um aplicativo do tipo TaskList / WorkList / Task-Management usando máquinas de estado.

Questões:

  • Para quais problemas você usou os mecanismos de fluxo de trabalho?
  • Quais bibliotecas / frameworks você usou?
  • Quando uma máquina de estado / gerenciamento de tarefas mais simples como o sistema foi suficiente?
  • Bônus: Como você fez / faz a distinção entre Gerenciamento de Tarefas e Mecanismo de Fluxo de Trabalho ?

Procuro experiências de primeira mão.

Alguns dos recursos que verifiquei:

Lance Pollard
fonte

Respostas:

61

Eu também sou tendencioso, pois sou o autor principal de StonePath .

Eu desenvolvi aplicativos de fluxo de trabalho para o Departamento de Estado dos EUA, o Centro de Desminagem Humanitária de Genebra, vários clientes do Fortune 500 e, mais recentemente, o Sistema de Escolas Públicas de Washington DC. Cada vez que vejo um 'mecanismo de fluxo de trabalho' que tenta ser a referência principal para processos de negócios, vejo uma organização lutando contra si mesma para contornar a ferramenta. Isso pode ser devido ao fato de que essas soluções sempre foram orientadas pelo fornecedor / produto e, em seguida, acabam com uma equipe tática de 'consultores' constantemente alimentando o aplicativo ... mas por causa disso, tenho tendência a reagir negativamente quando ouço o benefícios das ferramentas baseadas em processos que prometem 'centralizar as definições de fluxo de trabalho em um lugar e torná-las repetíveis'.

Dito isso, gosto muito de Ruote - acompanho esse projeto há algum tempo e, se precisar desse tipo de solução, será a próxima ferramenta que estarei disposto a tentar. StonePath tem uma finalidade muito diferente de ruote - onde Ruote é útil para Ruby em geral, StonePath é voltado para Rails, o framework da web escrito em Ruby. Enquanto Ruote trata de processos de negócios de longa duração e suas definições associadas, StonePath trata de gerenciamento de fluxo de trabalho baseado em estado e tarefas. Francamente, acho que a distinção de olhar de fora para dentro pode ser sutil - muitas vezes os mesmos tipos de processos de negócios podem ser representados de qualquer maneira - o modelo baseado em estado e tarefa tende a se mapear para meu modelo mental.

Deixe-me descrever os destaques de um fluxo de trabalho baseado em estado. Em resumo, imagine um fluxo de trabalho girando em torno do processamento de algo como um empréstimo hipotecário ou a renovação de um passaporte. À medida que o documento se move "pelo escritório", ele viaja de um estado para outro. Imagine se você for o responsável pelo documento e seu chefe solicitar uma atualização de status a cada poucas horas e quiser uma resposta breve ... você diria coisas como "Está na entrada de dados" ... "Estamos verificando as credenciais do candidato agora "..." estamos aguardando uma revisão de qualidade "..." Terminamos "... e assim por diante. Esses são os estados em um fluxo de trabalho baseado em estados. Passamos de um estado para outro por meio de transições - como "aprovar", "aplicar", retroceder "," negar "e assim por diante. Esses tendem a ser verbos de ação.

A próxima parte de um fluxo de trabalho baseado em estado / tarefa é a criação de tarefas. Uma Tarefa é uma unidade de trabalho, normalmente com uma data de vencimento e instruções de manuseio, que conecta um item de trabalho (o pedido de empréstimo ou renovação de passaporte, por exemplo) a um usuário "na caixa". As tarefas podem acontecer em paralelo ou sequencialmente, e podemos criar tarefas automaticamente quando entramos nos estados, criar tarefas manualmente conforme as pessoas percebem que o trabalho precisa ser feito e exigir que as tarefas sejam concluídas antes de podermos passar para um novo estado. Todo esse tipo de comportamento é opcional e faz parte da definição do fluxo de trabalho.

A toca do coelho pode ir muito mais fundo do que isso, e escrevi um artigo sobre isso para a edição nº 4 da PragPub, a Pragmatic Programmer's Magazine. Verifique o link reo acima para obter um PDF atualizado desse artigo.

Trabalhando com StonePath nos últimos meses, descobri que o modelo baseado em estado mapeia muito bem para arquiteturas da web repousantes - em particular, as tarefas e transições de estado são mapeadas bem como recursos aninhados. Espere ver futuros escritos de mim sobre este assunto.

bokmann
fonte
2
impressionante! Estou ansioso para aprender mais sobre as diferenças sutis entre os mecanismos de fluxo de trabalho, como ruote, e os mecanismos de estado / tarefa, como o stonepath, porque, não tendo passado por isso antes, é difícil ver por onde começar. Eu li tudo que pude encontrar sobre stonepath e ruote e um milhão de outros white papers sobre BPM e fluxos de trabalho, então algum conhecimento de "experiência em primeira mão" como este REALMENTE diminuirá a curva inicial. obrigado novamente.
Lance Pollard,
@bokmann porque não apenas salvar o estado em uma única coluna da tabela ??
AminM 01 de
31

Sou tendencioso, sou um dos autores de ruote .

variante 1) máquina de estado ligada a um recurso (documento, pedido, fatura, livro, móvel).

variante 2) máquina de estado conectada a um recurso virtual denominado tarefa

variante 3) mecanismo de fluxo de trabalho interpretando definições de fluxo de trabalho

Agora que sua pergunta foi marcada como "BPM", podemos ser expandidos para "Gerenciamento de processos de negócios". Como esse tipo de gerenciamento ocorre em cada uma das variantes?

Na variante 1, o processo de negócios (ou fluxo de trabalho) está espalhado no aplicativo. A máquina de estado conectada ao recurso impõe alguns dos aspectos do fluxo de trabalho, mas apenas aqueles relacionados ao recurso. Pode haver outros recursos com sua própria máquina de estado seguindo o mesmo processo de negócios.

Na variante 2, o fluxo de trabalho pode ser concentrado em torno do recurso de tarefa e representado pela máquina de estado em torno desse recurso.

Na variante 3, o fluxo de trabalho é decretado pela interpretação de um recurso denominado definição de fluxo de trabalho (ou definição de processo de negócios).

O que acontece quando o processo de negócios muda? Vale a pena ter um mecanismo de fluxo de trabalho onde os processos de negócios são recursos gerenciáveis?

A maioria das bibliotecas da máquina de estado tem 1 conjunto de estados + transições. Os mecanismos de fluxo de trabalho são, a maioria deles, intérpretes de definição de fluxo de trabalho e permitem que vários fluxos de trabalho diferentes sejam executados juntos.

Qual será o custo de alterar o fluxo de trabalho?

As variantes não são mutuamente exclusivas. Já vi muitos exemplos em que um mecanismo de fluxo de trabalho altera o estado de vários recursos, alguns deles protegidos por máquinas de estado.

Eu também uso muito a variante 3 + 2, para tarefas humanas: o mecanismo de fluxo de trabalho, em alguns pontos ao executar uma instância de processo, entrega uma tarefa (item de trabalho) para um participante humano (a tarefa de recurso é criada e colocada no estado 'pronta') .

Você pode percorrer um longo caminho com a variante 2 sozinha (a variante do gerenciador de tarefas).

Também poderíamos mencionar a variante 0), onde não há máquina de estado, nenhum mecanismo de fluxo de trabalho e os processos de negócios estão espalhados e / ou codificados no aplicativo.

Você pode fazer muitas perguntas, mas se não reservar um tempo para ler as respostas e não reservar um tempo para tentar e experimentar, você não irá muito longe e nunca adquirirá qualquer habilidade para quando usar esta ou aquela ferramenta.

jmettraux
fonte
muito obrigado por esta resposta, está esclarecendo um pouco as coisas. não há distinções suficientes para que o recém-chegado obtenha uma compreensão decente da modelagem de fluxo de trabalho formal para começar a brincar com o código; são todos whitepapers sobre java do final dos anos 90, ao que parece. você e David de Stonepath estão começando a quebrar muito essa barreira. um dia pode ser tão fácil quanto aprender trilhos. Vou começar a brincar com a variante do gerenciador de tarefas em alguns dias. obrigado.
Lance Pollard,
o link parece estar morto?
rogerdpack de
o projeto agora está morto
Jeshan Babooa
4

Em um projeto anterior em que estava trabalhando, adicionei algumas regras de tipo de fluxo de trabalho a um conjunto de formulários de governo no setor de saúde.

Os formulários precisavam ser preenchidos pelo usuário final e, dependendo de algumas respostas, outros formulários foram programados para serem preenchidos posteriormente. Também havia eventos externos que cancelariam formulários programados ou programariam novos.

Fluxo de amostra:

Paciente admitido -> Agendar avaliação inicial -> Agendar formulário de avaliação trimestral -> Paciente faleceu -> Cancelar análise -> Agendar formulário de avaliação de alta

Muitas outras regras foram baseadas em coisas como a idade do paciente, onde eles estavam sendo admitidos etc.

Este era um aplicativo ASP.NET, as regras eram basicamente uma tabela no banco de dados. Eu adicionei scripts, para que um script fosse executado na conclusão do formulário para determinar o que fazer a seguir. Este era um design horrível e teria sido perfeito para um mecanismo de fluxo de trabalho adequado.

Ben Dempsey
fonte
3

Sou um dos autores do Cadence Workflow Engine que desenvolvemos na Uber. A diferença entre o Cadence e a maioria dos mecanismos de fluxo de trabalho existentes é que ele é focado no desenvolvedor e é extremamente flexível e escalonável (para dezenas de milhares de atualizações por segundo e até bilhões de fluxos de trabalho abertos). Os fluxos de trabalho são escritos como programas orientados a objetos e o mecanismo garante que o estado dos objetos de fluxo de trabalho, incluindo pilhas de threads e variáveis ​​locais, seja totalmente preservado em caso de falhas do host.

Para quais problemas você usou os mecanismos de fluxo de trabalho? Cadence é usado para praticamente qualquer aplicativo de back-end que vive além de uma única resposta de solicitação. Exemplos de uso são:

  • Jobs CRON distribuídos
  • Gerenciamento de canais de ML / dados
  • Reagindo a eventos de negócios. Por exemplo, eventos de viagem no Uber. O fluxo de trabalho pode acumular estado com base em eventos recebidos e executar atividades quando necessário.
  • Implantação de serviços para Mesos / Kubernetes
  • Implementação do CI Pipeline
  • Garantir que várias chamadas de serviço sejam concluídas quando uma solicitação for recebida. Incluindo a implementação do padrão SAGA
  • Gerenciando tarefas de trabalho humano (semelhante ao Amazon MTurk )
  • Processamento de mídia
  • Roteamento de tíquetes de suporte ao cliente
  • Processamento de pedido
  • Serviço de teste semelhante ao ChaosMonkey

e muitos outros

O outro conjunto de casos de uso é baseado na portabilidade dos mecanismos de workflow existentes para execução no Cadence. Praticamente qualquer linguagem de especificação de fluxo de trabalho de mecanismo existente pode ser portada para rodar no Cadence. Existem vários sistemas Uber internos que foram transferidos. Dessa forma, um único serviço de back-end pode alimentar vários sistemas de fluxo de trabalho específicos de domínio.

Quais bibliotecas / frameworks você usou?

Cadence é um serviço independente escrito em Go with Go e bibliotecas de cliente Java . A única dependência externa é o armazenamento. Bancos de dados Cassandra e SQL são suportados.

Cadence também oferece suporte à replicação cruzada assíncrona (usando a terminologia da AWS).

Quando uma máquina de estado / gerenciamento de tarefas mais simples como o sistema foi suficiente?

Dentro do Uber o serviço Cadence é gerenciado por nossa equipe. Portanto, a sobrecarga de construção de qualquer gerenciamento de máquina / tarefa de estado personalizado é sempre maior do que usar o Cadence. Fora da empresa, o serviço e o armazenamento precisam ser configurados. Se você já tem um banco de dados SQL, a implantação do serviço é trivial por meio de uma imagem docker. A janela de encaixe também é usada para executar um serviço Cadence local para desenvolvimento em um computador pessoal ou laptop.

Maxim Fateev
fonte
2

Verifique a gem rails_workflow - acho que isso está perto do que você está procurando.

Max
fonte
2

Sou um dos autores do Imixs-Workflow . Imixs-Workflow é um mecanismo de fluxo de trabalho de código aberto baseado em BPMN 2.0 e totalmente integrado à pilha de tecnologia Java EE.
Eu mesmo desenvolvo mecanismos de workflow há mais de 10 anos. Vou tentar responder a sua pergunta resumidamente:

> Para quais problemas você usou os mecanismos de fluxo de trabalho?

Meu objetivo pessoal quando comecei a pensar sobre os mecanismos de fluxo de trabalho era evitar a codificação rígida da lógica de negócios em meu aplicativo. Muitas coisas em um aplicativo de negócios podem ser reutilizadas, portanto, faz sentido mantê-las configuráveis. Por exemplo:

  • enviando uma notificação
  • ver tarefas abertas
  • atribuiu uma tarefa a uma pessoa
  • descrevendo a tarefa atual

Nesta lista de funções, você pode ver que estou falando sobre fluxos de trabalho centrados em humanos. Resumindo: um mecanismo de fluxo de trabalho centrado no ser humano responde às perguntas: Quem é responsável por uma tarefa e quem precisa ser informado em seguida? E essas são as perguntas típicas dos requisitos de negócios.

> Quais bibliotecas / frameworks você usou?

5 anos atrás começamos a reimplementar o motor Imixs-Workflow com foco no BPMN 2.0 . BPMN é o padrão comum para modelagem de processos. E o que me surpreendeu foi que de repente fomos capazes de descrever até mesmo processos de negócios altamente complexos que podiam ser visualizados e executados. Recomendo a todos que usem BPMN para modelar processos de negócios.

> Quando uma máquina de estado / gerenciamento de tarefas mais simples como o sistema foi suficiente?

Uma máquina de estado simples é suficiente se você deseja apenas rastrear o status de um objeto de negócios. Este é o caso quando você começa a introduzir o atributo 'status' em seu modelo de objeto. Mas no caso de você precisar de processos de negócios com responsabilidades, registro e controle de fluxo, então uma máquina de estado não é mais suficiente.

> Bônus: como você fez / faz a distinção entre Gerenciamento de Tarefas e Mecanismo de Fluxo de Trabalho?

Este é exatamente o ponto em que muitos mecanismos de fluxo de trabalho mencionados aqui diferem. Para um fluxo de trabalho centrado em humanos, você normalmente precisa de um gerenciamento de tarefas para distribuir tarefas entre atores humanos. Para uma automação de processos, este ponto não é tão relevante. É suficiente se o motor executa certas tarefas. O gerenciamento de tarefas e os mecanismos de fluxo de trabalho não podem ser comparados porque o gerenciamento de tarefas é sempre uma função de um mecanismo de fluxo de trabalho.

Ralph
fonte
1

Lancei meu próprio mecanismo de workflow para suportar o processamento em fases de documentos - catalogação, envio para processamento de imagem (trabalhamos com sw de redação), se necessário, envio para validação, liberação e finalmente envio de volta para o cliente. Em nosso caso, temos uma grande quantidade de documentos para processar, então às vezes precisamos executar cada serviço separadamente para controlar a entrega e o uso de recursos. Simples no conceito, mas de alto desempenho e processamento distribuído necessário, e não conseguimos encontrar nenhum produto de prateleira que se encaixasse no nosso orçamento.

Otávio Décio
fonte
1

Tenho experiência com o uso do motor Activiti BPMN 2.0 para lidar com processos de transferência de dados de alto desempenho e alto rendimento em uma infraestrutura de nós de rede. A tarefa básica era permitir a configuração e o monitoramento de tais processos de transferência e controlar cada nó da rede (ou seja, solicitar ao nó 1 para enviar um arquivo de dados ao nó 2 por meio da camada de transporte específica).

Pode haver milhares de processos em execução ao mesmo tempo e, no geral, dezenas ou poucas centenas de milhares de processos por dia.

Havia um monte de definições de processos diferentes, mas não era necessariamente necessário que um operador do sistema pudesse criar fluxos de trabalho personalizados. Portanto, o principal caso de uso para o próprio mecanismo de BPM era ser robusto, escalonável e permitir o monitoramento de cada fluxo de processo.

No final, basicamente funcionou, mas o que aprendemos com esse projeto foi que uma plataforma BPMN, ou melhor, o motor Activiti especificamente, não era a melhor aposta para um sistema de alto rendimento.

Os principais desafios foram priorização de execução de tarefas, bloqueio de banco de dados, novas tentativas de execução, para citar alguns que dizem respeito ao próprio BPM. Então, tivemos que desenvolver um tratamento personalizado para eles, por exemplo:

  • Tratamento de novas tentativas no BPM para casos em que um nó não tinha um trabalhador livre para determinada tarefa ou quando o nó não estava em execução.
  • Execução de tarefas de transferência paralela em um único processo e sincronização dos resultados (sucesso / falha).

Não sei se outros motores BPMN seriam mais adequados para esse cenário, uma vez que o BPMN se destina principalmente a tarefas de negócios de longa duração que envolvem a interação do usuário, onde o desempenho provavelmente não é o mesmo que no nosso caso.

Adam Hošek
fonte