0

各サブスクライバーがいくつかのタイプのイベントを待機するパブリッシュ/サブスクライブシステムでは、単純なスイッチよりも優れた処理ソリューションがありますか?

Pub1とPub2の2つのパブリッシャーがあるとしましょう。Pub1は2種類のイベントPub1-eventAとPub1-eventBを送信します。これは、Pub2と同じPub2-eventAとPub2-eventBです。

一方、Pub1とPub2のイベントをサブスクライブするクライアントSub1があります。

Sub1リスナーでこれらのイベントをどのように処理しますか?

ここにいくつかの可能性:

1つのリスナー、1つの大きなスイッチ(保守が難しい):

Listener{

  HandleEvent(event){

    if(event.type == Pub1-eventA)
       Action1.execute();
    if(event.type == Pub1-eventB)
       Action2.execute();
    if(event.type == Pub2-eventA)
       Action3.execute();
    if(event.type == Pub2-eventB)
       Action4.execute();

  }

}

1つのリスナーとアソシエーションマップ:

Map<event-type, Action> ActionMap

Listener{

      Action = ActionMap[event-type]

      Action.execute();
}

イベントタイプごとに1つのリスナー:

ListenerPub1-eventA{ check(event-type); Action1.execute(); }
ListenerPub1-eventB{ check(event-type); Action2.execute(); }
ListenerPub2-eventA{ check(event-type); Action3.execute(); }
ListenerPub2-eventB{ check(event-type); Action4.execute(); }
4

1 に答える 1

1

「1つのリスナー、1つの大きなスイッチ」、および「1つのリスナーとアソシエーションマップ」では、各イベントは単一の分離されたメソッドになりますが、コード内でイベントのディスパッチを維持する必要があります。

パブリッシュ/サブスクライブメッセージングシステムの最も重要な貢献は、パブリッシャーとサブスクライバーを分離することです。したがって、メッセージルーティングはミドルウェアの責任である必要があります。ミドルウェアがメッセージルーティングに対応していない場合は、イベントタイプごとに1つのリスナーを使用することをお勧めします。

  1. メッセージのルーティング/ディスパッチを自分で維持する必要はありません
  2. 各リスナーには単一の責任があります
  3. スケールアップシナリオの場合、無関係のリスナーに触れることなく、任意のメッセージタイプのリスナーを追加できます。

それが私が考えることができるすべてです。

これがお役に立てば幸いです。

于 2011-09-16T08:53:11.723 に答える