Ich habe eine Umgebung, die viele Geräte in 3 Zeitzonen versorgt, indem sie während der frühen Morgenstunden Daten empfängt und sendet. Die Verteilung dieser Geräte wurde pseudozufällig basierend auf einer Identifikationsnummer und einer einfachen Berechnung unter Verwendung einer Modulo-Operation bestimmt. Das Ergebnis einer solchen Berechnung erzeugt einen unnötigen künstlichen Peak, der zu bestimmten Stunden der Nacht mehr Ressourcen verbraucht als ich gerne hätte.
Im Rahmen unseres Protokolls kann ich Geräte anweisen, wann sie sich in den folgenden Nächten mit unserem System verbinden.
Ich suche nach einem Algorithmus, der den Peak generell in eine eher ebene (wenn auch meist höhere) Zeile oder zumindest in die richtige Richtung verteilen kann - was für eine Art Terminologie ich lesen sollte. Ich verfüge über Identifikationsnummern für Geräte, die aktuelle Uhrzeit und die Zeitzone des Geräts als Eingänge für die Berechnung. Ich kann auch einige analytische Berechnungen durchführen, um Pools zu erstellen, aus denen man Slots ziehen kann, obwohl ich denke, dass diese Herangehensweise weniger elegant ist, als ich hoffe (obwohl ein Lernalgorithmus vielleicht keine schlechte Sache ist ...) / p>
(Letztendlich und etwas weniger relevant werde ich diesen Algorithmus mit C # implementieren.)
Wenn Sie die mit zufälligen Zeiten verbundenen Spitzen vermeiden möchten, sehen Sie sich die verschiedenen Hash-Funktionen an, die für Hashtabellen verwendet werden. Ihre Lektüre könnte in den Wikipedia-Artikeln zu diesem Thema beginnen:
Teilen Sie im Grunde alles, was Sie für Ihr Update-Fenster haben möchten, in die entsprechende Anzahl von Buckets. Eine Option könnte 3 Stunden * 60 Minuten * 60 Sekunden = 10800 Eimer sein. Verwenden Sie dann diese als Ihre Hashtable-Größe für die ausgewählte Hash-Funktion. Ihre eindeutige Eingabe könnte die Geräte-ID sein. Vergessen Sie nicht, GMT für die gewählte Zeit zu verwenden. Ihre Programmiersprache der Wahl hat wahrscheinlich eine Reihe von eingebauten Hashfunktionen, aber der Artikel sollte einige Links zur Verfügung stellen, um Sie zu starten, wenn Sie eine von Grund auf neu implementieren möchten.
Dieser Ansatz ist der früheren Antwort von Direktzugriffszeiten überlegen, da er viel bessere Gleichmäßigkeitseigenschaften aufweist und sicherstellt, dass Ihre Zugriffsmuster im Vergleich zur zufälligen Funktion, die wahrscheinlich ist, ungefähr flach sind manchmal Spikes zeigen.
Hier finden Sie einige spezifische Informationen zur Implementierung verschiedener Funktionen:
Du sagst, dass du den Geräten sagen kannst, wie viel Zeit du haben sollst, damit ich nicht verstehe, warum du etwas zufälliges oder moduliertes brauchst. Wenn jedes Gerät eine Verbindung herstellt, wählen Sie eine Uhrzeit aus, der derzeit nicht viele Geräte zugewiesen sind, und weisen Sie das Gerät dieser Zeit zu. Wenn die Geräte alle etwa die gleiche Menge an Ressourcen benötigen, um sie zu bedienen, dann wird ein trivialer Greedy-Algorithmus eine vollkommen reibungslose Verteilung erzeugen - jedes Gerät der Zeit zuweisen, die momentan am wenigsten überlastet ist. Wenn der Server andere Aufgaben als nur diese Geräte verarbeitet, sollten Sie mit dem typischen Lastprofil beginnen und dann die Geräteauslastung hinzufügen. Ich würde das nicht wirklich "analytische Berechnungen" nennen, sondern nur ein Histogramm der erwarteten Belastung für die nächsten 24 Stunden gegen die Zeit speichern.
Oder haben Sie das Problem, dass das Gerät Anweisungen möglicherweise nicht befolgt (z. B. könnte es zur angegebenen Zeit offline sein und sich dann verbinden, wenn es das nächste Mal ist)? Offensichtlich, wenn Ihre Benutzer in einer bestimmten Zeitzone morgens zur gleichen Zeit arbeiten, wäre das eine problematische Strategie.
Nehmen Sie einfach die Anzahl der Geräte und teilen Sie Ihr Zeitintervall in n gleiche Segmente und jedes Segment zu einem Gerät zuweisen, informiert sie, wann zu verbinden, wenn sie nächste Verbindung.
Damit erhalten Sie in allen Fällen eine optimal gleichmäßige Verteilung.
Normalisieren Sie alle Zeiten auf GMT, was interessiert Sie an Zeitzonen oder Tageslicht oder was auch immer? Jetzt ist es egal, in welcher Zeitzone du bist.
Das Hinzufügen einer zufälligen Verteilung kann zu einer Verklumpung führen (eine gleichmäßige Zufallsverteilung ist nur im Grenzwert einheitlich, aber nicht unbedingt für eine bestimmte Stichprobe) und sollte wirklich verwendet werden, wenn es keinen Rückkopplungsmechanismus gibt. Da kann man bis zu einem gewissen Grad steuern, wenn sie eine zufällige Komponente verbinden, ist überhaupt nicht notwendig und ist auch nicht annähernd optimal.
Wenn Sie Bedenken hinsichtlich der Taktabweichung über mehrere Geräte hinweg haben, sollten Sie selbst dann, wenn Sie Zufälligkeit hinzufügen, die Zufälligkeit Ihrer Taktabweichung in keiner Weise verringern und würde nur zu einer noch weniger optimalen Zuweisung beitragen.
Wenn Sie eine stabile Verteilung der Geräte nach Region sicherstellen möchten, berechnen Sie das Verhältnis der Geräte pro Region und verteilen Sie die Slotzuweisungen entsprechend. Wenn Sie beispielsweise 50/25/25 nach Zeitzone haben, weisen Sie der ersten Zeitzone Slots und dann den verbleibenden zwei Zeitzonen die verbleibenden Zeitzonen zu und wiederholen Sie diese.