Olá pessoal, tudo certo?
Uma questão que surge com uma certa frequência é o sobre o uso de modelos de distribuição de processos e paralelismo em cenários de cálculos intensos. São cenários que podem aproveitar a disponibilidade crescente de processamento e recursos computacionais, antes mais caros.
Diversas áreas possuem necessidades como essas, em áreas como biologia, geologia, meteorologia, simulações infanceiras, entre outras. Talvez os exemplos mais próximos estejam no setor financeiro, como na análise de risco de carteiras em grandes bancos. Imagine a quantidade de dados que um banco de varejo manipula diariamente. Qual é a exposição do banco ao risco do mercado? Esse tipo de cálculo envolve funções de análise de risco e simulações para cada tipo de produto da carteira, como CDB’s, CDI’s, SWAPs, Renda Fixa, Renda Variável, etc. E esse mesmo cálculo precisa ser executado durante uma janela de tempo na madrugada do dia em que o risco será usado, durante o próximo pregão e operação do banco. Bacana não? 🙂
Assim, existem diversos cenários onde patterns como Map Reduce, por exemplo, se aplicam de forma natural, ajudando no processamento dessas grandes massas de dados com maior velocidade e agilidade para o negócio. Falando um pouco sobre Map Reduce, esse pattern é um velho conhecido do mercado.
E o que faz o Map Reduce? A idéia básica é termos um processo master que divide uma massa de dados de entrada para processamento entre diversos workers (ou nós computacionais), que executam a tarefa programada em blocos particionados. Dessa forma, distribuimos o processamento inicial entre diversos nós de computação, gerando um paralelismo na solução. Processamento distribuido de fato. Ao final, os vários resultados são devolvidos para o master, que realiza a consolidação final. Simples não?
Bom, já que estamos falando sobre distribuição de processos e paralelismo, vale relembrar alguns conceitos antes de continuarmos. Podemos definir um sistema de processamento distribuído ou paralelo como um sistema que conecta vários nós de processamento de maneira que um processo de grande consumo (como uma massa de dados para tratamento) seja executado no nó “mais disponível” ou mesmo subdividido entre vários nós. Desta forma, conseguimos um ganho no tempo de execução na tarefa original, através dessa distribuição entre vários nós computacionais.
Podemos ainda definir que para um sistema ser de processamento distribuído, uma ou várias unidades de processamento estão separadas fisicamente, em máquinas diversas, não sendo necessário que todas as máquinas possuam a mesma configuração.
Para um sistema ser de processamento paralelo, todas as unidades de processamento se encontram na mesma máquina, aproveitando eventualmente os diversos núcleos presentes nesta máquina. Em ambos os casos, esses sistemas são capazes de processamento paralelo, sendo que qualquer um deles pode ser visto como um elemento de um sistema distribuído.
Seja para a programação paralela ou para a distribuição de processos, a implementação desses tipos de patterns não é trivial e exige alguns cuidados quando falamos de cenários mais complexos. Algumas preocupações estão relacionados ao tipo de dado para processamento, relação de dependência entre os blocos, necessidade de consultas a bases de dados externas, etc.
Focando a distribuição de processos, podemos usar algumas opções de distribuição de processamento na plataforma Microsoft, por exemplo. Vejamos 3 cenários disponíveis:
Cenário 1) HPC – High Performance Computing
Uma primeira opção que destaco é o HPC – High Performance Computing, que oferece um motor para 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 acesso a bancos de dados remotos envolvidos na solução, Job Scheduling (um recurso importante para alguns cenários), etc.
Para um cenário simples de aplicação do Microsoft HPC, temos uma rede privada com os vários nós de computação (Compute Node) que serão os workers para o processamento distribuído. Esses nós são coordenados pelo WCF Broker Node, que realiza o papel de Master no modelo Map Reduce. Temos ainda um cluster de SQL Server, suportando dados remotos que serão usados no processamento e demais componentes de uma infraestrutura de rede, como AD, File Server, Monitoração, Mail Server, etc.
É uma solução bem aplicável para diversas empresas e vale muito ser estudado!
Para saber mais sobre HPC na plataforma Microsoft, confira:
Ref.: http://www.microsoft.com/hpc/en/us/default.aspx
Cenário 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. Nesse tipo de solução, aplicamos os benefícios do provisionamento elástico sobre a infraestrutura já disponível na empresa, aproveitando investimento passados em máquinas e recursos computacionais. Oferecer uma solução de provisionamento dinâmico para os departamentos de uma empresa é uma solução interessante para grandes corporações com datacenters próprios, por exemplo.
Veja ainda o post abaixo, do time de produto falando sobre a solução DDCT/E para o mundo Enterprise:
Para saber mais sobre Dynamic Data Center Toolkit e private cloud, confira o link abaixo:
Microsoft Private Cloud Computing Infrastructure
Ref.: http://www.microsoft.com/virtualization/en/us/private-cloud.aspx
Cenário 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: 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.
Vimos assim três cenários interessantes de processamento distribuído na plataforma Microsoft:
1. Via HPC – High Performance Computing
2. via private cloud, com o Dynamic Data Center Toolkit
3. via public cloud, com a plataforma Windows Azure
Para terminar, vale lembrar que a programação paralela é um caminho a parte, que envolve outros elementos de programação como sincronização, extensão para paralelismo em linguagens, estruturas distribuídas em memória, entre outros. Um belo universo com excelentes resultados.
Faça uma avaliação de seus cenários e veja se você não tem oportunidades de paralelismo e distribuição de processos em suas soluções. Fique atento e aproveite o que o mercado já oferece!
Um abraço!
Waldemir Cambiucci
Blog: http://blogs.msdn.com/wcamb/
Twitter: http://twitter.com/wcamb/