2017-01-03 3 views
0

Ich denke über das seit einer Woche, aber ich kam mit nichts, das mich überzeugt.Apache Ignite - Zeitplan in einem Cluster

Ich habe einen kleinen Cluster mit Jetty mit Jersey auf allen Knoten (sie sind alle identisch). Anforderungen werden auf Knoten ausgeglichen, und alle Knoten sind "zustandslos".

Benutzerdaten sind auf Apache Ignite partitioniert, eingebettet in die JVMs mit Jetty und daher für jeden Knoten zugänglich.

Bisher wurden alle Aktionen an diesen Daten ausgeführt, die von REST-Anforderungen ausgelöst und von dem Knoten verwaltet wurden, auf den die Anforderung gestoßen ist. Aber jetzt hat sich der Bedarf geändert. Ein Beispiel ist wie folgt:

Nachdem ein Benutzer eine bestimmte Aktion (Angebot ein virtuelles Gut) ausführen, werden nur wenige andere zufällige Benutzer über die Möglichkeit benachrichtigt, dieses Gut einzulösen. Nach dem Handeln eines von ihnen (innerhalb einer definierten Zeit nach der Veröffentlichung) werden sie es besitzen. Hier das Problem: Wenn kein Benutzer das Gut innerhalb der vorgegebenen Zeit einlösen will, möchte ich einige neue Benutzer auswählen und sie benachrichtigen.

  • Schedule ein Ereignis auf dem Knoten, der zuerst wenige Benutzer angemeldet:

    Dies wird Planung erfordern, kann ich nur zwei Lösungen sehen. (Nicht zuverlässig, wenn Knoten fehlschlagen oder neu geladen werden)

  • Pool von allen Knoten Eine verteilte Sammlung, in der Daten gespeichert werden, die zum Auslösen von Ablaufereignissen erforderlich sind. Dann führe die abgelaufenen aus. (Sieht aus wie die weniger effiziente Lösung, wenn diese Sammlung wächst)

    • Ein Hibrid von beiden; Wo Ereignisse in einer verteilten Sammlung gespeichert und geplant werden, kann gut sein. Wenn der Knoten nicht fehlschlägt, wird der Sammlungseintrag ausgeführt und gelöscht. Eine langsame Iteration der Sammlung überprüft, ob Ereignisse abgelaufen sind und nicht gelöscht wurden. (Es sieht eine Lösung, die schwer zu debuggen sein kann und vorhersagen)

Neben habe ich die DelayedQueue Implementierung lesen und sehe nicht ein effizientes System eine große Menge von geplanten Aufgaben zu verwalten.

Ich werde gestehen, dass ich stecken geblieben bin, und ich brauche einen Ratschlag, wie Ereignisse auf einer Cluster-Basis geplant werden können, die sicher sein werden, dass sie einem Knotenausfall widerstehen werden.

Antwort

0

Ich denke, Sie können ein Cluster Singleton (https://apacheignite.readme.io/docs/cluster-singletons) erstellen, die sich um die Planung kümmert. Dies wird automatisch die Ausfallsicherung im Falle eines Absturzes behandeln. Wenn es einen Status gibt (z. B. Informationen über die Benutzer, die benachrichtigt wurden, Zeitstempel, zu denen der Job das letzte Mal geplant wurde usw.), kann er in einem Cache gespeichert werden.

Verwandte Themen