在 NodeJS/Socket.io 中对 1000 个用户进行压力测试?
Stress testing in NodeJS/Socket.io for 1000 users?
我目前正在开发一个类似聊天的应用程序。有用户、聊天室、消息——所有这些东西。该应用程序由 Node.js 和 Socket.IO.
提供支持
不过,我有兴趣做的一件事是对应用程序进行压力测试。当前存在的测试只是一些使用 1 个客户端的功能测试。但是,我想做一些事情,比如测试 1000 人同时登录应用程序,很多人进入聊天室,每个人都在那个房间里发消息,等等......
我该怎么做? Google 搜索似乎带来了不相关的结果。
我注意到有些人认为这是重复的。但是,那个问题涉及到ASP.NET,使用Selenium是不行的。此外,我原本打算获得涉及在 node.js 框架 内执行 特殊操作的答案。另一位开发人员(不再是团队的一员)编写了一些压力测试,涉及定义自定义用户对象并迭代地注册这些用户、加入房间等。这些测试不完整且不再可用,因为代码库中的许多内容已更改因为他们是写的。无论如何,以某种方式允许以另一种方式对应用程序进行压力测试的答案是可以接受的。
编辑:这是我对许多用户进行压力测试的尝试。
function client() {
// Define a testing client that responds to socket io events and the like
}
...
testers = [];
for (int i = 0; i <= 1000; i++) testers.push(new client());
// Each client connects to server with option 'force new connection: true'
it('Should login many users simultaneously') {
// Use async.each on testers
// Use client.login() on each client.
}
我发现这是有问题的。在登录大约 250 个用户后,测试根本就没有进行。这里的问题是什么?会不会跟node.js和socket.io的限制有关?
您可以使用 Apache JMeter 工具,您可以使用单个客户端模拟 N 个并发用户。
我和我的团队最终采用的解决方案如下:
我们在其自己的文件 (client.js 中定义了一个 Client 对象,其中定义了各种动作和事件以响应 Socket.IO on 事件等。在 test.js 文件中,我们将实例化一个 Client 对象的许多实例,创建许多连接和客户端。
我们遇到的限制可能涉及 运行 进行测试的计算机的功能(不过,托管服务器的设备可以 运行 对 1000 个用户进行测试)。
例如,使用 Apache ab。
只需创建一个 API(仅用于测试目的)并使用该 API 的端点从 apache ab 发送大量消息。
ab -n 1000 -c 10 -T 'multipart/form-data; boundary=1234567890' -p post.txt http://yourdomain.com/yourproject/api/sendmessage/
而 post.txt 将包含如下内容:
--1234567890
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
from=myId&to=yourId&message=alrighty
<base64 data>
--1234567890
其中 base64 数据 应该是一个长字符串,表示 (base64) POST 请求的数据。
我目前正在开发一个类似聊天的应用程序。有用户、聊天室、消息——所有这些东西。该应用程序由 Node.js 和 Socket.IO.
提供支持不过,我有兴趣做的一件事是对应用程序进行压力测试。当前存在的测试只是一些使用 1 个客户端的功能测试。但是,我想做一些事情,比如测试 1000 人同时登录应用程序,很多人进入聊天室,每个人都在那个房间里发消息,等等......
我该怎么做? Google 搜索似乎带来了不相关的结果。
我注意到有些人认为这是重复的。但是,那个问题涉及到ASP.NET,使用Selenium是不行的。此外,我原本打算获得涉及在 node.js 框架 内执行 特殊操作的答案。另一位开发人员(不再是团队的一员)编写了一些压力测试,涉及定义自定义用户对象并迭代地注册这些用户、加入房间等。这些测试不完整且不再可用,因为代码库中的许多内容已更改因为他们是写的。无论如何,以某种方式允许以另一种方式对应用程序进行压力测试的答案是可以接受的。
编辑:这是我对许多用户进行压力测试的尝试。
function client() {
// Define a testing client that responds to socket io events and the like
}
...
testers = [];
for (int i = 0; i <= 1000; i++) testers.push(new client());
// Each client connects to server with option 'force new connection: true'
it('Should login many users simultaneously') {
// Use async.each on testers
// Use client.login() on each client.
}
我发现这是有问题的。在登录大约 250 个用户后,测试根本就没有进行。这里的问题是什么?会不会跟node.js和socket.io的限制有关?
您可以使用 Apache JMeter 工具,您可以使用单个客户端模拟 N 个并发用户。
我和我的团队最终采用的解决方案如下:
我们在其自己的文件 (client.js 中定义了一个 Client 对象,其中定义了各种动作和事件以响应 Socket.IO on 事件等。在 test.js 文件中,我们将实例化一个 Client 对象的许多实例,创建许多连接和客户端。
我们遇到的限制可能涉及 运行 进行测试的计算机的功能(不过,托管服务器的设备可以 运行 对 1000 个用户进行测试)。
例如,使用 Apache ab。
只需创建一个 API(仅用于测试目的)并使用该 API 的端点从 apache ab 发送大量消息。
ab -n 1000 -c 10 -T 'multipart/form-data; boundary=1234567890' -p post.txt http://yourdomain.com/yourproject/api/sendmessage/
而 post.txt 将包含如下内容:
--1234567890
Content-Type: application/x-www-form-urlencoded
Content-Length: 30
from=myId&to=yourId&message=alrighty
<base64 data>
--1234567890
其中 base64 数据 应该是一个长字符串,表示 (base64) POST 请求的数据。