KnowledgeHub
Questions
Tags
Users
Search
Alex Rivera
|
Logout
Edit Question
Title
Body
Here is what I'm trying to do: I'm developing a Node.js http server, which will hold long connections for pushing purpose(collaborate with redis) from tens of thousands of mobile clients in a single machine. Test environment: 1.80GHz*2 CPU/2GB RAM/Unbuntu12.04/Node.js 0.8.16 At the first time, I used "express" module, with which I could reach about 120k concurrent connections before swap being used which means the RAM is not enough. Then, I switched to native "http" module, I got the concurrency up to about 160k. But I realized that there are still too many functionality I don't need in native http module, so I switched it to native "net" module(this means I need to handle http protocol by myself, but that's ok). now, I can reach about 250k concurrent connections per single machine. Here is the main structure of my code: var net = require('net'); var redis = require('redis'); var pendingClients = {}; var redisClient = redis.createClient(26379, 'localhost'); redisClient.on('message', function (channel, message) { var client = pendingClients[channel]; if (client) { client.res.write(message); } }); var server = net.createServer(function (socket) { var buffer = ''; socket.setEncoding('utf-8'); socket.on('data', onData); function onData(chunk) { buffer += chunk; // Parse request data. // ... if ('I have got all I need') { socket.removeListener('data', onData); var req = { clientId: 'whatever' }; var res = new ServerResponse(socket); server.emit('request', req, res); } } }); server.on('request', function (req, res) { if (res.socket.destroyed) { return; } pendingClinets[req.clientId] = { res: res }; redisClient.subscribe(req.clientId); res.socket.on('error', functi
Tags (comma-separated)
Save Edits
Cancel