2017-04-27 7 views
0

Mit Hazelcast, stelle ich mir ein gängiges Szenario vor, dass Verbraucher über den aktuellen Zustand der Welt (was gerade in der Karte ist) wissen wollen und dann Updates mit nichts dazwischen verloren.Welt der Welt HazelCast Karte mit Zuhörer

Stellen Sie sich ein Szenario vor, in dem eine Hazelcast-Karte eine Vielzahl von Daten enthält, die ein Verbraucher (möglicherweise über Rx) den aktuellen Status und dann etwaige Aktualisierungen vom Zuhörer streamen möchte.

Die API schlägt vor, dass wir einen Listener für Updates hinzufügen und die Map als normale ConcurrentMap behandeln. Während ich jedoch die Map aufzählen möchte, können Updates über den Listener kommen, so dass die korrekte Reihenfolge der Elemente schwierig ist.

Wir könnten eine Sperre zwischen dem Map Enumerator und dem Listener teilen, aber das scheint ein bisschen ein Code-Geruch.

Also meine Frage im Allgemeinen ist, wenn wir das SoTW und dann Updates streamen möchten, wie können wir das tun? Ist etwas in Hazelcast eingebaut, das uns helfen kann?

Danke für die Hilfe

+0

Dies ist vergleichbar mit http://stackoverflow.com/questions/29304623/hazelcast-map-listener-with-replay –

Antwort

0

Zunächst einmal, und ich denke, es ist nur unglücklicherweise erklärt, hat eine Karte keine Ordnung!

Die zweite Sache, eine Hazelcast-Karte ist eine nicht-Snapshotting, nicht-persistente Datenstruktur. Wie bei einer ConcurrentHashMap werden Änderungen an der Datenstruktur im Iterator und umgekehrt dargestellt.

Ereignisse auf der anderen Seite sind ein vollständig unabhängiges System, insbesondere da Ereignisse asynchron geliefert werden. Es kann also vorkommen, dass die Ereignisse tatsächlich eintreffen, bevor Sie den Iterator auf das gleiche Element oder die andere Runde vorgerückt haben.

Wenn Sie eine bessere Garantie benötigen, iterieren Sie zuerst, fügen Sie den Listener hinzu und übernehmen Sie die Änderungen (Sie müssen in einer zweiten Iteration ein Delta machen) zwischen dem Start des ersten Laufs und Ereignissen, die Sie möglicherweise verpasst haben. Keine wirklich nette Art, damit umzugehen, aber ich glaube nicht, dass es einen anderen Weg gibt.

+0

Dank @noctarius. In Bezug auf die Reihenfolge der Map ist es mir egal, aber es ist die Reihenfolge der Enumeration und dann Updates. Ich frage mich, ob eine gute Garantie wäre eine Sperre um die erste Aufzählung und haben, dass auch die Ereignisse sperren. Zumindest sind sie blockiert hinter –

+0

Das würde bedeuten, dass Sie die Ereignis-Threads blockieren, die Ereignisse verlieren könnten. Der beste Weg besteht darin, alle Ereignisse zu sammeln, die beim ersten Lesen der Karte eintreffen, und alle Ereignisse nach dem ersten Lesevorgang erneut abzuspielen. Das bedeutet, dass einige Updates "Duplikate" sein können, aber der Endzustand ist der gleiche. – noctarius

+0

Wenn wir blockieren, sollten die Ereignisse "in der Warteschlange" stehen. Ihr zweiter Vorschlag ist ziemlich genau das, was wir getan haben. :) –