2016-11-17 5 views
1

Ich habe eine Anwendung, die Hangfire verwendet, um langwierige Jobs für mich zu tun (ich weiß, die Zeit, die der Job dauert und es ist immer ungefähr das gleiche), und in meiner UI möchte ich geben Sie eine Schätzung ab, wann eine bestimmte Arbeit erledigt wird. Dazu muss ich Hangfire nach der Position des Jobs in der Warteschlange und der Anzahl der darauf arbeitenden Server abfragen.Wie ungefähr Job-Abschlusszeiten in Hangfire

Ich weiß, dass ich die Anzahl anstehender Aufträge erhalten können (in der "STANDARD" queue) von

public long JobsInQueue() { 
    var monitor = JobStorage.Current.GetMonitoringApi(); 
    return monitor.EnqueuedCount("DEFAULT"); 
} 

und die Anzahl der Server, die von

public int HealthyServers() { 
    var monitor = JobStorage.Current.GetMonitoringApi(); 
    return monitor.Servers().Count(n => (n.Heartbeat != null) && (DateTime.Now - n.Heartbeat.Value).TotalMinutes < 5); 
} 

(BTW: Ich schließe ältere Herzschläge , denn wenn ich Server ausschalte, verweilen sie manchmal in der Hangfire-Datenbank. Gibt es einen besseren Weg?), aber um eine korrekte Schätzung zu geben, muss ich die Position des Jobs in der Warteschlange kennen. Wie bekomme ich das?

+0

Auch trifft es mir, dass Sie Ihre Frage umformulieren sollten auf " Wie man Jobbeendigungszeiten in Hangfire annähert " –

+0

@ TomRedfern: Danke, gute Idee. Erledigt. – EluciusFTW

Antwort

2

Das Problem, das Sie haben, ist, dass Hangfire asynchron, in der Warteschlange, parallel ist, eine mindestens einmalige Haltbarkeitssemantik aufweist und im Grunde nicht deterministisch ist.

Um sicher zu wissen, in welcher Reihenfolge ein Artikel in einem solchen System verarbeitet wird, ist dies unmöglich. In der Tat würden viele der Vorteile von Hangfire wegfallen, wenn die Anforderung eine strenge Bestellung durchsetzen würde.

Es gibt einen Blog-Eintrag von @odinserj (der Autor von hangfire), wo er diesen Punkt skizziert ist sehr gut: http://odinserj.net/2014/05/10/are-your-methods-ready-to-run-in-background/

jedoch, dass heißt, es ist nicht unmöglich zu kommen mit einer vernünftigen Schätzalgorithmus, aber es müsste einer sein, bei dem die Reihenfolge der Ausführung in gewisser Weise angenähert ist. Wie Sie bei solchen Algorithmus ankommen können, weiß ich nicht, aber so etwas wie diese Macht Arbeit (aber wahrscheinlich nicht):

Approximate seconds remaining until completion = 
    (
     (average duration of job in seconds * queue depth) 
     /(the lower of: number of hangfire threads OR queue depth) 
    ) 
    - number of seconds already spent in queue 
    + average duration of job in seconds 
+0

Vielen Dank für Ihre Antwort. Ich bin mir der asynchronen Art bewusst, ich brauche nur ungefähre Zeiten. Wenn ein Job eine Minute dauert (einschließlich Latenz) und ich 12 Server habe, kann ich, wenn ich 15 in der Warteschlange bin - selbst wenn es 500 Jobs gibt - annehmen, dass meine Arbeit in 2-3 Minuten erledigt ist. Und obwohl die Server Jobs annehmen, wann immer sie können, glaube ich nicht, dass sie sie willkürlich greifen, es gibt eine Bestellung in den Jobs, oder täusche ich mich? – EluciusFTW

+0

@EluciusFTW - es hängt davon ab, wie hangfire entscheidet, welche Jobs als nächstes in einer Multi-Server-Umgebung verarbeitet werden. Es könnte so einfach sein, wie der älteste unbearbeitete Job als nächstes ausgeführt wird, aber es könnte ein komplexeres Verhalten sein. Ich nehme an, eine Möglichkeit, diese Information herauszufinden, wäre, die Hangfire-DB abzufragen. Dies ist jedoch nicht sehr zukunftssicher. –

+0

@EluciusFTW - wenn Sie es schaffen, eine Methode zu entwickeln, die funktioniert, denken Sie daran, es hier zu posten. Ich würde es gerne in Zukunft nutzen! –

Verwandte Themen