我们正在从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上表现出如此糟糕的表现?
测试此消息必须删除