【发布时间】:2012-07-09 22:47:24
【问题描述】:
activemq默认使用tcp协议。但是现在,我将其更改为使用 ssl。
如果我将发布者和服务器部署在一台机器上,则速度没有区别。但是在我将它们部署在不同的机器上之后,使用 ssl 比使用 tcp 慢得多。这是正常的吗?如果没有,我的代码可能有什么问题?
谢谢。
【问题讨论】:
activemq默认使用tcp协议。但是现在,我将其更改为使用 ssl。
如果我将发布者和服务器部署在一台机器上,则速度没有区别。但是在我将它们部署在不同的机器上之后,使用 ssl 比使用 tcp 慢得多。这是正常的吗?如果没有,我的代码可能有什么问题?
谢谢。
【问题讨论】:
取决于您的应用程序运行速度有多慢。
如果您处理大量数据,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();
}
}
【讨论】: