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.
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.
fonte
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.
fonte
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.
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.
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).
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.
fonte
Verifique a gem rails_workflow - acho que isso está perto do que você está procurando.
fonte
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:
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.
fonte
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.
fonte
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:
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.
fonte