1

デフォルトでは、activemq は tcp プロトコルを使用します。しかし今、sslを使用するように変更しました。

パブリッシャーとサーバーを 1 台のマシンに配置しても、速度に違いはありません。しかし、それらを別のマシンに展開した後、tcp を使用するよりも ssl を使用する方がはるかに遅くなります。これは正常ですか?そうでない場合、私のコードのどこが間違っているのでしょうか?

ありがとう。

4

1 に答える 1

3

アプリケーションの動作がどれだけ遅いかによって異なります。

膨大な量のデータ ボリュームを処理する場合、SSL はデータを暗号化 (および復号化) するためにかなりの量の CPU サイクルを必要とします。遅いのは ActiveMQ サーバーですか、それともクライアントですか。システム設定をプロファイリングして、ボトルネックを見つける場所の概要を取得します。

別の可能性は、頻繁な握手です。メッセージごとに接続を開いてメッセージを送信するクライアント コード (投稿できますか?) を例にとると、プレーンな tcp と比較して SSL ハンドシェイク時間が長くなるため、メッセージ送信の遅延が発生する可能性があります。

アップデート:

スピードアップは、接続を再利用することです。あなたのケースで送信されるすべてのメッセージに対してSSLハンドシェイクを実行する必要があります。これには、CPUの高価な非対称暗号と、プレーンTCPよりも数回多くのtcpラウンドトリップが含まれます。activemq が提供するプーリング接続ファクトリーを使用すると、簡単に実行できます。この例は、コードをあまり変更しません。

public class MySender{
 private static ConnectionFactory factory = new org.apache.activemq.pool.PooledConnectionFactory("ssl://192.168.0.111:61616");
 public void send(){
  Connection connection = factory.createConnection();
  Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
  Topic topic = session.createTopic(newDataEvent.getDataType().getType());
  MessageProducer producer = session.createProducer(topic);
  TextMessage message = session.createTextMessage();
  message.setText(xstream.toXML(newDataEvent));
  producer.send(message);
  session.close();
  connection.close(); 
 }
}
于 2012-07-09T09:46:43.893 に答える