Jms 使用ActiveMQ获得比RabbitMQ更好的性能
我想知道,与RabbitMQ相比,使用ActiveMQ实现更快的原始消息传递吞吐量(对于发布和消费而言)是否不同寻常?我这么问是因为我遇到的其他在线参考都夸耀RabbitMQ更快 我没有使用合法的基准测试工具进行测试;相反,我修改了基本的发布者/消费者示例,以测试100000条具有3KB消息正文的消息。请注意,我正在跨两个不同的AmazonEC2X-large实例测试发布和消费。也许我没有正确设置代码?请参阅下面我的结果和代码Jms 使用ActiveMQ获得比RabbitMQ更好的性能,jms,activemq,rabbitmq,messaging,amqp,Jms,Activemq,Rabbitmq,Messaging,Amqp,我想知道,与RabbitMQ相比,使用ActiveMQ实现更快的原始消息传递吞吐量(对于发布和消费而言)是否不同寻常?我这么问是因为我遇到的其他在线参考都夸耀RabbitMQ更快 我没有使用合法的基准测试工具进行测试;相反,我修改了基本的发布者/消费者示例,以测试100000条具有3KB消息正文的消息。请注意,我正在跨两个不同的AmazonEC2X-large实例测试发布和消费。也许我没有正确设置代码?请参阅下面我的结果和代码 ActiveMQ Send 3kb Average Time
ActiveMQ Send 3kb
Average Time per Message (ns): 497276.1179
Average # Messages per second: 2010.935101
Total Time (s): 49.72810906
ActiveMQ Recv 3kb
Average Time per Message (ns): 43813.35476
Average # Messages per second: 22823.86285
Total Time (s): 4.381379289
RabbitMQ Send 3kb
Average Time per Message (ns): 1041524.626
Average # Messages per second: 960.1309229
Total Time (s): 104.1524626
RabbitMQ Recv 3kb
Average Time per Message (ns): 612559.3732
Average # Messages per second: 1632.494814
Total Time (s): 61.25593732
删除RabbitMQ Send.java&Recv.java中的queueDeclare()后更新的数字:
这大大提高了RabbitMQ的时间,但必须关闭某些东西,ActiveMQ的使用时间只有4秒
ActiveMQ Send 3kb
Average Time per Message (ns): 491404.5666
Average # Messages per second: 2034.983124
Total Time (s): 49.14045666
ActiveMQ Recv 3kb
Average Time per Message (ns): 41976.17158
Average # Messages per second: 23823.03965
Total Time (s): 4.197617158
RabbitMQ Send 3kb
Average Time per Message (ns): 354795.8818
Average # Messages per second: 2818.522005
Total Time (s): 35.47958818
RabbitMQ Recv 3kb
Average Time per Message (ns): 440349.3892
Average # Messages per second: 2270.924009
Total Time (s): 44.03493892
ActiveMQ Send.java
public class Send implements Runnable {
private final static int NUMBER_OF_MESSAGES = 100000;
private static long startTime = 0;
private static long stopTime = 0;
private static long totalTime = 0;
public static void main(String[] argv) throws java.io.IOException {
(new Thread(new Send())).start();
}
public void run() {
try {
// Create a ConnectionFactory
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
// Create a Connection
Connection connection = connectionFactory.createConnection();
connection.start();
// Create a Session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// Create the destination (Topic or Queue)
Destination destination = session.createQueue("TEST.FOO");
// Create a MessageProducer from the Session to the Topic or Queue
MessageProducer producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
for (int i=0; i <= NUMBER_OF_MESSAGES; i++){
startTime = System.nanoTime();
// 3kb
String text = "AMFu8UlKW2zJBxUQbxNfU3HneB11uEOeC..."
TextMessage message = session.createTextMessage(text);
// Tell the producer to send the message
//System.out.println("Sent message: "+ message.hashCode() + " : " + Thread.currentThread().getName());
producer.send(message);
stopTime = System.nanoTime();
totalTime = totalTime + stopTime-startTime;
System.out.println(i + "," + Long.toString(stopTime-startTime));
}
// Clean up
session.close();
connection.close();
//System.out.println("");
//System.out.println("Total Time: " + totalTime + "ns");
//System.out.println("Avg. Time: " + totalTime/NUMBER_OF_MESSAGES + "ns");
//System.out.println("");
}
catch (Exception e) {
System.out.println("Caught: " + e);
e.printStackTrace();
}
}
}
public class Send implements Runnable {
private final static String QUEUE_NAME = "hello";
private final static int NUMBER_OF_MESSAGES = 100000;
private static long startTime = 0;
private static long stopTime = 0;
private static long totalTime = 0;
// 3kb
private static final String message = "AMFu8UlKW2zJB..."
public static void main(String[] argv)
throws java.io.IOException {
(new Thread(new Send())).start();
}
public void run() {
try {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
for (int i=1; i <= NUMBER_OF_MESSAGES; i++){
startTime = System.nanoTime();
// No Persistence
// channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
stopTime = System.nanoTime();
totalTime = totalTime + stopTime-startTime;
System.out.println(i + "," + Long.toString(stopTime-startTime));
}
channel.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
private final static String QUEUE_NAME = "hello";
private static long startTime = 0;
private static long stopTime = 0;
private static long totalTime = 0;
private static int numMessages = 0;
public static void main(String[] argv) {
(new Thread(new Recv())).start();
}
public void run(){
try {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("x.x.x.x");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
// No Persistence
// channel.queueDeclare(QUEUE_NAME, false, false, false, null);
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(QUEUE_NAME, true, consumer);
while (true) {
startTime = System.nanoTime();
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
stopTime = System.nanoTime();
totalTime = totalTime + stopTime-startTime;
System.out.println(numMessages + "," + Long.toString(stopTime-startTime));
numMessages++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
RabbitMQ Send.java
public class Send implements Runnable {
private final static int NUMBER_OF_MESSAGES = 100000;
private static long startTime = 0;
private static long stopTime = 0;
private static long totalTime = 0;
public static void main(String[] argv) throws java.io.IOException {
(new Thread(new Send())).start();
}
public void run() {
try {
// Create a ConnectionFactory
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616");
// Create a Connection
Connection connection = connectionFactory.createConnection();
connection.start();
// Create a Session
Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
// Create the destination (Topic or Queue)
Destination destination = session.createQueue("TEST.FOO");
// Create a MessageProducer from the Session to the Topic or Queue
MessageProducer producer = session.createProducer(destination);
producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
for (int i=0; i <= NUMBER_OF_MESSAGES; i++){
startTime = System.nanoTime();
// 3kb
String text = "AMFu8UlKW2zJBxUQbxNfU3HneB11uEOeC..."
TextMessage message = session.createTextMessage(text);
// Tell the producer to send the message
//System.out.println("Sent message: "+ message.hashCode() + " : " + Thread.currentThread().getName());
producer.send(message);
stopTime = System.nanoTime();
totalTime = totalTime + stopTime-startTime;
System.out.println(i + "," + Long.toString(stopTime-startTime));
}
// Clean up
session.close();
connection.close();
//System.out.println("");
//System.out.println("Total Time: " + totalTime + "ns");
//System.out.println("Avg. Time: " + totalTime/NUMBER_OF_MESSAGES + "ns");
//System.out.println("");
}
catch (Exception e) {
System.out.println("Caught: " + e);
e.printStackTrace();
}
}
}
public class Send implements Runnable {
private final static String QUEUE_NAME = "hello";
private final static int NUMBER_OF_MESSAGES = 100000;
private static long startTime = 0;
private static long stopTime = 0;
private static long totalTime = 0;
// 3kb
private static final String message = "AMFu8UlKW2zJB..."
public static void main(String[] argv)
throws java.io.IOException {
(new Thread(new Send())).start();
}
public void run() {
try {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
for (int i=1; i <= NUMBER_OF_MESSAGES; i++){
startTime = System.nanoTime();
// No Persistence
// channel.queueDeclare(QUEUE_NAME, false, false, false, null);
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
stopTime = System.nanoTime();
totalTime = totalTime + stopTime-startTime;
System.out.println(i + "," + Long.toString(stopTime-startTime));
}
channel.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
private final static String QUEUE_NAME = "hello";
private static long startTime = 0;
private static long stopTime = 0;
private static long totalTime = 0;
private static int numMessages = 0;
public static void main(String[] argv) {
(new Thread(new Recv())).start();
}
public void run(){
try {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("x.x.x.x");
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
// No Persistence
// channel.queueDeclare(QUEUE_NAME, false, false, false, null);
QueueingConsumer consumer = new QueueingConsumer(channel);
channel.basicConsume(QUEUE_NAME, true, consumer);
while (true) {
startTime = System.nanoTime();
QueueingConsumer.Delivery delivery = consumer.nextDelivery();
String message = new String(delivery.getBody());
stopTime = System.nanoTime();
totalTime = totalTime + stopTime-startTime;
System.out.println(numMessages + "," + Long.toString(stopTime-startTime));
numMessages++;
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
嗯,我看了一下你的代码和你的BenchmarkRCK的标记,但只是看了一下Recv way。我看到RabbitMq的数量是ActiveMq的两倍。然后我看到了两者的源代码,并得到了一些警告
在Rabbitqm Recv源代码中,您总是对每条消息执行一个查询声明,如果通信时间是当前的主要延迟时间,请确保ActiveMq比Rabbitmq的两倍时间来自这里。您好,这是一个很好的观察结果。我将注释掉队列声明,并对已声明的队列再次运行测试。我一定会更新结果…谢谢!我在原来的帖子中添加了我的新结果。这确实大大缩短了RabbitMQ的发送时间,它现在显示出比ActiveMQ更快的发送时间。然而,有一件事我仍然无法理解,那就是ActiveMQ对于100000条消息的消耗时间为何只有4秒。我检查了实际收到的消息,它们包含正确的内容。还有其他建议吗?是的,我对你的ActiveMQ比F1更快有一个想法:)。。。我想你应该改变接收一条消息的总时间。当前,您只有一个CPU时间来运行几个操作码,消息已经在接收器内存中!!!看看你的代码。否则,检查一个中间代理的开销的最好方法是将开始时间放入消息中,然后从您的Recv获取它,以计算发送一条消息的真实成本。另一个伟大的观察和想法,我将尝试一下。再次感谢!你为什么没有进口货。。。