Play WebSocket 客户端用于负载测试另一个 Play WebSocket 服务器应用程序

Posted

技术标签:

【中文标题】Play WebSocket 客户端用于负载测试另一个 Play WebSocket 服务器应用程序【英文标题】:Play WebSocket client for load testing another play websocket server app 【发布时间】:2014-03-08 19:21:27 【问题描述】:

我们有一个现有的播放服务器应用程序,移动客户端通过网络套接字(双向通信)与之通信。现在作为负载测试的一部分,我们需要模拟数百个客户端对服务器的请求。

我正在考虑编写一个单独的播放客户端(不露面)应用程序,并以某种方式循环向服务器应用程序发出 100 多个请求?鉴于我是网络套接字的新手,这种方法听起来合理吗?

另外,编写一个不露面的 Web 套接字客户端向 Web 套接字服务器发出 Web 套接字请求的最佳方法是什么?

【问题讨论】:

【参考方案1】:

如果您想正确验证应用程序的性能,以下几点非常重要: 通过模拟真实的“websocket”连接来模拟真实用户的行为 - 利用 websocket 通道在应用程序上重现真实的最终用户旅程 生成正确的用户工作流程(用户在接收 websocket 消息时执行的操作)非常重要。例如,在投注应用程序中,用户根据浏览器接收到的消息与应用程序进行交互。

为了能够生成真实的负载测试,我建议使用支持 Websocket 的真实负载测试软件。它将允许您生成不同类型的用户,使用不同类型的网络,不同类型的浏览器....等 您的应用程序使用什么框架?根据框架,我可以推荐适合您需要的工具。

【讨论】:

【参考方案2】:

您必须区分数百个客户端和来自同一客户端的数百个请求。 当您有数百个客户时,请求可以同时进来。 当您只有一个客户端时,请求将主要按顺序(取决于使用一个或多个线程)。

当您只有一个客户端时,您可以完美地使用循环发送请求。您将在这里实际测量的是服务器的处理延迟。

当您想模拟多个客户端时,这有点困难。如果你从一台机器上模拟它们,请求会通过网卡流水线化,因此请求并不是真正并行发送的。此外,您还受到机器带宽的限制。假设服务器有一个 1Gb 的连接,而您的测试机器有一个 1Gb 的连接,那么您永远不会过载服务器的带宽。如果您的客户端应该具有像 50Mb 这样的有限带宽,那么您可以运行 20 个客户端(不考虑通过网卡发生的序列化)。 理论上,您应该使用与要测试的客户端数量一样多的机器。实际上,您将使用多台机器,每台机器运行有限数量的客户端。

关于无头测试应用程序,您可以使用无头浏览器测试框架,如PhantomJS。

【讨论】:

并行与否不是问题,因为此测试的座右铭是查看服务器如何抵御不同客户端的 100 个 websocket 连接。这可以通过连接一个单独的测试播放应用程序以在没有多台机器的情况下生成新的连接请求来实现/模拟吗?【参考方案3】:

我使用 Node.js 编写了一个简单的 websocket 客户端。 如果服务器已打开并准备好接受请求,那么您可以按如下方式触发请求,

const WebSocket = require('ws')

 const url = ws://localhost:9000/ws
 const connection = new WebSocket(url)

 connection.onopen = () => 
    for (var i=0;i<100;i++) 
        connection.send('hello')
    
 

 connection.onmessage = (event) => 
    console.log(event.data)
 

 connection.onerror = (error) => 
    console.log(`WebSocket error: $error`)
 

【讨论】:

以上是关于Play WebSocket 客户端用于负载测试另一个 Play WebSocket 服务器应用程序的主要内容,如果未能解决你的问题,请参考以下文章

Playframework 推送到 Websocket

Play Framework 2.3 和 javascript websocket 客户端库

负载测试websocket服务器?

在 PlayFramework 中测试 WebSocket

Play Framework,Scala - 仅当有新数据可用时才向客户端发送 websocket 消息

如何使用 JMeter 对 Websocket 进行负载测试?