Trabalhos agendados durante o horário de outono mudam

12

Estou me perguntando como outras pessoas lidam com esse cenário.

E se você tiver um trabalho programado para ser executado às 01:30. No outono, quando o tempo muda, a hora de 1:00:00 a 1:59:59 se repete e, assim, o trabalho é executado duas vezes.

Pode ser o Agendador de tarefas do Windows, o SQL Agent ou qualquer outra ferramenta de agendamento. A maioria dessas ferramentas parece ser baseada no tempo da máquina, não no horário UTC. Se eu dissesse para executar o trabalho no horário UTC todas as noites, não haveria o problema de hora duplicada.

NealWalters
fonte
1
Eu não consegui encontrar nada mais atual, mas espero que isto lança alguma luz sobre o problema para você - support.microsoft.com/kb/325413
joeqwerty
Isso é excelente, por que não postar uma resposta?
NealWalters 30/10
Bem, isso realmente não fornece uma solução (pelo menos não que eu possa discernir ao lê-la), mas achei que seria útil para entender o problema. Fico feliz em deixar isso como um comentário.
joeqwerty

Respostas:

10

O agendamento adequado de tarefas futuras por hora local, levando em consideração os fusos horários e o horário de verão, é um assunto muito complexo. Eu escrevi sobre isso antes de uma perspectiva de programação no Stack Overflow aqui e aqui .

Vou resumir de uma perspectiva de não programação:

  • Defina seus padrões de recorrência pela hora local - não pelo UTC . Por exemplo, se você definir um despertador diário para acordá-lo às 8:00 todos os dias, não deseje acordar uma hora mais cedo ou uma hora depois de uma transição de horário de verão. Se eu estiver no fuso horário do Pacífico dos EUA, não posso agendar para as 16:00 UTC, porque após a transição, será necessário mudar para as 15:00 UTC para manter a mesma hora local às 08:00.

  • Defina o fuso horário que o horário "local" representa. Não assuma que o fuso horário local do servidor é o mesmo fuso horário que importa para o usuário final.

  • Projete a hora local com uma data e hora UTC para cada ocorrência que você deseja que o evento seja acionado.

    • Você quase sempre fará isso para a próxima ocorrência imediata, para poder usar o relógio UTC para determinar o instante real na hora de executar.

    • Em alguns casos, convém também projetar as próximas várias (ou muitas) instâncias, como as próximas 5 ocorrências ou todas as ocorrências para o próximo ano. (Esta parte é altamente específica para os requisitos do aplicativo.)

  • Tenha uma estratégia em prática (fixa ou configurável), do que fazer para ocorrências que caem no momento de uma transição de horário de verão :

    • Para a transição "primavera adiante", há uma diferença de horário local ausente, quando a ocorrência pode não existir. Por exemplo, no horário do Pacífico dos EUA, uma tarefa diária agendada para ser executada às 02:00, horário local, não existirá em 9 de março de 2014. Na maioria dos casos, convém avançar esse horário pelo valor da economia (geralmente 1 hora ), nesse dia , será executado às 3:00, mas voltará a ser executado às 2:00 na próxima instância. (No entanto, é perfeitamente possível que você deseje uma estratégia diferente para isso.)

    • Para a transição de "retorno", há uma sobreposição da hora local duplicada, quando a ocorrência pode existir duas vezes . Por exemplo, no horário do Pacífico dos EUA, uma tarefa diária programada para ser executada às 01:00 terá dois horários possíveis em 2 de novembro de 2014. Na maioria dos casos, você desejará executar na primeira ocorrência de 1 : 00 PDT e pule a próxima ocorrência de 01:00 PST da mesma data. (Mas, novamente, você pode querer uma estratégia diferente, como executar na segunda ocorrência ou executar nas duas. YMMV)

  • Esteja preparado para recalcular todos os seus horários UTC de ocorrência, se precisar atualizar seus dados de fuso horário. O IANA / Olson TZDB lança várias atualizações todos os anos porque os governos do mundo mudam de idéia o tempo todo sobre as compensações de fuso horário e as regras de horário de verão. Você não pode assumir, por um período específico de tempo, que as regras não serão alteradas .

    • Certifique-se de assinar anúncios de liberações de dados de fuso horário e tenha um processo para aplicá-las aos seus sistemas e / ou aplicativos.

    • Em um ambiente corporativo tradicional, isso deve ser de responsabilidade da equipe de operações de TI.

    • Dependendo do seu ambiente, você pode obter esses dados por meio de tzdataatualizações de pacotes Linux, por meio de Java JRE ou tzupdater ou qualquer outro número de outros canais. Às vezes, é específico do ambiente e, às vezes, da plataforma de programação, como o pacote PECL do timezonedb para PHP e muitos outros.

    • A Microsoft possui seus próprios dados de fuso horário. No Windows, se você estiver usando o TimeZoneInfo.NET (por exemplo), estará usando esses dados. As atualizações vêm daqui e também são enviadas automaticamente pelo Windows Update; portanto, você deve ficar de olho nisso para saber quando / se precisar recalcular.

  • Com tudo isso entendido, não é ainda um cenário onde você iria agendar apenas pela UTC, e que é para ABSOLUTAS eventos futuros. Exemplos:

    • Um trabalho que é executado a cada X horas ou a cada X minutos.

    • Horário de início e fim do nascer do sol ou outro fenômeno astronômico.

    • Uma janela de segurança sensível ao tempo, como ao transmitir informações confidenciais para outra parte em um horário previamente combinado.


Agendador de tarefas do Windows

O Windows não está necessariamente fazendo a coisa certa. Preste atenção em como você define o gatilho:

Agendador de tarefas do Windows

Quando você marca a caixa "Sincronizar entre fusos horários", a tarefa é agendada apenas pelo UTC. (Todos os horários ainda são mostrados como horário local, mas são armazenados como UTC.) Portanto, isso é para o que eu chamei anteriormente de evento "absoluto".

Quando você deixar essa caixa desmarcada, ela usará o fuso horário local do computador em que o código está sendo executado. Ele não oferece nenhuma opção para especificar o fuso horário, portanto, essa não é uma IMHO de implementação muito boa.

Não tenho exatamente certeza do seu comportamento no horário de verão, mas vou experimentar e responder a você sobre isso. Provavelmente faz o que descrevi acima, mas não necessariamente.


Agente SQL

O agendador do SQL Agent é ainda pior, pois permite apenas o uso do horário do servidor local. Novamente, nenhum fuso horário pode ser especificado e você também não pode especificar o UTC.

Foi solicitado , mas não aceito.

Matt Johnson-Pint
fonte
Portanto, com as ferramentas específicas SQL Agent e Windows Task Scheduler, você tem alterações manuais para fazer cada alteração, certo? Ou, potencialmente, o código executado no agendador poderia verificar novamente a hora UTC e, em seguida, possivelmente atrasar (no outono), mas não há como evitar que o trabalho não seja executado no Spring além de uma alteração manual. Ou talvez um script para realmente reprogramar a programação?
NealWalters
Atualizei a resposta com informações sobre o Agendador de tarefas do Windows e o SQL Agent. Nem estão fazendo completamente certo. Se você deseja desenvolver sua própria solução, consulte Quartz.net .
Matt Johnson-Pint
A curto prazo, você pode usar o Agendador de Tarefas do Windows com essa caixa marcada para definir suas tarefas para serem executadas em horários UTC específicos. Mas você provavelmente desejará que essas sejam tarefas únicas que você cria programaticamente a partir do seu próprio código, para poder levar o resto em consideração.
Matt Johnson-Pint
Outra ótima resposta!
NealWalters
1

Por não se importar, geralmente.

Faça a pergunta "e se a tarefa for executada duas vezes?"

Geralmente, isso não importa, então você não precisa fazer nada. Se isso importa, a solução mais simples é afastar o trabalho da hora impactada pela mudança do horário de verão.

HopelessN00b
fonte
Se eu não me importasse, não teria perguntado. Alguns importam, outros não. Às 2:00, temos trabalhos que extraem o arquivo e o enviam aos nossos fornecedores. Não acho que 2:00 se repitam. Vamos passar para as 2:05 apenas para obter um seguro adicional. Temos backups, trabalhos de índice inteligente, etc ... mas, felizmente, são mais tarde.
NealWalters 30/10
1
@NealWalters Eu acho que é um ponto justo, ser justo com o hopelessnoob: se não importa se uma tarefa é executada duas vezes, por que se preocupar? Eu não sei sobre você, mas tenho muitas coisas com que me preocupar, ao invés disso, preciso me preocupar sem me preocupar com as coisas com as quais não preciso me preocupar. Se ele faz questão, em seguida, você já deve codificá-lo para fazer alguns testes de sanidade de qualquer maneira . Dito isto, certamente é uma boa idéia evitar agendar coisas para serem executadas no ponto exato em que os relógios retornam - isso é apenas pedir problemas.
precisa
Não é minha escolha, enviamos arquivos de extração para os aeroportos no horário da manhã, e é nesse horário que eles querem o arquivo. Estamos usando o BizTalk, um sistema baseado em mensagens, mais difícil de verificar se há coisas assim. É um pouco decepcionante que o agendador SQL e o agendador de tarefas do Windows não permitam um horário UTC diário.
NealWalters
1

Como você observou, a hora entre 1:00 e 2:00 se repete no final do horário de verão; quando ocorrer a alteração inversa (no início do horário de verão), o horário entre as 02:00 e as 03:00 não ocorrerá (e seu trabalho não será executado). Suas melhores opções serão

  • executar a programação do trabalho para UTC
  • executar o trabalho em um horário fora da transição (12h59 ou 3h)
Andrew
fonte