Por ser uma plataforma compatível com o modelo Hash, a HPC Shelf define um conjunto de espécies de componentes apropriadas para construção de sistemas de computação paralela de interesse de suas aplicações. São eles:
(a) Solution Components (b) Application and Workflow Figura 23 – Arquitetura de um Sistema de Computação Paralela MapReduce
buída e homogêneas, ou seja, constituídas de um conjunto de unidades de processamento de mesmas características;
• Computações: representam algoritmos de computação paralela capazes de explorar o desempenho de plataformas virtuais, ou seja, possivelmente tomando vantagem de suas características particulares, tais como a presença de aceleradores, múltiplos núcleos de processamento, hierarquias de memória, etc;
• Fontes de dados: representam grandes bases de dados, estruturadas ou não estruturadas, de interesse de componentes de computação;
• Conectores: conectam um conjunto de componentes de computação e fontes de dados, podendo atuar com diferentes finalidades, tais como a orquestração de componentes de computação, meio para coreografia entre esses componentes, acesso eficiente a dados, etc; • Bindings de Serviços: Conectam componentes das espécies anteriores entre si através de interfaces de serviços, no modelo cliente-servidor, geralmente associados a interesses não funcionais;
• Bindings de Ações: Conectam componentes das espécies anteriores entre si por meio de interfaces par-a-par, através das quais sincronizam ações de computação, governando o fluxo de execução dos sistemas de computação paralela (interesses funcionais).
A Figura 23(a) apresenta o esquema arquitetural de um sistema de computação paralela destinado a executar uma computação MapReduce, composto de duas fontes de dados, de entrada e de saída, chamadas Source e Sink; quatro componentes de computação, sendo dois
empregados para executar operações de mapeamento (Mapper) e outros dois responsáveis por operações de redução (Reducer); dois conectores, chamados Splitter e Shuffler; e duas plata- formas virtuais (anônimas na figura), de modo que cada uma hospedará um par de componentes, um de mapeamento e outro de redução. Ligando esses componentes, há um conjunto de bindings de serviços.
Na Figura 23(b), são incluídos dois componentes especiais que devem aparecer em sistemas de computação paralela, chamados Application e Workflow. O primeiro serve para comunicação da aplicação, executando sobre o SAFe, com os demais componentes, ditos componentes de solução, enquanto o último executará a orquestração do sistema de computação paralela, através do conjunto de bindings de ações que o liga aos componentes de computação. Conectores são constituídos de um conjunto de facetas, instanciadas, cada qual, sobre as plataformas virtuais onde encontram-se os componentes de computação e fontes de dados que conectam. Na Figura 23, as facetas dos componentes Shuffler e Splitter são delimitadas pelas linhas tracejadas. Cada faceta instancia um certo subconjunto de unidades do conector. Dessa forma, os bindings de serviços e de ações entre computações/fontes de dados e conectores são diretos, não exigindo comunicação entre plataformas virtuais dispostas em domínios diferentes. Isso torna possível que conectores encapsulem formas mais eficientes de sincronização e comunicação entre computações e fontes de dados geograficamente dispersos, evitando tais preocupações na tarefa de desenvolvimento desses componentes.
Bindings, por também serem distribuídos entre as plataformas virtuais onde encontram- se os componentes que conectam, podem ser vistos como formas especiais de conectores, muito embora apresentando características distintas. Para o suporte a bindings, os componentes co- nectados através deles devem possuir portas compatíveis. No caso de bindings de serviços, há um componente dito provedor, o qual deve possuir uma porta provedora, e um componente dito usuário, o qual deve possuir uma porta usuária. Se um par de portas, usuária e provedora, possuem o mesmo serviço (interface de operações) podem ser conectadas, formando um binding de serviço. Dessa forma, chamadas realizadas pelo componente usuário através de sua porta usuária são atendidas pelo componente provedor através de sua porta provedora, de forma que o componente binding é responsável por intermediar a comunicação, seja ela direta ou indireta. Por sua vez, no caso de bindings de ações, um conjunto de componentes parceiros possuem portas que exportam o mesmo conjunto de nomes de ações podem ligá-las a fim de formar um binding de ações. Diz-se que uma ação é ativada quando todos os componentes parceiros
ativam um mesmo nome de ação na porta de ações. A ativação de uma ação em um determinado componente parceiro pode disparar uma computação ou comunicação dentro dele. Dessa forma, componentes podem sincronizar operações de computação, definindo um workflow.
É importante salientar que tais bindings são do tipo M ×N (paralelos) (JACOB et al., 2005; ZHANG; PARASHAR, 2006; DAMEVSKI et al., 2007), como consequência natural do próprio caráter paralelo dos componentes Hash. Tanto do lado provedor quando do lado usuário de um binding de serviço, assim como nos diversos lados parceiros de um binding de ações, pode haver um conjunto de unidades paralelas, as quais realizam invocações de serviços, atendimentos a serviços e ativação de ações de forma paralela e cooperativa. Porém, uma vez que os bindings encapsulam a lógica de troca de mensagens entre os lados envolvidos na comunicação, formas otimizadas de comunicação, no caso de bindings indiretos, podem ser aplicadas em casos mais simples, quando, por exemplo, há um provedor sequencial (única unidade), um usuário sequencial, apenas um par de componentes parceiros, um dos quais sequencial, etc.