Imagine um cenário da seguinte maneira: digamos que você tenha um computador central que gera muitos dados. Esses dados devem passar por algum processamento, que infelizmente leva mais tempo do que para gerar. Para que o processamento seja atualizado em tempo real, conectamos mais computadores escravos.
Além disso, devemos levar em conta a possibilidade de os escravos saírem da rede no meio do trabalho, além de serem adicionados escravos adicionais. O computador central deve garantir que todos os trabalhos sejam concluídos de maneira satisfatória e que os trabalhos descartados por um escravo sejam retransmitidos para outro.
A principal questão é: que abordagem devo usar para conseguir isso?
Mas talvez o seguinte me ajude a chegar a uma resposta: Existe um nome ou padrão de design para o que estou tentando fazer?
De que domínio do conhecimento eu preciso para atingir o objetivo de fazer com que esses computadores conversem entre si? (por exemplo, será suficiente um banco de dados, do qual tenho conhecimento, ou isso envolverá soquetes, dos quais ainda tenho conhecimento?)
Existem exemplos desse sistema? A questão principal é um pouco geral, por isso seria bom ter um ponto de partida / ponto de referência.
Observe que estou assumindo restrições de c ++ e windows para que as soluções que apontam nessa direção sejam apreciadas.
Respostas:
Sim. Esse padrão é conhecido como computação distribuída (ou programação distribuída ou qualquer palavra legal que você queira colocar após a distribuição). Minha sugestão será não criar isso internamente antes de procurar outras soluções. Você pode olhar para esta pergunta de estouro de pilha para várias opções. E então tome uma decisão calculada.
fonte
Conforme observado por outras respostas, esse campo é conhecido como computação distribuída , computação em grade , computação em cluster e computação de alto desempenho .
Deixe-me acrescentar a distinção de que, quando um sistema pode ser redimensionado após o início para corresponder à carga de trabalho, ele é considerado " elástico " e isso é diferente da computação em grade tradicional. Essa é uma das razões (não de marketing) para o termo " computação em nuvem ": o usuário não precisa planejar a capacidade, e o número e a localização das máquinas que executam a computação permanecem inexpressivos para ele como uma nuvem.
Além disso, o requisito de que o mestre reprograma as tarefas com falha é chamado de propriedade " tolerância a falhas " desse sistema. (Link obrigatório para este desenho animado )
Qual abordagem você deve usar para criar sua própria nuvem privada? Na minha ordem ou preferência:
Não construa sua própria nuvem , use a infraestrutura fornecida por outras pessoas. A Amazon chama isso de nuvem privada virtual ; a Rackspace é apenas nuvem privada ; Tenho certeza que você pode encontrar outras ofertas e comparar.
Não construa seu próprio mecanismo de computação distribuído , use o mecanismo fornecido por outras pessoas. Se você insistir em usar suas máquinas, use pelo menos o máximo de software possível, fornecido e testado por outras pessoas. Você pode usar o Hadoop a partir do C ++ através da interface Pipes ou de qualquer executável através da API de Streaming . Existe uma interface de Streaming semelhante no Spark .
Não codifique todos os componentes do zero , use componentes da comunidade. Se, por algum motivo, você leu até agora e deseja implementar seus próprios componentes na nuvem, não inicie na biblioteca padrão do C ++. Os principais componentes que você precisará são:
Existem muitas alternativas para ambos. Para filas, o RabbitMQ possui um instalador do Windows, assim como o ZeroMQ . Para sistemas de arquivos distribuídos, eu realmente não tenho experiência suficiente no Windows: parece que você pode organizar compartilhamentos SMB em um DFS , mas não posso dar nenhuma dica aqui. Você pode pensar, como observado em outra resposta, usar um banco de dados distribuído como o MongoDB para os dados; ele roda no Windows .
Você também pode pensar em usar o MPI (geralmente a implementação do OpenMPI , geralmente por meio do wrapper Boost ), mas observe que os programas MPI não são elásticos nem tolerantes a falhas; você precisa cuidar disso sozinho (pelo menos, eles fornecem alguns mecanismos para conseguir isso ). É por isso que eu recomendaria a você primeiro avaliar uma estrutura de distribuição que possua essas propriedades.
fonte