2017-04-27 10 views
0

ヘーゼルキャストでは、消費者が世界の現在の状態(現在はマップ内にあるもの)を知りたいと思っています。リスナーを持つ世界のHazelCastマップ

Hazelcastマップには、コンシューマが現在の状態をストリーミング(Rx経由)したい場合や、リスナーからの更新が必要なさまざまなデータがあるシナリオを想像してみてください。

APIは、更新のためのリスナーを追加し、Mapを通常のConcurrentMapとして扱うことを示唆しています。しかし、私がマップを列挙している間に、更新がリスナーを介して行われる可能性があるので、アイテムの正しい順序を保証するのは難しいです。

地図の列挙子とリスナーの間でロックを共有できますが、それはコードの臭いのようです。

SoTWをストリーミングして更新したいのであれば、どうすればいいのですか?私たちを助けることができるヘーゼルキャストには何かが組み込まれていますか?

ヘルプすべての

+0

これはhttp://stackoverflow.com/questions/29304623/hazelcast-map-listener-with-replayに似ています –

答えて

0

まずしてくれてありがとう、と私はそれだけで不幸説明されていると思い、マップには順序がありません!

ヘイゼルキャストマップは、スナップショットではない非永続データ構造です。 ConcurrentHashMapと同様に、データ構造の変更はイテレータに反映され、その逆も同様です。

イベントは、特にイベントが非同期に配信されるため、完全に独立したシステムです。したがって、イテレータを同じ要素または別のラウンドまで進める前にイベントが実際に到着することがあります。

より良い保証が必要な場合は、まず最初に繰り返し、リスナーを追加し、最初の実行の開始から見逃した可能性がある変更を適用します(2回目の繰り返しでデルタを実行する必要があります)。実際にそれを処理する良い方法ではありませんが、私は別の方法があるとは思わない。

+0

ありがとう@noctarius。マップの順序に関しては、私は本当に気にしませんが、それは列挙の順序ですし、更新します。 良い保証が最初の列挙の周りにロックを持っていて、イベントでもロックされているのだろうかと思います。少なくともそれらはブロックされています –

+0

これは、イベントが失われる可能性のあるイベントスレッドをブロックすることを意味します。最善の方法は、地図の最初の読み取り中に入ったすべてのイベントを収集し、最初の読み取りが完了した後にすべてのイベントを再生することです。つまり、一部の更新は「重複」である可能性がありますが、最終的な状態は同じです。 – noctarius

+0

ブロックすると、イベントは遅れてキューに入れられます。あなたの2番目の提案は、私たちがやったことです。 :) –

関連する問題