デフォルトでは、activemq は tcp プロトコルを使用します。しかし今、sslを使用するように変更しました。
パブリッシャーとサーバーを 1 台のマシンに配置しても、速度に違いはありません。しかし、それらを別のマシンに展開した後、tcp を使用するよりも ssl を使用する方がはるかに遅くなります。これは正常ですか?そうでない場合、私のコードのどこが間違っているのでしょうか?
ありがとう。
アプリケーションの動作がどれだけ遅いかによって異なります。
膨大な量のデータ ボリュームを処理する場合、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();
}
}