EventsManager外部ソースからイベントを受け取るがあります。AnEventには atypeと aがありvalueます。
リスナーを に登録してEventsManager、特定のタイプのイベントの連続する値を通知することができます。
は、特定のタイプのイベントに対して次の 2 つのEventsManagerことを約束します。
- 同じ値が続けて 2 回送信されることはありません (リスナーが通知を受け取ると、受信する値が前の通知とは異なる値であることが保証されます)。
- 特定のタイプのイベントについて、外部ソースから値を受け取る順序を保持する必要があります。
動作するsynchronizedバージョンがありますが、スループットを改善したいと考えています。
典型的な用途: < 1k リスナー、< 10k イベント タイプ、< 1M イベント/秒 (ただし、そのタイプのイベントに登録されたリスナーがないか、値が変更されていないため、ほとんどは破棄されます)。
- その動作を実装するための最も効率的な戦略は何でしょうか (たとえば、イベント タイプごとに 1 つのキュー/ロックを使用し、それらを ConcurrentMap に保持できますが、10k のキューを持つことは良い考えのようには思えません)。
- スケーラブルな並行構造を使用してそのようなことを行う既存のライブラリはありますか?
例: リスナーが次lst1のタイプのイベントをリッスンしたいtype1
場合 EventsManager は次を受け取ります。
event: type2, value: 2
event: type1, value: 1
event: type1, value: 1 //no change => discard
event: type3, value: 4
event: type1, value: 7
lst1次の順序で受信する必要があります: 1(1 回のみ) then 7.