2017-07-03 8 views
-1

Ich habe derzeit einen laufenden 'Cron' Server. Es soll alle zeitlich befohlenen Befehle ausführen, die in der Zukunft ausgeführt werden müssen. Dies ist das einzige, was der Server tut.Cron-Server wird um mehrere Minuten verzögert mit setTimeout()

Was funktioniert: Die Funktionen auf meinem eigenen Laptop ausführen, alles wird rechtzeitig ausgeführt.

Was ist kaputt: Laufende Funktionen über mehrere Tage auf dem Server.

Mein Code ist alles in einem ausdrücklichen Projekt (Node) platziert, so können Anrufe von anderen Servern vorgenommen werden mehr

Ordner-Layout 'crons' hinzuzufügen:

app.js 
-api/ 
--crons/ 
---router.js 
---functions.js 
--.../ 

In den Funktionen meine Funktionen Datei ein cron hinzuzufügen und auszuführen wird beibehalten.

const _ = require('lodash'); 
const Crons = []; 
const moment = require('moment'); 

const functions = { 

addCron: (toExecute, dateTime, id, name) => { 
    console.log('Cron', dateTime, name, id); 
    const now = new Date().getTime(); 
    const then = new Date(dateTime).getTime(); 
    const diff = Math.max(then - now, 0); 

    let cronJob; 
    if (diff >= Math.pow(2, 31)) { 
     if(functions.get(name)) { 

     } 
     cronJob = setTimeout(() => { 
     functions.remove(name); 
     functions.addCron(toExecute, dateTime, id, name); 
     }, diff); 
     Crons.push({ 
     name: name, 
     job: cronJob 
     }); 
    } else { 
     if(functions.get(name)) { 
     functions.remove(name); 
     } 
     cronJob = setTimeout(() => { 
     console.log(`Started cron: ${name} at ${new Date()}`); 
     toExecute(id); 
     functions.remove(name); 
     }, diff); 
     Crons.push({ 
     name: name, 
     job: cronJob 
     }); 
    } 

    } 
}; 

module.exports = functions; 

Derzeit meine Protokolle, wenn ich diese zeigen mir lokal ausgeführt, dass alle Funktionen zu spät etwa 1 Millisekunde ausgeführt werden (was in Ordnung ist). Und die Logs auf dem Live-Server zeigen mir, dass Funktionen 7 Minuten länger täglich laufen.

Die Protokolle

1|cronserver | 2017-06-30 18:00:07.195000000: Cron 2017-07-01T17:00:00.000Z YQkWN6BmX8eqzQHC9startCheck YQkWN6BmX8eqzQHC9 
1|cronserver | 2017-06-30 18:00:07.195000000: Cron 2017-07-01T17:30:00.000Z 7c2yPyfjKDuujKQjhstartCheck 7c2yPyfjKDuujKQjh 
1|cronserver | 2017-06-30 18:00:07.196000000: Cron 2017-07-02T17:00:00.000Z PQKoboRpSkWeTufSdstartCheck PQKoboRpSkWeTufSd 
1|cronserver | 2017-06-30 18:00:07.196000000: Cron 2017-07-02T17:30:00.000Z yLFaAjACB9uNPd4YvstartCheck yLFaAjACB9uNPd4Yv 
1|cronserver | 2017-06-30 18:00:07.199000000: Cron 2017-07-01T17:30:00.000Z YQkWN6BmX8eqzQHC9start YQkWN6BmX8eqzQHC9 
1|cronserver | 2017-06-30 18:00:07.199000000: Cron 2017-07-01T18:00:00.000Z 7c2yPyfjKDuujKQjhstart 7c2yPyfjKDuujKQjh 
1|cronserver | 2017-06-30 18:00:07.199000000: Cron 2017-07-02T17:30:00.000Z PQKoboRpSkWeTufSdstart PQKoboRpSkWeTufSd 
1|cronserver | 2017-06-30 18:00:07.199000000: Cron 2017-07-02T18:00:00.000Z yLFaAjACB9uNPd4Yvstart yLFaAjACB9uNPd4Yv 
1|cronserver | 2017-07-01 17:07:32.253000000: Started cron: YQkWN6BmX8eqzQHC9startCheck at Sat Jul 01 2017 17:07:32 GMT+0000 (UTC) 
1|cronserver | 2017-07-01 17:37:33.160000000: Started cron: 7c2yPyfjKDuujKQjhstartCheck at Sat Jul 01 2017 17:37:33 GMT+0000 (UTC) 
1|cronserver | 2017-07-01 17:37:33.161000000: Started cron: YQkWN6BmX8eqzQHC9start at Sat Jul 01 2017 17:37:33 GMT+0000 (UTC) 
1|cronserver | 2017-07-01 18:07:34.070000000: Started cron: 7c2yPyfjKDuujKQjhstart at Sat Jul 01 2017 18:07:34 GMT+0000 (UTC) 
1|cronserver | 2017-07-02 17:14:24.678000000: Started cron: PQKoboRpSkWeTufSdstartCheck at Sun Jul 02 2017 17:14:24 GMT+0000 (UTC) 
1|cronserver | 2017-07-02 17:44:25.587000000: Started cron: yLFaAjACB9uNPd4YvstartCheck at Sun Jul 02 2017 17:44:25 GMT+0000 (UTC) 
1|cronserver | 2017-07-02 17:44:25.588000000: Started cron: PQKoboRpSkWeTufSdstart at Sun Jul 02 2017 17:44:25 GMT+0000 (UTC) 
1|cronserver | 2017-07-02 18:14:26.496000000: Started cron: yLFaAjACB9uNPd4Yvstart at Sun Jul 02 2017 18:14:26 GMT+0000 (UTC) 

Das einzige, was dieser Server die Funktionen laufen tut, ist. Jede Hilfe würde sehr geschätzt werden.

TL; DR Meine setTimout-Funktionen laufen zu spät. Wie kann ich dieses Problem lösen

+0

Verwenden Sie node.js? – pokeybit

+0

Ja, das tue ich jetzt als Tag. – mitchken

+0

was ist 'functions.remove'? Leerst du jemals 'Crons'? Ihr aktueller Code erhöht es ohne Limit: es würde alles langsam verlangsamen ... – dfogni

Antwort

1

setTimeout wird nur einmal ausgeführt, so würde ich dies nicht als "Cron-Job", sondern stattdessen einen Job, den Sie einmal irgendwann in der Zukunft ausführen möchten. Davon abgesehen, ist setTimeout nicht genau und es gibt multiple known reasons why your setTimeout timer executes at the wrong time. Wie funktioniert setTimeout funktioniert, dass es ein Ereignis in der Ereigniswarteschlange erstellt und es ist nicht, bis die Warteschlange freigibt, dass es Ihren Code as explained here ausführt. Ich könnte leicht eine Situation sehen, in der, wenn Sie mehrere setTimeout-Funktionen ausführen, Verzögerungen bei der Ausführung verursachen. Oder es ist wahrscheinlicher, dass Sie ein anderes Speicherleck-Problem haben, das hier nur sprudelt.

Unabhängig davon gibt es viele andere Möglichkeiten, um zu erreichen, was Sie versuchen zu tun. Ich habe node-cron für tatsächliche Cron-Jobs verwendet und es ist ziemlich süß. Es gibt auch mehrere Möglichkeiten, einzelne Jobs in eigenen Warteschlangen auszuführen, z. B. Kue oder RabbitMQ.

+0

Verwendet der Knoten cron setTimeout nicht in seinen eigenen Funktionen? Wie können sie genauer sein? – mitchken

+0

Hier sind ziemlich ähnliche Diskussionen https://github.com/kelektiv/node-cron/issues/218 und https://github.com/node-schedule/node-schedule/issues/368 - Sie diskutieren über das Ausführen von Tausenden von SetTimeouts zu einer Zeit mit minimalen Verzögerungen. Höchstwahrscheinlich wird im Code, der ausgeführt wird, ein Synchronisierungscode ausgeführt, der die Ereignisschleife blockiert. Ich würde vorschlagen, dass Ihr Cron-Job und der Code, der tatsächlich ausgeführt wird, auf verschiedenen Prozessen läuft. – jjbskir

Verwandte Themen