node.js + socket.io:拍卖网站开发

我目前正在使用node.js和socket.io.But拍卖脚本,而使用PHP和MySQL开发网站。 在这里,我只使用node.js + socket.io拍卖出价过程。 在拍卖期间,该网站将有500-1000个login用户查看单个页面。 只有一个项目将在拍卖,它将在一天内出售一次。

我将从服务器向客户端广播(发射)倒数计时器。 在服务器端,我将使用setInterval(),recursionsetTimeout()1秒倒计时到拍卖结束时间。 除此之外,唯一发送的其他消息是当前的出价从单个客户端传递到服务器,然后广播给所有的客户端。 这样做是可靠的吗? 它将能够处理服务器上的使用情况? 在这里我已经testing了500个用户在浏览器中挂起计时器的意思。

Server.js

var cluster = require('cluster'); var app = require('express')(); //var http = require('http'); var https = require('https'); var socket = require('socket.io'); var redis = require('redis'); var redisAdapter = require('socket.io-redis'); var request = require('request'); var fs = require('fs'); var options = { key: fs.readFileSync('keys/e1317_0f2c9_71565598d419e37e376ccef5c2827113.key'), cert: fs.readFileSync('certs/e1317_0f2c9_1468152279_2dc46c1f2cc135a.crt'), ca: fs.readFileSync('cabundles/90490a5c829d2aca24f22b5820864c6e_1935558000.cabundle') }; //var server = http.createServer( app ); var server = https.createServer(options, app); var io = socket.listen(server); var port = process.env.PORT || 8080; var workers = process.env.WORKERS || require('os').cpus().length; var redisUrl = process.env.REDISTOGO_URL || 'redis://127.0.0.1:6379'; var redisOptions = require('parse-redis-url')(redis).parse(redisUrl); var pub = redis.createClient(redisOptions.port, redisOptions.host, { detect_buffers: true, return_buffers: true, auth_pass: redisOptions.password }); var sub = redis.createClient(redisOptions.port, redisOptions.host, { detect_buffers: true, return_buffers: true, auth_pass: redisOptions.password }); io.adapter(redisAdapter({ pubClient: pub, subClient: sub })); console.log('Redis adapter started with url: ' + redisUrl); io.sockets.on('connection', function(client) { //console.log('first'); client.on('nauction', function(data) { io.sockets.emit('nauction', data); }); }); io.on('connection', function(socket) { //console.log('in'); console.log('connected client count:' + io.sockets.sockets.length); var recursive = function() { //console.log("It has been one second!"); if (io.sockets.sockets.length > 0) { request('https://www.example.com/file.php', function(error, response, body) { if (!error && response.statusCode == 200) { data = JSON.parse(body); socket.volatile.emit('auction_data', { 'auction_data': data }); //console.log(data); } else { //console.log('else'); console.log(error); } }); } //else{ //console.log('No clients connected now'); //} setTimeout(recursive, 1000); } recursive(); socket.on("disconnect", function() { console.log('clear interval') //clearInterval(interval); clearTimeout(recursive); }); }); if (cluster.isMaster) { console.log('start cluster with %s workers', workers - 1); workers--; for (var i = 0; i < workers; ++i) { var worker = cluster.fork(); console.log('worker %s started.', worker.process.pid); } cluster.on('death', function(worker) { console.log('worker %s died. restart...', worker.process.pid); }); } else { start(); } function start() { server.listen(port, function() { console.log('listening on *:' + port); }); } 

Client.js

 socket.on('auction_data', function(auction_details) { //console.log(auction_details); $.each(auction_details, function(keys, values) { //countdwon formation var tm, days, hrs, mins, secs; days = value.auction_data.time.days; if (value.auction_data.time.hours < 10) { hrs = ("0" + value.auction_data.time.hours); } else { hrs = value.auction_data.time.hours; } if (value.auction_data.time.mins < 10) { mins = ("0" + value.auction_data.time.mins); } else { mins = value.auction_data.time.mins; } if (value.auction_data.time.secs < 10) { secs = ("0" + value.auction_data.time.secs); } else { secs = value.auction_data.time.secs; } if (days == 0) { tm = '' + hrs + '' + '' + mins + '' + '' + secs + ''; } else { tm = '' + days + '' + '' + hrs + '' + '' + mins + '' + '' + secs + ''; } $('#auction_' + value.auction_data.product_id + " .countdown").html(tm); }); }); 

我正在等待您的答案,以解决浏览器挂起问题。

第一个问题: 这样做是可靠的吗?

每秒向每个客户端发送时间是没有必要的。 只需在第一次访问时向他们发送时间,并使用本地计时器(在本地页面)来减less每秒的时间。

您还需要检查每次出价的服务器时间(更安全)。

如果这对您来说不够“安全”,请将时间与更改的出价一起发送。 您只需发送实际出价,更改时(使用广播)或用户join网站时(只发送给他)。

第二个问题: 它能处理服务器上的使用情况吗?

是和不

如果你的服务器足够好(每5美元的服务器无限stream量将适合),你不应该陷入困境。 只有如果你的剧本非常糟糕,并且有内存泄漏。

现在有几个提示:

  • 永远不要相信用户input – 在使用之前parsing它!
  • 重新计算您从服务器上的客户端获得的所有内容。
  • 只发送客户所需的东西。 他不需要关于他不使用的东西的信息。

如果这是您所希望的答案,请select左侧的绿色箭头。 如果没有,在这里写一个评论,我会给更多的提示。