Pergunta

Em uma das respostas Transmita como UDP com a confiabilidade do TCP, um usuário menciona o Espalhar API de mensagens.Eu também encontrei um chamado ØMQ.Eu também tenho alguma familiaridade com MPI.

Então, minha pergunta principal é:por que eu escolheria um em vez do outro?Mais especificamente, por que eu escolheria usar Spread ou ØMQ quando há implementações maduras de MPI disponíveis?

Foi útil?

Solução

MPI foi projetado em clusters de computação fortemente acoplados com redes rápidas e confiáveis.Spread e ØMQ são projetados para grandes sistemas distribuídos.Se você estiver projetando um aplicativo científico paralelo, opte pelo MPI, mas se estiver projetando um sistema distribuído persistente que precisa ser resiliente a falhas e instabilidade da rede, use um dos outros.

O MPI possui recursos muito limitados para tolerância a falhas;o comportamento padrão de tratamento de erros na maioria das implementações é uma falha em todo o sistema.Além disso, a semântica do MPI exige que todas as mensagens enviadas sejam eventualmente consumidas.Isto faz muito sentido para simulações em um cluster, mas não para uma aplicação distribuída.

Outras dicas

Não usei nenhuma dessas bibliotecas, mas posso dar algumas dicas.

  1. MPI é um protocolo de comunicação enquanto Spread e ØMQ são implementações reais.
  2. MPI vem da programação “paralela”, enquanto Spread vem da programação “distribuída”.

Então, realmente depende se você está tentando construir um sistema paralelo ou um sistema distribuído.Eles estão relacionados entre si, mas as conotações/objetivos implícitos são diferentes.A programação paralela trata do aumento do poder computacional usando vários computadores simultaneamente.A programação distribuída lida com grupos de computadores confiáveis ​​(consistentes, tolerantes a falhas e altamente disponíveis).

O conceito de “confiabilidade” é ligeiramente diferente daquele do TCP.A confiabilidade do TCP é "dar este pacote ao programa final, não importa o quê". A confiabilidade da programação distribuída é "mesmo que algumas máquinas morram, o sistema como um todo continua a trabalhar de maneira consistente". Para realmente garantir que todos os participantes receberam a mensagem, seria necessário algo como Confirmação de 2 fases ou uma das alternativas mais rápidas.

Você está abordando APIs muito diferentes aqui, com noções diferentes sobre o tipo de serviços fornecidos e a infraestrutura de cada uma delas.Não sei o suficiente sobre MPI e Spread para responder por eles, mas posso ajudar um pouco mais com ZeroMQ.

ZeroMQ é uma biblioteca simples de comunicação de mensagens.Ele nada mais faz do que enviar uma mensagem para diferentes pares (incluindo locais) com base em um conjunto restrito de padrões de mensagens comuns (PUSH/PULL, REQUEST/REPLY, PUB/SUB, etc.).Ele lida com a conexão do cliente, a recuperação e o congestionamento básico estritamente com base nesses padrões e você mesmo deve fazer o resto.

Embora pareça muito restrito, esse comportamento simples é principalmente o que você precisa para a camada de comunicação da sua aplicação.Ele permite escalar rapidamente desde um protótipo simples, todo na memória, até aplicativos distribuídos mais complexos em vários ambientes, usando proxies e gateways simples entre nós.No entanto, não espere que ele faça implantação de nós, descoberta de rede ou monitoramento de servidor;Você terá que fazer isso sozinho.

Resumidamente, use zeromq se você tiver um aplicativo que deseja escalar do simples processo multithread para um ambiente distribuído e variável, ou se deseja experimentar e prototipar rapidamente e nenhuma solução parece se adequar ao seu modelo.No entanto, espere ter que fazer algum esforço na implantação e monitoramento de sua rede se quiser escalar para um cluster muito grande.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top