Frage

Ich habe eine Web-Anwendung (asp.net), in dem Workitems abgegeben und zugeteilten Benutzer entsprechend ihrer Arbeitsbelastung.

Ein Workload des Benutzers berechnet wird derzeit unter Verwendung eines Algorithmus basierend auf der Anzahl der Elemente für den Benutzer zugewiesen (und einigen anderen Faktoren). Jeder neuer Gegenstand wird mit der niedrigsten aktuellen Arbeitsbelastung für den Benutzer zugeordnet ist, ihre Arbeitsbelastung zu erhöhen. Eine Benutzerarbeitsbelastung nimmt ab, wenn sie ein Element beenden. Einzelteile werden gleichzeitig eingereichten zugeordnet und beendet - damit Workload Stufen ändern sich ständig sein wird. Arbeitselemente werden in einer SQL-Datenbank gespeichert.

Ich brauche einen Weg, um sicherzustellen, dass jede Zuteilungsentscheidung ein up-to-date gemacht wird mit Bild der Arbeitsbelastung für die Nutzerbasis.

Meine Idee ist es, ein Lese- / Schreib synchronisiert Shop von Workload-Informationen im Cache.

Ist dies der beste Ansatz? Oder sollte ich die Datenbank Verriegelung kontrollieren? Wie kann ich Engpässe in meiner Anwendung vermeiden?

Rat sehr geschätzt.

War es hilfreich?

Lösung

Das hängt von vielen Faktoren ab, wenn Sie in den Cache beziehen meinen Sie die Standard-Cache von Asp.Net zur Verfügung gestellt?

Ist es absolut wichtig, dass Sie immer die aktuellsten Informationen, oder wenn zwei Anfragen zugeordnet werden soll, ist es ok für sie die Anforderung gemacht wurde zur Zeit auf die beiden am wenigsten ausgelasteten Benutzer zugeordnet werden?

Sie können in der Tat einen Cache verwenden diese Informationen zu speichern, aber dies setzt voraus, im Allgemeinen werden Sie nur einen Server verwenden, ist es wahrscheinlich, dass Sie für hohe Belastungen Ausgleich Clustering oder Last verwenden werden?

Der beste Rat, den ich Ihnen geben kann, ist eine gut gestaltete Anwendung zu bauen, mit einem Modell reichen Domäne, die Lasten der einzelnen Benutzer und der Warteschlange und losen gekoppelten Datenzugriff und vielen automatisierten Einheit und Systemtests darstellt. So können Sie eine funktionierende Anwendung bauen, um das System aufstehen und laufen schnell, ohne sich um die Optimierung zu viel Sorgen und \ Profilierungs Performance-Tests so schnell wie möglich beginnen.

Wenn \, wenn Sie begegnen Performance-Probleme können Sie dann Identität die Engpässe durch Profilierung \ Tracing und fügen Optimierung als angemessen, die Caching sein könnte oder optimierte Abfragen \ Ansichten oder Kombinationen von Dingen.

Wenn Sie auf die zweite Vermutung versuchen, wo Sie sind Engpässe sind und entfernen Sie diese, werden Sie wahrscheinlich falsch erraten und das Design des Systems beschädigen. Ein gut durchdachtes System kann optimiert werden, wenn Sie es brauchen.

So wie ich dies zunächst ins Auge fassen würde, wäre eine relationale Datenbank (möglicherweise Ansichten oder gespeicherten Prozeduren Arbeitsbelastung zusammengefasste Informationen schnell greifen) mit einer Datenzuordnungsschicht zwischen diesem und dem Domänenmodell (das Caching, verzögertes Laden verwenden können und Identitätsmapping Effizienz zu bieten, wenn erforderlich). Das Domain-Modell würde weitgehend eine Darstellung der Arbeitsbelastung halten.

Ich würde erwarten, dass diese Nutzer haben, Arbeitsaufgaben, Arbeitswarteschlange und Allokationsstrategie Klassen. Vieles davon könnte im Speicher oder lokal gespeichert zwischen Anforderungen gehalten werden, könnte jede Anforderung durch ein Ereignis dargestellt werden, die das Modell aktualisieren würde.

z.
Benutzer schließt ein Workitem
Site wirft ein Domain-Ereignis das Domänenmodell der Änderung zu informieren
Domain-Modell erhält Ereignis und Updates Arbeitsbelastung für den Benutzer

Arbeitszuweisung wäre dann eine Frage das Domänenmodell zu fragen, um die Arbeit zu verteilen (die es über eine Strategie zu finden, die am wenigsten zugeordneten Benutzer tun würde), wenn nötig. Diese im Hintergrund passieren könnte außerhalb der individuellen Arbeitsanforderungen und Veranstaltungen erhöhten Benutzer zu benachrichtigen, beim nächsten Mal fragen sie für die Arbeit.

Andere Tipps

Mit der Datenbank diese steuern.

Wenn aus irgendeinem Grunde, in der Zukunft, die Sie benötigen dann eine Web-Farm zu nutzen, erweitern aus werden Sie kein Problem haben. wenn Sie die Daten werden jedoch das Caching und die Arbeit vor Ort, dann wird es interessante Dinge verursachen passieren.

Außerdem können Sie die Vorteile von Web-Garten-Einstellungen, um jede Last bei der Verwaltung der Server würde; das ist nicht genau möglich in einer im Cache gespeicherten Situation.

Zweitens erkennen, dass dies wahrscheinlich nicht perfekt sein muss. Wenn Sie eine große Menge an Arbeit haben kommt in (wie Leitungen in einem Call-Center zu verteilen), dann nur immer ganz in der Nähe, so lange es schnell ist, ist alles, was zählt.

Ich würde eine Datenbank verwenden, um dies zu steuern, wie es höchst unwahrscheinlich Benutzer ist wird die Arbeit schnell genug seinen Abschluss einen Echtzeit-Ansatz zu müssen.

So würde ich eine Reihe von Tabellen, beziehen Artikel arbeiten, die Sie aktuelle Arbeitsebene abfragen zu berechnen und damit die nächste Person zu bestimmen, um eine bestimmte Arbeitseinheit zu erhalten.

Sie könnten dann eine Reihe von gespeicherten Prozeduren müssen Workitem als erledigt markieren oder ein Workitem an jemanden vergeben.

Um Engpässe sicherzustellen, dass Ihre Datenbank normalisiert gut, und Ihre gespeicherten Prozeduren nicht verwenden viele Tabellen zu minimieren, und dies sollte schön Rampe.

Um dies zu überprüfen, können Sie einige Testbäume schreiben die Zuweisung von Arbeitsaufgaben zu gewährleisten, und die Leistung ist, was man unter hohen Nutzungs wünscht.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top