2016-09-29 4 views
0

私は、1つ以上のJMSトピックをリッスンするSpringブートアプリケーションを作成しています。私たちは、JMS実装のためにActiveMQを選択しました。パフォーマンスの向上:単一のJMSトピックにswitch文を使用するか、個々のトピックを使用するか?

主な懸念事項は、パフォーマンスとスケーラビリティです。毎秒何千ものメッセージが到着する可能性があります。

  1. 単一のトピックと単一の@JmsListenerメソッドを使用します。リスナーの内部では、JMSプロパティを調べて、メッセージを処理するための正しい戦略を判断します。

    @JmsListener(destination = "response", containerFactory = "myTopicFactory") 
    public void onMessage(Message message) throws IOException { 
        message.getProperty("message.type") 
        JmsHandler handler = messageStrategyMap.get(messageType); 
        handler.handle(message); 
    } 
    
  2. 複数のトピックと複数の@JmsListenerメソッドを使用します。この場合、スイッチングロジックは不要です。

    @JmsListener(destination = "responseType1", containerFactory = "myTopicFactory") 
    public void onMessage1(Message message) throws IOException { 
        // Handle message type 1 
    } 
    
    @JmsListener(destination = "responseType2", containerFactory = "myTopicFactory") 
    public void onMessage2(Message message) throws IOException { 
        // Handle message type 2 
    } 
    

アプローチ#1の利点は、複数の宛先のためのリソースを管理する必要がないということです。目的地は1つだけです。これは、共同システムが単一のトピックについて知る必要があることを意味します。

アプローチ#2の利点は、どのようなタイプのスイッチングロジックも必要ないことです。トピックAに入ってくるメッセージには、トピックA用に特別にフォーマットされたペイロードがあります。このアプローチの懸念は、着信メッセージを処理するためのリソースが異なるJMSリスナー間で効率的に割り当てられない可能性があることです。

さらに、コンテナの出荷時の設定に関するアドバイスをいただければ幸いです。

答えて

1

メッセージのサイズと量によって異なります。複数のリスナーを使用すると、複数のスレッドも取得されます。そのため、トピック(スレッド)がたくさんあることがなくなるまで、より高速に実行される可能性があります。私はあなたの代表的なシステムで簡単なテストとベンチマークを設定することをお勧めします。あなたは比較する会社の番号で武装するでしょう。

関連する問題