Opções para processamento distribuído...

Olá pessoal, tudo certo?

Ontem tive uma discussão interessante com o arquiteto da Microsoft Services, Marcos Pedroso. Ele sempre está envolvido em projetos de impacto no mercado, seja pela complexidade ou pelas restrições e SLA’s envolvidos na solução. Grande Pedroso! :)

Uma questão que conversamos foi sobre o uso de um modelo de cloud para cenários de paralelismo e distribuição de processos em cálculos financeiros. Existem mesmo diversos cenários onde patterns como o Map Reduce se aplicam de forma natural. Para quem não conhece, o desenho abaixo ilustra esse pattern, que apesar de antigo, ficou mais conhecido pelo pessoal da Google, quando o utilizaram para processos de search na Web.

image

Explicando: A idéia é termos um processo master que divide uma massa para processamento entre diversos workers, que executam a tarefa programada em blocos da massa de dados original. Dessa forma, distribuímo o processamento inicial entre diversos nós de computação, gerando um paralelismo na solução. Ao final, os vários resultados são devolvidos para o master, que realiza a consolidação dos resultados. Simples não? Já tive diversos projetos em .NET que fizeram algo parecido, utilizando classes como Threads para a divisão manual dos blocos de processamento entre as diversas threads. Funciona muito bem!

Porém, a implementação manual desse tipo de pattern não é trivial e exige alguns cuidados quando falamos de cenários mais complexos. Como alternativa para a programação manual, podemos usar algumas opções de paralelismo e escalabilidade na plataforma Microsoft.

1) HPC – High Performance Computing

A primeira delas é o HPC – High Performance Computing, que oferece um motor de paralelismo e distribuição de processamento pronto para essa divisão de workers, aproveitando ainda uma infraestrutura de vários processadores (multi-core) ou várias máquinas colocadas. Entre as características do HPC temos a possibilidade de trabalhar com mais de 1000 nós workers, execução sobre o Windows Server 2008 R2, suporte para bancos de dados remotos envolvidos na solução, Job Scheduling (um recurso importante para alguns cenários), etc. 

Um desenho que ilustra o cenário de distribuição de processamento com o Microsoft HPC aparece abaixo:

image

Explicando: o desenho acima ilustra um cenário simples de aplicação do Microsoft HPC, onde vemos a rede privada com os vários nós de computação (Compute Node), coordenados pelo WCF Broker Node, que realiza o papel de Master no modelo Map Reduce. Também vemos o cluster de SQL Server e os demais componentes de infraestrutura da solução, como AD, File Server, System Center e Mail Server.

É um cenário aplicável para diversas empresas e vale muito ser estudado! Para saber mais sobre HPC na plataforma Microsoft, confira:

Ref.: https://www.microsoft.com/hpc/en/us/default.aspx

2) Private Cloud e o Dynamic Data Center Toolkit

Outra opção interessante é a chamada private cloud. Na plataforma Microsoft isso aparece através do Dynamic Data Center Toolkit (DDCT) , que hoje está disponível para cenários de Hosting, mas em breve, estará com uma versão para Enterprise. Conversei rapidamente com o Fábio Hara (outro monstro sagrado do mundo de TI, hi! arigato!), que me apresentou alguns cenários corporativos que podem implementar um modelo de private cloud, aproveitando toda a infraestrutura e investimentos já feitos internamente.

Veja ainda o post abaixo, do time de produto falando sobre a solução DDCT/E para o mundo Enterprise:

Ref.: https://blogs.technet.com/ddcalliance/archive/2009/09/28/dynamic-data-center-toolkit-coming-to-an-enterprise-near-you.aspx

Para saber mais sobre Dynamic Data Center Toolkit e private cloud, confira o link abaixo:

Microsoft Private Cloud Computing Infrastructure
Ref.: https://www.microsoft.com/virtualization/en/us/private-cloud.aspx

3) Public Cloud e o Windows Azure

Finalmente, podemos aplicar um cenário de paralelismo e distribuição de processamento com alta escalabilidade e alta disponibilidade através do modelo de public cloud, na Microsoft oferecido pelo Windows Azure. Aqui, nosso pattern de Map Reduce ficaria assim:

image

Explicando: uma Web Role, por exemplo, pode implementar um serviço WCF para o recebimento de dados para processamento, realizando a distribuição entre os vários Workers internos da solução. Essa passagem pode ser feita por filas (Queues), para o desacoplamento entre Web e Worker. Ao final, os vários blocos de resultados são devolvidos para a camada Web por tabelas, preparadas para o cenário de alta escalabilidade na plataforma Azure. A consolidação é feita pela Web Role Master, que devolde o resultado final do processamento.

Nesse cenário de provisionamento elástico, podemos ainda configurar on-demand o número de nós de processamento, conforme alguma variável de dimensionamento colocada. Vale lembrar que, como são cenários de cálculo intenso, mas feitos de forma pontual, podemos dinamicamente controlar essa alocação de instância, reduzindo os custos envolvidos na solução final. Com certeza, ficará mais barato do que investir inicialmente milhares de dólares em uma super máquina, que pode amargar vários minutos ou horas de osciosidade ao longo do dia. Falei ainda com o Danielzinho, aqui do time de DPE, que ficou louco pensando em modelos matemáticos de cálculo em engenharia elétrica, que poderiam aproveitar esse paralelismo sobre o Azure. :)

Vimos assim três cenários interessantes de processamento distribuído na plataforma Microsoft:

1. Paralelismo via HPC
2. Paralelismo via private cloud, com o Dynamic Data Center Toolkit
3. Paralelismo via public cloud, com a plataforma Windows Azure

Faça uma avaliação de seus cenários e veja se você não tem uma oportunidade de paralelismo com essas opções. Fique atento!

Por enquanto é só! Até o próximo post :)

Waldemir.