Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Stress testing in NodeJS/Socket.io for 1000 users?

I'm currently working on a chat-like application. There's users, chatrooms, messages—all that stuff. The app is powered by Node.js and Socket.IO.

One thing I am interested in doing, though, is stress testing the application. The tests that currently exist are simply some feature tests that make use of 1 client. However, I want to do things like test 1000 people logging into the application at the same time, many people entering the chatroom, everyone sending a message in that room, etc...

How do I go about doing this? Google searches appear to bring up unrelated results.

I've noticed that some have identified this as a duplicate. However, that question involves ASP.NET, and the use of Selenium is out of the question. In addition, I originally intended to get answers that involve doing special actions within the node.js framework. Another developer (no longer part of the team) wrote some stress tests that involve defining a custom user object and iteratively signing up those users, joining a room, etc. Those test are incomplete and no longer usable though since much in the codebase has changed since they were written. Anyways an answer that somehow allows for stress testing the application another way is acceptable.

EDIT: Here's my attempt of stress testing with many users.

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.
}

I've found that this turns out to be problematic. The test simply doesn't advance after logging in about 250 users. What is the issue here? Could it have to do with the limitations of node.js and socket.io?

like image 300
MeanStackeD Avatar asked Aug 06 '15 06:08

MeanStackeD


1 Answers

The solution that my team and I ended up going with is as follows:

We defined a Client object in its own file (client.js), with various actions and events defined in response to Socket.IO on events and such. In the test.js file, we would instantiate many instances of a Client object, creating many connections and clients.

The limitations that we encountered likely involve the capabilities of the computer that runs the tests (the device that hosts the server can run the test with 1000 users, though).

like image 73
MeanStackeD Avatar answered Oct 29 '22 14:10

MeanStackeD