Pergunta

Temos um sistema de software de alto desempenho grande que consiste em vários processos Java interagindo (não EJBs). Cada processo pode ser na mesma máquina ou de uma outra máquina.

Alguns eventos são gerados em um processo, e depois são propagadas em maneiras diferentes de outros processos para posterior processamento e assim por diante.

Para fins de aferição, é preciso criar um registro de quando cada evento passado através de um "checkpoint", eventualmente, combinar esses logs para obter um cronograma de como cada evento propagado através do sistema e com o que a latência (claro, comutação de processos e IPC acrescenta latência, que é ok).

O problema, naturalmente, é a sincronização do relógio. Então, aqui estão minhas perguntas:

1) Se todos os processos estão na mesma máquina, não é garantido que currentTimeMilis seria preciso no momento da chamada? Existe alguma ligada sobre os erros de ITP?

2) Se alguns processos podem estar em diferentes máquinas, existe uma solução off-the-shelf (que também é livre ou open-source) para sincronização do relógio? Estou preferência à procura de uma solução que pode ignorar o sistema operacional (Windows ou Linux) e trabalho em linha reta de Java. Também estou procurando idealmente algo que pode operar com precisão microssegundo. Eu pensei sobre NTP, mas eu não tenho certeza se ele está disponível através de Java e não através do sistema operacional, e eu não estou certo sobre a sua complexidade.

3) Existe uma maneira de determinar a margem de erro em usar NTP em uma configuração particular (ou de qualquer solução que eu acabar usando) para que eu possa dar uma margem de erro em nosso cálculo da latência?

Obrigado!

Foi útil?

Solução

Com a programação distribuída, sincronização do relógio muitas vezes não é suficiente. você pode querer construir um quadro tempo lógico (como o Lamport ou relógios vetoriais ou métodos Singhal-Kshemkalyani ... e há cargas mais a causalidade manter em sincronia através das máquinas). Qual você escolhe muitas vezes depende da aplicação e exigiu causalidade entre eventos.

Os relógios são sincronizado para garantir eventos simultâneos são mantidos na ordem seqüencial direita. Há outras maneiras de fazer isso do que manter o relógio do sistema sincronizado ... que, a menos que eles compartilham um relógio físico comum ... é bastante complicado.

Em termos de margem de erro NTP, existem soluções:

minha recomendação:

Leia: Distributed Computing: Princípios, Algoritmos e Sistemas

Especialmente: Capítulo 3, tempo lógico

Editar

Além post de Cheeso, achei

http://www.uniforum.org/publications/ufm/apr96 /opengroup.html

http://sourceforge.net/projects/freedce

Há talvez ligações DCE Java lá fora.

Outras dicas

Eu realmente só usar NTP. É muito preciso, mesmo através da internet, e em uma LAN deve ser ainda melhor. Segundo a Wikipedia [ 1 ],

NTPv4 geralmente pode manter a tempo para dentro de 10 milissegundos (1/100 s) através da Internet pública, e pode atingir precisões de 200 microssegundos (1/5000 s) ou superior em redes de área local em condições ideais.

por isso pode ser bom o suficiente para suas necessidades, se suas condições são "ideal" o suficiente. NTP tem sido em torno de tempo suficiente para que quase tudo funciona com ele. Não vejo qualquer razão para fazer isso através de Java em vez do sistema operacional. Se o OS é sincronizado, então será Java.

[1] Wikipedia: Network Time Protocol

Eu encontrei esta discussão depois de tentar algo por conta própria (deveria ter procurado em primeiro lugar!) http://snippets.dzone.com/posts/show/11345 - pode ser um método bom, pode ser ruim, mas é distribuída (sem servidor) que é bom.

O velho DCE ( "Distributed Computing Environment") costumava ter uma sincronia de tempo distribuída solução, com todas essas capacidades. Foi chamado DTS. O administrador pode configurar o conjunto de máquinas para sincronização e a latência ou incerteza foi calculado e disponível. Se qualquer máquina tem fora de sincronia, é relógio foi ajustado lentamente até que ela estava em sincronia novamente. Houve uma garantia de que o tempo em qualquer máquina jamais ser ajustado para trás (em violação da física básica). A rede necessária pelo menos uma entrada de NTP a fim de permanecer sincronizado com o "mundo real".

Eu não sei o que aconteceu com essas coisas o tempo de sincronização, ou o código do DCE em geral.

Parece-me que você não precisa de uma solução "em Java". Você precisa sincronizar os relógios de um conjunto de máquinas distribuídas. O aplicativo Java é apenas a coisa que é executado nas máquinas.

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