Amazon MQ(ActiveMQ)对大消息的性能不佳

问题描述 投票:0回答:1

我们正在从IBM MQ迁移到Amazon MQ,至少我们希望这样做。问题是,与IBM MQ相比,当使用JMS生产者将大消息放入队列时,Amazon MQ的性能很差。

关于IBM MQ,所有消息都是持久性的,并且系统是高可用性的,而Amazon MQ是多可用区。

如果将这种大小的XML文件放入IBM MQ(2 cpu和8GB RAM HA实例),我们将具有以下性能:

256 KB = 15ms
4,6 MB = 125ms
9,3 MB = 141ms 
18,7 MB = 218ms
37,4 MB = 628ms
74,8 MB = 1463ms

如果将相同的文件放在Amazon MQ(mq.m5.2xlarge = 8 CPU和32 GB RAM)或ActiveMQ上,我们将具有以下性能:

256 KB = 967ms
4,6 MB = 1024ms
9,3 MB = 1828ms 
18,7 MB = 3550ms
37,4 MB = 8900ms
74,8 MB = 14405ms

[我们还看到,IBM MQ在将消息发送到队列和从队列中获取消息的响应时间相同,而Amazon MQ在获取消息方面确实非常快(例如仅需1毫秒),但是非常慢发送时。

在Amazon MQ上,我们使用OpenWire协议。我们以Terraform样式使用此配置:

resource "aws_mq_broker" "default" {
  broker_name                = "bernardamazonmqtest"
  deployment_mode            = "ACTIVE_STANDBY_MULTI_AZ"
  engine_type                = "ActiveMQ
  engine_version             =  "5.15.10"
  host_instance_type         =  "mq.m5.2xlarge"
  auto_minor_version_upgrade =  "false"
  apply_immediately          =  "false"
  publicly_accessible        =  "false"
  security_groups            = [aws_security_group.pittensbSG-allow-mq-external.id]
  subnet_ids                 = [aws_subnet.pittensbSN-public-1.id, aws_subnet.pittensbSN-public-3.id]

  logs {
    general = "true"
    audit   = "true"
  }

我们通过POM(Maven)将Java 8与JMS ActiveMQ库一起使用:

<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-client</artifactId>
    <version>5.15.8</version>
</dependency>
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-pool</artifactId>
    <version>5.15.8</version>
</dependency>

在JMS中,我们有以下Java代码:

private ActiveMQConnectionFactory mqConnectionFactory;
private PooledConnectionFactory mqPooledConnectionFactory;
private Connection connection;
private Session session;
private MessageProducer producer;
private TextMessage textMessage;
private Queue queue;

this.mqConnectionFactory = new ActiveMQConnectionFactory();
this.mqPooledConnectionFactory = new PooledConnectionFactory();
this.mqPooledConnectionFactory.setConnectionFactory(this.mqConnectionFactory);

this.mqConnectionFactory.setBrokerURL("ssl://tag-1.mq.eu-west-1.amazonaws.com:61617");

this.mqPooledConnectionFactory.setMaxConnections(10);

this.connection = mqPooledConnectionFactory.createConnection());
this.connection.start();

this.session = this.connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
this.session.createQueue("ExampleQueue");

this.producer = this.session.createProducer(this.queue);
producer.send("XMLFile.xml");  // here we send the files

// close session, producer and connection 

我们也已经作为单一实例AmazonMQ运行了性能测试。但是结果相同。我们还使用mq.m5.4xlarge(16 cpu,96 GB RAM)引擎运行了性能测试,但仍无法改善不良性能。

性能测试配置:我们首先将上述消息(XML文件)一一推送到队列中。我们做了5次。 5次后,我们从队列中读取了这些消息(XML文件)。我们称之为1个周期。

[我们一个接一个地运行10个周期,因此总共将300个文件推送到队列中,并且从队列中获取了300个文件。

我们并行运行3个测试:一个来自AWS Region Londen,一个来自AWS Region Frankfurt在不同的VPC中,另一个来自Frankfurt在与Amazon MQ代理相同的VPC和同一子网中。 Alle客户端在EC2实例上运行:m4.xlarge。

[如果我们仅使用一个VPC(例如仅使用与AmazonMQ代理位于同一子网中的本地VPC进行测试,则性能将得到改善,我们将得到以下结果:

256 KB = 72ms
4,6 MB = 381ms
9,3 MB = 980ms 
18,7 MB = 2117ms
37,4 MB = 3985ms
74,8 MB = 7781ms

客户端和服务器位于同一子网中,因此与防火墙等无关。

也许有人可以告诉我出什么问题了,为什么我们在Amazon MQ或ActiveMQ上表现出如此糟糕的表现?

jms activemq amazon-mq
1个回答
0
投票

测试此消息必须删除

© www.soinside.com 2019 - 2024. All rights reserved.