私は何千ものソースからイベントを受け取っているこのシナリオを持っています。各ソースは、現在のステータスに関する情報を送信しています。すべてのイベントを処理したいのですが、各ソースの最新のイベントを最初に処理して、現在のビューが最新であることが重要です。だから私はConcurrentHashMap
をキーとして各ソースの識別子と値としてLIFOキュー(スタック)を使用することを考えていました。その後、Map
のキーを繰り返して、各ソースのスタックから1つのアイテムをポップします。複数のプロデューサキーからのフェアデキューによるキュー
私は、キーを繰り返し処理しながら各キーのキューから項目を取り除いている間に、プロデューサがキューに新しいイベントをポストして、並行処理の問題を引き起こす可能性があると懸念しています。プロデューサは、新しいキーをマップに追加することもでき、Map
のentrySet
を反復することは、弱く一貫しているようです。新しいアイテムは後続の反復で処理されるため、これは大きな問題ではありません。理想的には、entrySet
のストリームでいくつかの並列処理を使用して処理を高速化することもできます。
これに対してよりクリーンなアプローチがあるのだろうかと思います。現実には私はLIFO BlockingDequeue
を使い、最新の出来事を最初に処理することができましたが、このアプローチの問題は、あるソースが他のソースよりも多くのイベントを送る可能性があり、
この種の動作を提供する他のデータ構造はありますか?基本的に私が探しているのは、各ソースからのイベントに優先順位を付けると同時に、各ソースに消費者が処理する公平な機会を与える方法です。
これは興味深いです。しかし、問題は、特定のソースに対して新しいイベントがスタック(LIFOキュー)に追加される必要があることです。つまり、キュー内のそれぞれのスタックを見つける必要があります。私は、ソースのキーをソースのLIFOキューにマッピングする特別な 'ConcurrentHashMap'を使ってこれを解決できるかもしれないと思います。 –
jbx
はい、ソースがどこにイベントを配置するか分からない場合は、HashMapが行う必要があります。 – Vampire
ええ、私が構築しようとしているのは、外部からのキューのように見えるデータ構造で、追加と削除だけですが、内部的にはこれに応じて優先順位付けのロジックを実行しています。あなたの提案をハッシュマップと組み合わせて試してみます。 – jbx