[Arquitetura de Software] O Padrão de Projeto de Dutos – De Zero a Herói

Neste artigo, vamos explorar as diferentes formas de implementar o padrão de projeto de dutos a partir do básico para soluções mais complexas.

O Padrão de Projeto de Dutos

O padrão de projeto de dutos é um padrão de projeto de software que fornece a capacidade de construir e executar uma seqüência de operações.

https://www.hojjatk.com/2012/11/chain-of-responsibility-pipeline-design.html

Este padrão é melhor usado em conjunto com o padrão de plugin, para construir dinamicamente o pipeline quando a aplicação é iniciada.

Sequência

A implementação mais básica de um pipeline seria uma simples sequência de operações.

A interface de uma operação pode ser invocada para processar dados.

O pipeline processa cada operação uma a uma. A classe pipeline também está implementando a interface IOperation para que eles possam ser combinados.

>222222>

A operação pode ser escrita em uma classe dedicada.

>222222>

Or use um wrapper para criar automaticamente uma operação a partir de uma lambda.

As operações da tubulação devem ser registradas antes que a tubulação seja invocada.

Disjuntor de Circuit

A primeira característica que você deseja adicionar à sua tubulação é adicionar um disjuntor.

A cada operação retornará o resultado: falha ou sucesso.

Se uma operação falhar, a execução do pipeline deve parar.

Assíncrono

Um outro requisito pode ser ter um pipeline que possa lidar com operações assíncronas.

Cada operação terá agora de chamar a próxima operação em pipeline, depois de terminarem de processar os dados.

O pipeline é um pouco mais complexo, porque necessita de definir a próxima operação quando uma nova operação é registada. Outra solução é usar um construtor.

Esta operação é assíncrona e será executada em uma rosca dedicada, quando o tempo estiver esgotado, invocará a próxima operação para continuar o pipeline.

A operação genérica pode ser usada tanto com uma ação simples, ou usar um disjuntor integrado se você usar uma função.

>>222222>

Este exemplo simples utiliza várias das características que implementamos.

>

>

Agora você sabe como tornar sua tubulação assíncrona !

Seria ainda melhor se tivesse outra chamada de retorno à operação anterior para que pudesse ter o resultado indo contra-fluxo através do gasoduto.

Plugin

O principal motivo para usar o padrão de projeto do gasoduto é muitas vezes o requisito para poder adicionar plugins que irão anexar operações a um gasoduto existente ou para enganchar uma operação no meio do mesmo.

O pipeline é realmente básico, mas desta vez, as operações são expostas.

Vamos fazer uma aplicação simples com um pipeline que exibirá apenas os 3 passos na consola. Esta aplicação também suporta plugins para modificar o pipeline.

>222222>

O primeiro plugin enganchará outra operação no segundo slot do pipeline.

>222222>

O segundo plugin anexará uma nova operação no final do pipeline.

>>222222>

A aplicação e os plugins são colocados juntos, podemos invocar o pipeline.

>>222222>>

>

>

>

Batch

Outra funcionalidade útil é ser capaz de processar dados de lotes no mesmo pipeline do que itens individuais.

>>222222>

O pipeline do lote envolve um pipeline e chama cada operação em cada item.

>222222>

Todos os itens são embrulhados, para que possamos lembrar o resultado do disjuntor.

Esta operação verifica se o inteiro tem a ordem de magnitude requerida.

O pipeline vai verificar a ordem de magnitude de um lote de inteiros.

>>222222>

>

O pipeline apenas invoca a próxima operação para itens que não falharam.

O pipeline de alto desempenho

O Pipeline Design Pattern também pode estar se referindo a uma arquitetura de software muito mais específica e orientada para o desempenho.

Alguns projectos utilizam um pipeline para optimizar o processamento de uma enorme quantidade de dados, executando cada operação do pipeline numa rosca dedicada.

>>222222>

Cada linha consumirá e produzirá dados de uma fila concorrente que actuará como um buffer.

Desta vez, utilizaremos operações assíncronas com um disjuntor.

Se a operação for bem sucedida, deverá invocar a próxima, ou terminar se falhar.

A tubulação é projetada para contornar o disjuntor. Sucesso ou Falha, ele sempre continuará a seqüência pipeline pai e chamará a próxima operação.

>222222>

O cenário é um pouco complexo, então eu não vou explicar tudo. A idéia é ter diferentes threads para processar os pedidos recebidos. Quando um pedido termina o processamento, verificamos o status do pedido.

>222222>

Cada processador de pedidos é isolado em uma thread dedicada, para que você possa otimizar como armazenar os dados e ter acesso direto à memória sem usar lock.

>222222>

O processador de pedidos de pagamento é a única thread que pode acessar os saldos de usuários. Ele pode obter ou atualizar qualquer saldo sem se preocupar com questões de concorrência.

>222222>

O pipeline está processando a seqüência de operações o mais rápido possível.

Conclusão

O Pipeline Design Pattern tem muitas formas muito diferentes de ser implementado, desde uma simples Cadeia de Comando até um Workflow mais complexo.

Muitas características podem ser necessárias, como disjuntor, assíncrono ou buffer, mas na maioria das vezes, você quer usar pipelines quando quiser ter plugins que possam enganchar no fluxo de execução do pipeline.

Deixe uma resposta

O seu endereço de email não será publicado.