使用Jmeter的Websocket:获取性能数字

问题:

我最近遇到了一个问题,该问题需要针对多个用户测试SockJs / Stomp Spring Websocket代理的性能。 由于WebSocket本质上是异步的,因此它比常规的http / https请求-响应测试更加棘手。

解:

好了,无需解释为什么Jmeter是执行这种测试的很好的工具,但是需要一个插件使用stomp协议与Jmeter建立与服务器的websocket连接。

在这里,我发现此插件非常有用,因为它确实处理了与服务器层建立Stomp协议连接的样板代码。

但是这个插件有一个局限性,一旦它创建了连接并订阅了一个websocket主题,它便进入睡眠状态,一旦它出来,它将在睡眠时间内打印所有接收到的消息并结束其执行。

这通常不适用于交互式应用程序,在这些应用程序中,我们的Websocket会根据其他用户的各种活动/当前用户执行的活动不断接收通知,而不会停止其他屏幕功能。

因此,我们需要对上述插件进行更改,以便websocket继续监听消息,而我们的应用程序继续执行其他各种活动。

实现方法非常简单:

a)更改SockJsSampler.java文件,以最后删除websocket的休眠和关闭。 它基本上是181和182行。

b)编写一个扩展AbstractJavaSamplerClient.java的新Java类。 该类负责侦听进入您的网络套接字的消息。

c)现在我们有2个Sampleres(一个用于websocket,一个用于从websocket监听,它们可以通过队列连接。在我的情况下,我使用ArrayBlockingQueue)

d)修改SockJsSampler以将消息放入此ArrayBlockingQueue中 这可以在handleframe方法中的插件的SockJsWebsocketSubscriptionHandler类中完成。

因此,想法是在线程组执行开始时创建一次Websocket连接,并继续用传入消息填充队列,并且在测试计划的各个点上,使用在(b)点中创建的新示例作为Jmeter Java Request Sampler来读取消息从队列中验证数据。

关于在websocket上接收消息所花费的时间,我们可以开始捕获自定义采样器启动时的时间,并减去接收到其预期消息时的时间。 使用SampleResult API的result.sampleStart()和result.sampleEnd()可以更轻松地完成此操作,当您从AbstractJavaSamplerClient扩展此类时,该方法将在runTest方法中继承。

注意 :如果要运行多于1个线程的线程组来模拟多个用户,则可能必须为每个线程设置1个ArrayBlockingQueue ,以便不同线程的侦听器无法读取消息。 这很重要,因为我们需要记住,我们只有1个websocket连接,所有线程都共享。 如果您打算让所有线程都拥有自己的websocket连接,那么您不必担心这一点。

翻译自: https://www.javacodegeeks.com/2019/08/websockets-jmeter-getting-performance-numbers.html

你可能感兴趣的:(使用Jmeter的Websocket:获取性能数字)