Pergunta

Eu estou olhando para escrever uma sincronização simples habilidade no meu app e uma das preocupações que tem aparecido é a sincronização de tempo entre dois computadores remotos, cada um com o seu próprio relógio (em particular no que respeita a datas de modificação dos arquivos/objetos).

Tenho a certeza que muitas pesquisas têm sido realizadas sobre este tema, e não quer ficar muito teórico, mas eu estou querendo saber se há alguma aceite as melhores práticas para minimizar temporal discrepâncias entre o controlo remoto relógios?

Por exemplo, começar é sempre usar o tempo universal (UTC), como que evita problemas de fuso horário, mas não há nenhuma garantia de que dois computadores terão exatamente a mesma hora do sistema.Felizmente, o trabalho que eu estou fazendo não é muito refinado, então não é um lugar muito importante preocupação, mas eu ainda estou curioso, no entanto.

Uma solução seria usar sempre o mesmo relógio em ambas as extremidades, como um tempo global do servidor, em vez de o relógio do sistema local.Presumivelmente, este (combinado com recurso compartilhado bloqueios) poderia garantir a não acidental sobreposição de horário sincronizado, mas não é muito prático.

Um pensamento que apenas surgiu na minha cabeça seria sincronizar a cada nó (cada cliente) com um deslocamento calculado em algum ponto antes, talvez por calcular o deslocamento do relógio do sistema com um tempo global do servidor.Isso só precisa ser feito, ocasionalmente, como o deslocamento em si não tende a mudar bastante ao longo de um curto período de tempo.

Atualização: Deixe-me apenas acrescentar que eu não estou interessado em realmente sincronizar os relógios do sistema de dois computadores--eu vou presumir que o sistema operacional irá lidar com isso, na maioria dos casos.Esta é apenas uma questão de como assegurar-se de duas instâncias de um aplicativo estiver usando sincronizado vezes, apesar de neste dia e idade, eu suponho que os relógios do sistema seria quase certamente ser sincronizados para dentro de algumas pequenas delta de qualquer maneira.

Foi útil?

Solução

Contar com o NTP para o seu aplicativo, pois os outros recomendaram é o Fudge Easy. A abordagem correta é usar o algoritmo de sincronização de relógio distribuído de Lamport. É explicado em seu artigo clássico de 1978 Tempo, relógios e a ordem dos eventos em um sistema distribuído.

Outras dicas

Olhe para "Protocolo de tempo de rede"Especificação (NTP).

Você pode experimentar o PTP, o Protocolo de Tempo de Precisão (PTP) é um protocolo usado para sincronizar relógios em toda a rede de computadores. Em uma rede local, ele atinge a precisão do relógio na faixa de sub-microssegundos, tornando-o adequado para sistemas de medição e controle.http://en.wikipedia.org/wiki/precision_time_protocol

Em vez de escrever código para sincronizar os relógios, não seria possível executar um cliente NTP em ambas as máquinas?

Como alternativa, se o acima não for possível e seu aplicativo estiver executando com privilégios suficientes para definir o tempo, eu ficaria tentado a implementar um cliente NTP mínimo no aplicativo e tentar sincroná -lo com um servidor público. Só não codifique o servidor privado de alguém em ...

Sincronize -os com Ntp Protocolo de tempo de rede.

Em que plataforma você está?

Com o NTP, você pode sincronizar o tempo de seus computadores com relógios atômicos e usar o tempo oficial do mundo.

Atualmente, esse é um problema que preciso resolver em relação a usuários finais não sofisticados que podem fazer muitas coisas para perturbar as sugestões sensatas feitas pelos colaboradores anteriores. Um usuário final não sofisticado pode fazer pelo menos essas coisas e mais:

1) Não tem conhecimento de computação suficiente para poder configurar a sincronização do tempo NTP

2) Defina o relógio de tempo do computador para um relógio de casa ou relógio de telefone celular que está incorreto

3) No Windows XP, desative acidentalmente a sincronização do tempo do NTP e não sabe como habilitá -lo novamente ou ter a data do computador definida erroneamente; nesse caso, o Windows NTP não funciona

4) A bateria do BIOS do computador ficou plana, então o PC sempre começa em 1970!

5) O usuário leva seu laptop no exterior e define temporariamente o relógio do laptop para a hora local, mas não muda o fuso horário, então agora o PC retornará o tempo incorreto do UTC !!!

Portanto, seu próprio programa terá que gerenciar o tempo e, é claro, você deseja fazer isso com o mínimo de sobrecarga.

Vamos supor que dois usuários finais que executam seus programas precisam dos programas para fazer algo no mesmo tempo absoluto no futuro.

Proponho esse esquema, que leva algumas idéias da maneira como os trabalhos de Cron funcionam, ficaria feliz se alguém pudesse sugerir melhorias na idéia.

1) Quando o seu aplicativo é iniciado, ele sincroniza seu próprio tempo interno do UTC ao NTP por meio de uma chamada SOAP para um servidor de terceiros ou com o seu próprio servidor de tempo (que você pode manter a tempo com o NTP).

2) Depois disso, adiciona tempo decorrido do relógio do sistema para manter o tempo. Se os requisitos forem rigorosos, pode ser necessário repetir a sincronização do NTP em intervalos.

3) O aplicativo analisa uma lista de trabalhos futuros que precisa fazer no prazo. Precisa saber o trabalho mais antigo.

4) Em seguida, cria um fio que ele coloca para dormir pelo tempo antes do emprego mais antigo, menos uma margem de segurança, que, dependendo dos seus requisitos, pode ter 10 minutos de antecedência, uma ou duas horas com antecedência etc.

5) Quando o fio acorda, ele verifica o tempo absoluto com mais uma chamada de sabão e depende do relógio de tempo do sistema para adicionar o tempo decorrido até chegar ao tempo em que o primeiro trabalho deve ser realizado.

6) Assim que o trabalho for acionado (execute-o em outro thread), o thread de monitoramento do tempo calcula o próximo tempo de tarefa à frente e se coloca para dormir novamente durante o período.

Aprimoramentos para a ideia:

1) Um usuário pode fechar o seu aplicativo antes do trabalho devido, portanto, você pode precisar de um processo ou serviço em segundo plano, que usa o mesmo esquema de sincronização acima, para monitorar independentemente suas listas de empregos, armazenado em um banco de dados ou arquivo e iniciar o aplicação no tempo. (No Windows, gera o processo de aplicação)

2) Seu aplicativo pode estar adicionando trabalhos mais novos e anteriores em tempo real ou excluindo trabalhos, para que seu tópico para dormir provavelmente precisará ser inútil para recalcular o novo trabalho anterior ou para o trabalho após o trabalho excluído. No Win32, você faria isso pelo seu tópico esperando com o tempo limite em um evento, que você configura para forçá -lo a recalcular o tempo de sono. No Linux, sem dúvida, existe um mecanismo semelhante.

3) Para que a chamada de sabão obtenha o tempo, mantenha uma nota de quando o sabão é enviado e quando a resposta é recebida. Se o tempo de resposta for muito longo, você não poderá confiar no tempo e pode precisar repetir a chamada, ou poderá se comprometer. Por exemplo, se o sabão disser que o relógio do computador está 5 minutos rápido, mas a chamada de sabão levou um minuto para responder, você só pode dizer com certeza que o relógio do computador está pelo menos 4 minutos rápido.

Uma coisa que temos a fazer é, essencialmente, o descarregamento de todos os intervalos de operações para o "host" da máquina.Por exemplo, se você tem de 20 servidores que compartilham um banco de dados, use o banco de dados de tempo.Se você tiver um servidor central e um milhão de máquinas de cliente e, em seguida, as máquinas cliente não deve ser responsável pela temporização nada;faça todos os seus sincronização do lado do servidor.Em um verdadeiro "distribuída" meio ambiente, como uma rede P2P ou algo do tipo, utilize a máquina que mais diretamente "possui" o recurso em questão (o real no PC o arquivo que você deseja gravar) para sincronizar/controle de acesso ao arquivo.

Qualquer máquina em rede deve usar o NTP. Todos os sistemas modernos incluem uma maneira fácil de configurar isso. O único problema deve ser escolher um servidor específico, se você precisar de um pouco de precisão extra; Mas já está na faixa de milissegundos, então eu não me importo e geralmente aponto para pool.ntp.org

Não use NTP. O NTP é para obter apenas data/hora.

Ele trabalha para sincronizar eventos entre aplicativos que não se comunicam. Um aplicativo de alarme e seu corpo, por exemplo.

Para aplicativos que possuem comunicação direta, compartilhando um recurso, use relógios Lamport ou relógios vetoriais, como disse Diomidis. Os relógios Lamport funcionam muito bem para alcançar uma ordem parcial entre os eventos, os relógios vetoriais são ótimos quando você precisa identificar eventos simultâneos.

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