Pergunta

Preciso registrar independentemente os eventos em diferentes computadores e reconstruir quais ordenar esses eventos em relação um ao outro. A solução exige que cada computador seja relativamente independente; Eles não podem falar diretamente ou uma única fonte.

Minha solução inicial registrou a hora em cada máquina, mas como os tempos pode ser diferente em diferentes máquinas e pode mudar ao longo do dia, isso não resolveu completamente meu problema. Decidi compartilhar com todas as máquinas sempre que uma máquina (1) inicia o processo, ou (2) tem sua alteração no relógio do sistema.

Então, de cada máquina, eu recebo um tronco cheio deles

public class Activity {
    DateTime TimeOccurred { get; set; }
    string Description { get; set; }
}

Sempre que (1) ou (2) acontece acima, adiciono uma atividade ao log e a transmito para as outras máquinas, que adicionam a mesma atividade ao seu log, com o tempo traduzido sendo o seu próprio tempo:

public class TimeSynchronization : Activity {
    string SourceMachine { get; set; }
    DateTime TranslatedTime { get; set; }
}

Então a máquina a teria (em ordem):

TimeSynchronization "started" at 3:00 am.
Activity "asked a question" at 3:05 am.
TimeSynchronization from machine B at 3:05 am.
TimeSynchronization "clock changed" at 3:03 am.
Activity "received an answer" at 3:04 am.

E a máquina B teria (em ordem):

TimeSynchronization "started" at 3:05 am.
TimeSynchronization "clock changed" at 3:06

Então, preciso reconstruir a mesma ordem e o momento desses eventos acima, para algo como:

On machine A: TimeSynchronization "started" at 0:00
On machine A: Activity "asked a question" at 0:05
On machine B: TimeSynchronization "started" at 0:05
On machine A: TimeSychronization from machine B at 0:05
On machine A: TimeSynchronization "clock changed" at 0:06
On machine B: TimeSynchronization "clock changed" at 0:06
On machine A: Activity "received an answer" at 0:07

Qual é a melhor maneira de tomar um List<Activity> De cada máquina e mescla -a em uma lista com os eventos em ordem?

Foi útil?

Solução

Se as duas máquinas estiverem conectadas através da rede, seu programa poderá perguntar à outra máquina a que horas são. Dessa forma, seu programa na máquina A poderia pedir o tempo em A e B e depois registrar as duas vezes.

Você menciona que a hora pode mudar durante o dia (presumivelmente o usuário mudou a hora). Você pode detectar isso usando o evento Win32.Timechanged.

Outras dicas

Tempo atômico e um serviço da web que lhe daria. Isso é o que você precisa. Realista? Nenhuma idéia. Mas pelo menos você não precisaria se preocupar com os n computadores tentando sincronizar seus relógios.

Parece que eles querem que você intui para transações distribuídas

Além disso, confira Protocolo de tempo de rede:

O NTP é um protocolo projetado para sincronizar os relógios dos computadores em uma rede.

Eu acho que você quer gravar tudo no UTC (tempo universal). Isso permitirá que os tempos sejam registrados com seus tempos em relação a um ponto comum no tempo e facilitem a comparação de datas/tempos. Para exibi -los no horário local, você simplesmente identifica o deslocamento e calcula a diferença do tempo da UTC para o local. Por exemplo, na costa leste, seu UTC -5, então, se o horário da UTC for 17:00, a hora local em Nova York é 12:00 e em Dallas seu UTC -6, então são 11:00.

Então, se você tem um evento às 11h10 em Dallas, seu horário da UTC é 17:10, e um evento em Nova York às 12h05 é 17:05 UTC, você sabe que o evento de Nova York ocorreu primeiro, mas se Você comparou os tempos que isso não pareceria assim.

A UTC também tem a vantagem de que sempre representa todas as 24 horas durante o dia, de modo que no outono quando você sai do dia de economia de luz do dia, você não obtém 2 conjuntos de eventos 2 da manhã e você não perde horas quando surge para a frente para ir para ir no tempo de economia da Dalylight.

Primeiro: se as operações em cada máquina forem genuinamente paralelas, você não poderá garantir que haja uma única ordem serializada canônica. Se houver alguma coordenação no processo geral, é melhor você usar algum tipo de seqüenciamento no protocolo, para que você possa resolvê -lo.

Além disso, você precisa calcular a inclinação do relógio entre as máquinas para ajustar os tempos. A maneira como você faz isso é razoavelmente simples: peça à outra máquina para o tempo atual e meça o tempo de ida e volta para essa solicitação. Suponha que o tempo relatado pela máquina remota fosse verdadeira na metade da viagem de ida e volta atrás (isso pressupõe atrasos simétricos em média - nem sempre é verdade, mas você realmente não pode fazer melhor sem se aprofundar no layout da rede) e subtrair a partir do tempo da máquina atual. Esse é o seu relógio inclinado. Você pode medir a inclinação várias vezes e tomar uma média, para uniformizar o atraso intermitente na conexão.

Se você precisar de sincronização de relógio muito precisa entre os computadores, use o GPS.

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