/ / algoritmo para distribuição uniforme de valores para todos os processos - algoritmo, design, agnóstico de linguagem, distribuído

Algoritmo para distribuição uniforme de valores para todos os processos - algoritmo, design, agnóstico de linguagem, distribuição

Eu tenho que escrever um sistema distribuído com quatroprocessos em execução em quatro nós diferentes. O sistema distribuído deve funcionar da seguinte maneira: um gerador de números aleatórios gera um número aleatório em cada processo. O objetivo é uniformizar esses valores em todos os processos, passando mensagens entre processos. Tal processo A é o servidor que obtém os números de todos os processos e, em seguida, ordena que enviem uma parte de seu número para um ou mais processos, a fim de uniformizar todos os números que o processo contém. Por exemplo, a contagem de A é 30, a contagem de B é 65, a contagem de C é 35 e a contagem de D é 70. A calcula 30 + 65 + 35 + 70 = 200 dividido por 4 = 50. Agora processe A , o servidor, sabe quem tem menos que a média e quem tem mais que a média. Agora, a questão é como A decide quem envia qual número para quem? para nivelar os valores de todos os processos. por favor note que A não pode instruir diretamente um processo para decrementar ou incrementar sua contagem, por exemplo, ele não pode enviar uma mensagem para B e dizer para decrementar por 15 e então enviar outra mensagem para C e dizer para incrementar por 15. A deve enviar uma mensagem para B que irá dizer a B para decrementar por 15 e então enviar uma mensagem para C e dizer para incrementar por 15 ou em outras palavras, dizer a B para enviar 15 de sua contagem para C. Agradecemos antecipadamente. Zaki

Respostas:

0 para resposta № 1

O problema que você descreve é ​​conhecido como agregação distribuída. Existem várias soluções adequadas paradiferentes suposições na rede (quais nós estão conectados? mensagens podem ser perdidas?), a função para calcular (média? soma?) e assim por diante. Uma boa visão geral, com referências a algoritmos que você pode usar, pode ser encontrada em http://arxiv.org/abs/1110.0725.


1 para resposta № 2

Pois o que eu sei não é específico receita ou apenas definir bem o padrão para implementar taissistema distribuído (também se houver material que forneça diretrizes sobre argumentos, veja o link no final da questão). Aqui estão envolvidos várias opções que moldarão o sistema final, sua escalabilidade, como será responsivo, como será sólido, etc.

Você marcou a pergunta como agnóstica de idioma. Estou convencido de que bons conceitos contam mais do que tecnologias, mas no final a escolha deve ser feita e um sistema como esse é complexo demais para ser construído com uma linguagem que você não é mais do que familiar.

Eu construí-lo com c # porque é minha língua primária de desenvolvimento, procedendo com técnicas orientadas para desenvolvimento ágil.

  1. Primeiro eu vou tentar esboçar um projeto de macro-arquitetura, destacando os atores envolvidos e sua responsabilidade (mas sem entrar em muitos detalhes).
  2. Então eu vou tentar codificar um primeiro protótipo simples isso envolve dois nós.
  3. Quando o protótipo funcionar, vou tentar encontrar pontos fracos e deixe trabalhar com quatro nós.
  4. Se houver problemas, repita o último ponto até satisfazer os requisitos.

Indo muito em detalhes, você pode construí-lo mesmo usando soquetes crus; mas para simplificar, sugiro que você encontrou o seu sistema em Protocolo HTTP (por exemplo, usando o .NET BCL HttpListener e HttpClient componentes como base) para comunicação:

  1. Um conjunto predefinido de GET mensagem pode realizar a sincronização entre os servidores de mesmo nível.
  2. POST mensagem pode ser usada para trocar dados em números aleatórios.

Sobre a geração do número, abre um mundo completamente novo. Eu confiaria em um serviço externo como Servidor aleatório ANU Quantum (se você puder contar uma conexão ativa com a Internet). Eu sei que você afirmou que você tem um algoritmo para implementar, eu forneci isso como uma alternativa (eu não sei se esta parte pode ser alterada ou não).

Pelo menos, eu sugiro que você leia Este artigo e também esta sobre pessoa para pessoa se você usar o .NET framework.