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

     2023-03-07     306

关键词:

【中文标题】node.js + socket.io:拍卖网站开发【英文标题】:node.js + socket.io: auction website development 【发布时间】:2016-05-01 19:00:48 【问题描述】:

我目前正在使用 node.js 和 socket.io 编写拍卖脚本。但是该网站是使用 PHP 和 MySQL 开发的。在这里,我仅将 node.js + socket.io 用于拍卖投标过程。该网站将有 500-1000 名登录用户在拍卖期间查看单个页面。只有一件物品将被拍卖,并且将在一天内出售一次。

我将向从服务器到客户端的所有用户广播(发射)一个倒数计时器。在服务器端,我将使用 setInterval()、1 秒的递归 setTimeout() 来倒计时拍卖结束时间。除此之外,唯一发送的其他消息将是当前出价从单个客户端传递到服务器,然后广播给所有人。这种方式做的靠谱吗?它是否能够处理服务器上的使用情况?在这里,我测试了 500 个用户意味着浏览器中的计时器挂起。

服务器.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);
    );
);

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

【问题讨论】:

没有有效的指标可以给你一个yesno 的答案。从硬件到实际的高峰时间连接,所需的带宽等,甚至没有被问到的问题太多了。在没有首先收集所有信息的情况下问这些问题是不现实的。如果您需要准确的答案,请聘请公司进行审计。如果你买不起,那就试着衡量自己。无论你多么想得到一个,你都不会得到关于 SO 的正确答案。 作为一名 NodeJS 开发人员,我可以告诉你创建模块会更好。带有原型的对象。它极大地增加了代码的可读性! @Mijago,感谢您的建议,我也会尝试使用模块和更多的东西。因为我目前正在学习 node.js 并从事该项目。 @mjh,我不明白你对有效指标的看法 什么不清楚?你没有提供任何可用的数字?您没有提供一个数字(指标)来帮助我们告诉您您想听到什么。信息不足。 【参考方案1】:

第一个问题: 这种方法可靠吗?

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

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

如果这对您来说不够“安全”,请发送更改出价的时间。您只需在实际出价发生变化时(使用广播)或用户加入网站时(只需将其发送给他)发送实际出价。

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

是和否。

如果您的服务器足够好(每台 5 美元且流量无限的服务器都适合), 你不应该惹上麻烦。仅当您的脚本非常糟糕并且存在内存泄漏时。

现在有一些提示:

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

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

【讨论】:

嗨 Mijago,在使用集群进程之前,站点处理 300-400 个用户正确计时器工作,让超过 400 个用户的网站挂起。在使用集群和 redis pub sub 更改流程后,无法正确处理 5 个用户。我不知道本地计时器是如何工作的,它需要根据特定的国家时区工作。 不,它不需要处理时区,你给他们拍卖结束的秒数,然后用计时器倒计时到零。 此外,我在这里解释我的网站在计时器中的投标过程少于 15 秒,如果用户下标意味着需要重置计时器,时间为 15 秒,并向所有用户提供拍卖价格和历史详细信息(谁都打开了网站)。此外,如果计时器达到 0 意味着需要关闭该拍卖的出价,它将如何完成此过程? 如果超过 500 个用户的网站挂起,则在不使用集群进程服务器的情况下仅处理 400-500 个用户的网站。但是在添加集群后,redis 方法与 server.js 然后网站 10 个用户仅处理和计时器倒计时无法正常工作。如果我们使用集群进程意味着它使用实时服务器创建 10 个子进程,那么这会导致问题吗?

找不到Node.js /socket.io/socket.io.js express 4.0

】找不到Node.js/socket.io/socket.io.jsexpress4.0【英文标题】:Node.js/socket.io/socket.io.jsnotfoundexpress4.0【发布时间】:2014-06-0411:32:06【问题描述】:所以我试图在我的网站上进行聊天,当我在本地进行测试时,它运行良好,因为我的本地... 查看详情

使用 Socket.IO 将 Node.JS 服务器连接到另一个 Node.JS 服务器?

】使用Socket.IO将Node.JS服务器连接到另一个Node.JS服务器?【英文标题】:ConnectaNode.JSservertoanotherNode.JSserverwithSocket.IO?【发布时间】:2018-12-1514:14:21【问题描述】:我正在尝试使用Socket.IO在两个Node.JS服务器之间发送数据。我通常只... 查看详情

未找到 Socket.io.js(node.js + express + socket.io)

】未找到Socket.io.js(node.js+express+socket.io)【英文标题】:Socket.io.jsnotfound(node.js+express+socket.io)【发布时间】:2014-10-2022:06:51【问题描述】:我一直在检查其他相关答案,例如:node.js/socket.io/socket.io.jsnotfoundSocket.ionotbeingservedbyNode.j... 查看详情

Node.js 和 socket.io 用于通知栏:我走对了吗?

】Node.js和socket.io用于通知栏:我走对了吗?【英文标题】:Node.jsandsocket.ioforanotificationbar:AmIgoingtherightway?【发布时间】:2013-07-2403:57:08【问题描述】:我目前正在使用Symfony2编写一个非常标准的Apache/PHP/mySQL网站,并考虑使用Node... 查看详情

Node.js + Socket IO + Apache + PHP 便宜的网络服务器? [关闭]

】Node.js+SocketIO+Apache+PHP便宜的网络服务器?[关闭]【英文标题】:Node.js+SocketIO+Apache+PHPcheapwebservers?[closed]【发布时间】:2012-01-2417:05:49【问题描述】:我是使用node.js和socketio的新手,我目前正在服务器上托管我的php网站,现在我... 查看详情

使用 node.js、socket.io 和 redis 的一对一聊天应用程序

】使用node.js、socket.io和redis的一对一聊天应用程序【英文标题】:onetoonechatappwithnode.js,socket.ioandredis【发布时间】:2014-10-1810:54:16【问题描述】:我目前在node.js和socket.io中有一个聊天应用程序(一对一)。随着我网站上的用户越... 查看详情

Node.js 和 socket.io 的混淆

】Node.js和socket.io的混淆【英文标题】:Node.jsandsocket.ioconfusion【发布时间】:2012-12-0712:42:54【问题描述】:我经常看到诸如“Node.JS+socket.io教程”之类的标题。即使在我购买的Node.jsBeginner书中,它也告诉我要下载socket.io,所以我... 查看详情

Node.js - Socket.io:socket.request 未定义

】Node.js-Socket.io:socket.request未定义【英文标题】:Node.js-Socket.io:socket.requestundefined【发布时间】:2015-01-0408:05:29【问题描述】:我已经阅读了here,我可以在node.js中获取客户端的IPsocket.request.connection.remoteAddress例如:varsocket=io.list... 查看详情

Heroku 上的 socket.io + node.js

】Heroku上的socket.io+node.js【英文标题】:socket.io+node.jsonheroku【发布时间】:2012-07-2508:23:33【问题描述】:我在heroku上编译socket.io应用程序时遇到了一些问题。这就是app.js文件varapp=require(\'express\').createServer(),io=require(\'socket.io\').lis... 查看详情

Node.js 使用 socket.io 进行重构

】Node.js使用socket.io进行重构【英文标题】:Node.jsrestifywithsocket.io【发布时间】:2012-10-1713:51:40【问题描述】:是否可以像express和socket.io一样在同一个端口上运行socket.io和restify?我就是这样做的,但是没有用#server.coffeerestify=requi... 查看详情

Node.js socket.io.js 未找到或 io 未定义

】Node.jssocket.io.js未找到或io未定义【英文标题】:Node.jssocket.io.jsnotfoundorionotdefined【发布时间】:2012-05-2017:48:36【问题描述】:我正在尝试在我的freebsd服务器上运行node.js应用程序,但我无法让socket.io库使用它。我试过包括:<s... 查看详情

将 Socket.IO 与 Apache、Node.js、SSL 和 CloudFlare (HTTP 500) 一起使用

】将Socket.IO与Apache、Node.js、SSL和CloudFlare(HTTP500)一起使用【英文标题】:UsingSocket.IOwithApache,Node.js,SSLandCloudFlare(HTTP500)【发布时间】:2020-11-2222:48:01【问题描述】:我正在创建一个将连接到Node.jsSocket.IOWebSocket的网站。此节点服务... 查看详情

Node.js、多线程和 Socket.io

】Node.js、多线程和Socket.io【英文标题】:Node.js,multi-threadingandSocket.io【发布时间】:2012-01-2316:55:53【问题描述】:我希望Socket.io在Node.jsv.0.6.0及更高版本中使用nativeloadbalancing(“集群”)进行多线程工作。据我了解,Socket.io使用... 查看详情

Node.js Websockets Socket.IO

】Node.jsWebsocketsSocket.IO【英文标题】:【发布时间】:2011-03-2809:52:10【问题描述】:我无法触发客户端事件,请查看代码/说明:好的,所以我得到了这个工作(我想)客户端代码:<scriptsrc="./Socket.IO/socket.io.js"></script><... 查看详情

Node.js Socket.io 页面刷新多个连接

】Node.jsSocket.io页面刷新多个连接【英文标题】:Node.jsSocket.iopagerefreshmultipleconnections【发布时间】:2017-06-1422:47:24【问题描述】:我有这个使用socket.io(1.5)的简单node.js服务器代码:vario=require(\'socket.io\').listen(8080);io.on(\'connection\',f... 查看详情

Socket.io - 无法加载文件

】Socket.io-无法加载文件【英文标题】:Socket.io-Cannotloadfile【发布时间】:2013-10-1912:07:23【问题描述】:我使用Node.js、socket.io和express制作了一个网络聊天应用程序。它运作良好。现在我想将我的聊天应用程序移到我的网站中,但... 查看详情

HTTP 状态代码 200 但页面未加载 Node.js Socket.io -- 使用 Socket.io 的 Node.js 教程,Daniel Nill,fs.readFile(),socket

】HTTP状态代码200但页面未加载Node.jsSocket.io--使用Socket.io的Node.js教程,DanielNill,fs.readFile(),socket.html【英文标题】:HTTPStatusCode200butpagedoesnotloadNode.jsSocket.io--Node.jsTutorialWithSocket.io,DanielNill,fs.readFile(),socket.html【 查看详情

node.js + express.js + socket.io 授权:没有cookie

】node.js+express.js+socket.io授权:没有cookie【英文标题】:node.js+express.js+socket.ioauthorization:nocookie【发布时间】:2011-12-2305:33:43【问题描述】:我无法从我的socket.io授权中获取“cookie”数据。io.configure(function()io.set(\'authorization\',functi... 查看详情