Pergunta

Eu tenho um doozy de um problema aqui. Eu estou com o objetivo de construir uma estrutura para permitir a integração de diferentes modelos de simulação de tráfego. Esta integração é baseada na partilha de conectividades da ligação, os custos de link e veículos entre simulações.

Para fazer uma simulação distribuída, eu pretendo ter um 'coordenador' (topologia em estrela). Todas as simulações participantes só se inscrever com ele, e falar apenas para o coordenador. O coordenador seguida, coordena a execução de várias tarefas entre cada simulação.

Um rápido exemplo de um problema de distribuição, é quando uma simulação é 'responsável' de certos objetos, como uma estrada. E outro é 'responsável' de outras estradas. No entanto, estas estradas são interligados (e, portanto, precisamos de sincronização entre estas simulações, e necessidade de ser capaz de trocar dados / invocar métodos remotamente).

Eu tive uma olhada RMI e estou pensando que pode ser adequado para esta tarefa. (Para sair abstrato ter que criar uma disciplina sobre fios de sinalização).

É este o são? A questão aqui, é que a simulação participantes necessidade de centralizar alguns de armazenamento de dados no 'coordenador' para garantir a sincronização explícita entre simulações. Além disso, algumas simulações podem requerer componentes ou métodos de outros simulações. (Daí a ideia de usar RMI).

A minha abordagem básica é ter o 'coordenador' executar um registro gigante RMI. E cada simulação simplesmente olha-se tudo no registro, garantindo que os objetos corretos são utilizados em cada etapa.

Alguém tem alguma dica para ir por esse caminho?

Foi útil?

Solução

Você pode querer verificar para fora Hazelcast também. Hazelcast é uma transacional de código aberto, distribuída / implementação particionado de fila, tópico, mapa, conjunto, lista, bloqueio e serviço executor. É super fácil de trabalhar; basta adicionar hazelcast.jar em seu classpath e iniciar a codificação. É necessário quase nenhuma configuração.

Se você estiver interessado em executar o seu Runnable, tarefas resgatáveis ??em uma forma distribuída, então confira distribuída documentação Executor Serviço a http://code.google.com/docreader/#p=hazelcast

Hazelcast é lançado sob a licença Apache e suporte classe empresarial também está disponível.

Outras dicas

É este o são? IMHO não. E eu vou dizer porquê. Mas primeiro eu vou adicionar o aviso de que este é um tema complicado assim qualquer resposta tem que ser visto como apenas arranhando a superfície.

Em primeiro lugar, em vez de me repetir Eu vou indicar você para um resumo de grade Java / tecnologias de cluster que eu escrevi há algum tempo atrás. Seu uma lista quase completa.

A topologia em estrela é a implementação "natural" para um "ingênuo" (Eu não quero dizer que de uma forma ruim) porque o ponto-a-ponto é simples e centralizar a lógica chave controlador também é simples. No entanto, não é tolerante a falhas. Ele apresenta problemas de escalabilidade e um único gargalo. Ele introduz ineficiências comunicação (ou seja, os pontos se comunicam através de um processo de duas etapas através do centro).

O que você realmente quer para isso é provavelmente um cluster (em vez de uma grade de dados / computação) solução e eu sugiro que você olhar para Terracotta . Idealmente, você olharia para Oracle Coherence mas é, sem dúvida, caro ( em comparação com livre). É um produto fantástico embora.

Estes dois produtos podem ser usados ??de várias maneiras, mas o núcleo de ambos é para tratar um cache como um mapa distribuído. Você colocar as coisas em, você levar as coisas fora e você disparar código que altera o cache. Coerência (com o qual estou mais familiarizado) nesta matéria escalas fantasticamente bem. Estes são mais "servidor" produtos à base embora para um verdadeiro cluster.

Se você está olhando para um modelo mais distribuído, então talvez você deve estar olhando para mais de uma abordagem baseada em SOA.

Tenha um olhar em http://www.terracotta.org/

é um distribuída Java VM, por isso tem a vantagem de ser agrupado aplicativo não parece diferente do que uma aplicação Java padrão.

Eu usei-o em aplicações ea velocidade é muito impressionante até agora.

Paul

Você considerou usando uma abordagem fila de mensagens? Você poderia usar JMS para se comunicar / coordenar tarefas e resultados entre um conjunto de servidores / os nós. Você poderia até usar SQS do Amazon (Simple Queue Service: aws.amazon.com/sqs). E ter os seus servidores em execução no EC2 para permitir que você dimensione cima e para baixo, conforme necessário

Apenas meus 2 centavos.

Dê uma olhada JINI, que poderia ser de alguma utilidade para você.

Bem, Jini, ou mais especificamente JavaSpaces é um bom lugar para começar por uma abordagem simples para o problema. JavaSpaces permite implementar um modelo mestre de trabalho, onde o seu mestre (coordenador no seu caso) escreve tarefas ao Javaspace, ea consulta dos trabalhadores para e processar essas tarefas, escrever os resultados de volta para o mestre. Desde que seu problema não é embaraçosamente paralelo, e seus trabalhadores necessidade de sincronizar / troca de dados, isto irá adicionar alguma complexidade para a sua solução.

Usando JavaSpaces vai acrescentar muito mais abstração para sua implementação que usando RMI simples (que é usado pela estrutura Jini internamente como o "protocolo wire" padrão).

Tenha um olhar neste artigo de sol por uma intro.

Jini Tutorial de Jan Newmarch é um bom lugar bastante para começar a aprender Jini

Assim como um complemento para as outras respostas que, tanto quanto eu vi todo o foco na grade e computação em nuvem, você deve perceber que modelos de simulação têm uma característica única: tempo de simulação.

Ao executar modelos de simulação distribuídos em paralelo e sincronizado então eu vejo duas opções:

  • Quando cada modelo de simulação tem sua própria lista relógio de simulação e de eventos, em seguida, estes devem ser sincronizados através da rede.
  • Em alternativa poderia haver um relógio de simulação única e lista de eventos que irá "marcam o tempo" para todos os modelos distribuídos (sub).

A primeira opção tem sido extensivamente pesquisado para a Arquitetura de Alto Nível (HLA) ver, por exemplo http: / /en.wikipedia.org/wiki/IEEE_1516 como titular.

No entanto, a segunda opção parece mais simples e com menos sobrecarga para mim.

GridGain é uma boa alternativa. Eles têm um mapa / reduzir implementação com "suporte API direta para dividir e agregação" e "sessão tarefa distribuída". Você pode navegar seus exemplos e ver se alguns deles se encaixa com o seu necessidades.

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