イベントバスhttp://code.google.com/p/guava-libraries/wiki/EventBusExplainedを使用するのが怖いのは、内部で無制限のキューを使用していると思うからです。たくさんのメッセージが投稿されている場合。フルGCになる可能性があります。
無制限のキューと同じことを行う同様の実装が存在しますか?
イベントバスhttp://code.google.com/p/guava-libraries/wiki/EventBusExplainedを使用するのが怖いのは、内部で無制限のキューを使用していると思うからです。たくさんのメッセージが投稿されている場合。フルGCになる可能性があります。
無制限のキューと同じことを行う同様の実装が存在しますか?
実際、GuavaConcurrentLinkedQueue
は無制限の を使用します。
リンクされたノードに基づく無制限のスレッド セーフ キュー。
EventBus.java の 151 ~ 158 行を参照してください。
/** queues of events for the current thread to dispatch */ private final ThreadLocal<ConcurrentLinkedQueue<EventWithHandler>> eventsToDispatch = new ThreadLocal<ConcurrentLinkedQueue<EventWithHandler>>() { @Override protected ConcurrentLinkedQueue<EventWithHandler> initialValue() { return new ConcurrentLinkedQueue<EventWithHandler>(); } };
たとえば、コードをいつでも変更して使用できますArrayBlockingQueue
。ディスラプターなど、類似した他のソリューションを調べましたか?
特定のシナリオでは、無制限のキューが不利であると見なされる可能性があるという Arjit に同意します。たとえば、さまざまなソースからのメッセージを消費して処理するサービスを実行していて、着信メッセージのレートがわからない場合です。ワーカー/コンシューマーの処理速度を超える可能性があるため、次の契約を確立する必要があるかもしれません: 保留中のメッセージがまだ多数ある場合、ワーカーへの新しいメッセージの投稿は失敗するか、ブロックされます。これにより、メモリ不足を防ぐだけでなく、特定の時間枠内でメッセージが実際に処理されることが保証されます。さらに、サービスが限界で実行されている場合、クライアントは直接フィードバックを受け取ります。
@Arjit: https://github.com/bennidi/mbassadorで MBassador を確認できます。
これは Google Guava イベント バスに非常に似ていますが、より多くの機能を提供します。制限付きメッセージ キューはその 1 つです。また、非常に高速であり、その内部設計により、多くのカスタマイズと拡張が可能です。気が付くと、他のユーザーからの機能要求のほとんどに短期間で対応することができました。多分あなたはそれを試してみてください。