1

イベントバスhttp://code.google.com/p/guava-libraries/wiki/EventBusExplainedを使用するのが怖いのは、内部で無制限のキューを使用していると思うからです。たくさんのメッセージが投稿されている場合。フルGCになる可能性があります。

無制限のキューと同じことを行う同様の実装が存在しますか?

4

2 に答える 2

3

実際、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ディスラプターなど、類似した他のソリューションを調べましたか?

于 2012-09-11T03:10:05.107 に答える
1

特定のシナリオでは、無制限のキューが不利であると見なされる可能性があるという Arjit に同意します。たとえば、さまざまなソースからのメッセージを消費して処理するサービスを実行していて、着信メッセージのレートがわからない場合です。ワーカー/コンシューマーの処理速度を超える可能性があるため、次の契約を確立する必要があるかもしれません: 保留中のメッセージがまだ多数ある場合、ワーカーへの新しいメッセージの投稿は失敗するか、ブロックされます。これにより、メモリ不足を防ぐだけでなく、特定の時間枠内でメッセージが実際に処理されることが保証されます。さらに、サービスが限界で実行されている場合、クライアントは直接フィードバックを受け取ります。

@Arjit: https://github.com/bennidi/mbassadorで MBassador を確認できます。

これは Google Guava イベント バスに非常に似ていますが、より多くの機能を提供します。制限付きメッセージ キューはその 1 つです。また、非常に高速であり、その内部設計により、多くのカスタマイズと拡張が可能です。気が付くと、他のユーザーからの機能要求のほとんどに短期間で対応することができました。多分あなたはそれを試してみてください。

于 2013-03-04T14:48:22.080 に答える