如何在 JMeter 中处理多个 MQ 连接和会话管理?

How to handle multiple MQ connections and sessions management inside JMeter?

this 文章中的信息提供的帮助开始,我使用 JMeter 和 JSR223 采样器实现了 IBM MQ 点对点测试解决方案,线程间通信插件在消费者和生产者之间传递信息线程和堆栈溢出社区中一些很棒的人的帮助。除了上述文章之外的主要特征是,此解决方案将生产者线程组创建的线程与消费者线程组中的线程同步,以计算将特定消息从一个请求队列放入另一个响应队列所花费的时间。 在这个解决方案中,我只为生产者线程组内的“请求生产”线程使用一个连接和会话,为“请求消费”线程使用另一个连接和会话。这些连接和会话是在开始时创建的。

在测试开始时只执行一次的生产者设置线程组以创建这 3 个对象的这些行结束,我可以在生产者线程组中获取这些对象并使用它们来生成一个或多个消息并发送到一个输入队列:

System.getProperties().put("SessionInbound", sessInboundQueue)
System.getProperties().put("ConnectionInbound", connInboundQueue)
System.getProperties().put("DestinationInbound", destinationInboundQueue)

类似地,在测试开始时只执行一次的“consumer setUp Thread group”以创建这 3 个对象的这些行结束,我可以在 Consumer Thread 组中获取这些对象并使用它们来消费一个或来自输出队列的更具体的消息:

System.getProperties().put("SessionOutbound", sessOutboundQueue)
System.getProperties().put("ConnectionOutbound", connOutboundQueue)
System.getProperties().put("DestinationOutbound", destinationOutboundQueue)

然后,在 Producer 中我基本上是这样做的:

def sessInboundQueue = System.getProperties().get("SessionInbound")
def destinationInboundQueue = System.getProperties().get("DestinationInbound")

producer = sessInboundQueue.createProducer(destinationInboundQueue)
...
producer.close()

而且,在 Consumer 中,我基本上是这样做的:

def sess = System.getProperties().get("SessionOutbound")
def destination = System.getProperties().get("DestinationOutbound")

consumer = sess.createConsumer(destination, "JMSCorrelationID='" + inboundMessageId + "'" )
....
consumer.close()

在测试的最后,我有 2 个 tearDown 线程组:一个用于最初在 setUp 线程组中创建的 InboundQueue 连接,一个用于 OutboundQueue 连接:

System.getProperties().get("SessionInbound").close()
System.getProperties().get("ConnectionInbound").close()



System.getProperties().get("SessionOutbound").close()
System.getProperties().get("ConnectionOutbound").close()

因此,我基本上使用了一个连接和会话对象,通过它发送所有线程,这些线程每秒在输入队列 1 上放置许多消息,以及一个连接和会话对象,通过它我从输出队列 1 获取许多目标消息。

现在,问题是我还应该测试系统处理同时通过多个连接发出的多个并发请求的能力。

我认为只使用一个连接可能是一个瓶颈,而且为每个线程创建一个连接也太多了。

我需要这样的东西 table 我在下面做了。目前我只处理第一行,除了所有请求者使用相同的连接(请求者只是有效负载中的一些字符串值)。

我的想法是,我应该定义不同的连接详细信息并将它们包装在 producer1-N 和 consumer1-N 下,并基于每个 Requester1-N 字符串(CSV 文件中的每个线程都不同),根据上述 excel 映射使用所需的生产者 1-N 和消费者 1-N(sends/consumes to/from 队列 1-N)。

如有任何建议,我将不胜感激。

您的 JMeter 测试必须尽可能接近 real-life 系统使用情况,因此您需要打开尽可能多的连接,因为上游系统将打开并发送相同数量的相同大小的消息在现实中。

我不知道你到底想测试什么(希望它不是 IBMMQ 本身)因此无法提出全面的解决方案,我能想到的选项是:

  1. 每个 JMeter 线程(虚拟用户)都是一个单独的上游组件,它向 IBMMQ 实例发送消息,在这种情况下,您需要为每个虚拟用户创建一个 Producer 实例。只需将当前线程号作为前缀或后缀添加到保存会话的属性中,即代替:

    props.put("SessionInbound", sessInboundQueue)
    

    做类似的事情:

    props.put("SessionInbound_" + ctx.getThreadNum(), sessInboundQueue)
    

    其中 ctx stands for JMeterContext class instance, see JavaDoc 有关所有可能功能的完整文档

  2. 打开连接是一个相当“昂贵”的过程,这就是为什么普通开发人员会选择 Connection Pool pattern, most probably real producers will have this implemented somehow so you need to know the details and configure your JMeter script accordingly. Check out Connection pooling in IBM MQ classes for Java and Examples of using the connection pool. If you like to copy and paste the code you can get some from Supplying a different connection pool in IBM MQ classes for Java 页面