Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 为多个用户请求提供服务的轮询服务器_Node.js_Socket.io_Queue_Polling - Fatal编程技术网

Node.js 为多个用户请求提供服务的轮询服务器

Node.js 为多个用户请求提供服务的轮询服务器,node.js,socket.io,queue,polling,Node.js,Socket.io,Queue,Polling,我需要将从外部API获取的数据提供给多个用户请求。我想知道在这种情况下应该采取什么策略 例如: 用户1发送数据A的请求=>服务器开始轮询带有数据A的响应 用户2发送数据A的请求=>服务器开始轮询带有数据A的响应 用户3发送数据B=>服务器开始轮询数据B响应的请求 然后,对于服务器端: 接收到来自用户1的数据A请求=>检查是否已轮询数据A: 如果是:开始轮询数据A 如果否:从外部API开始轮询数据A并开始轮询用户1 接收到来自用户2的数据A请求=>检查是否已轮询数据A: 如果是:开始轮询数据A 如

我需要将从外部API获取的数据提供给多个用户请求。我想知道在这种情况下应该采取什么策略

例如:

用户1发送数据A的请求=>服务器开始轮询带有数据A的响应 用户2发送数据A的请求=>服务器开始轮询带有数据A的响应 用户3发送数据B=>服务器开始轮询数据B响应的请求 然后,对于服务器端:

接收到来自用户1的数据A请求=>检查是否已轮询数据A: 如果是:开始轮询数据A 如果否:从外部API开始轮询数据A并开始轮询用户1 接收到来自用户2的数据A请求=>检查是否已轮询数据A: 如果是:开始轮询数据A 如果否:从外部API开始轮询数据A并开始轮询用户2 接收到来自用户3的数据B请求=>检查数据B是否已被轮询: 如果是:开始轮询数据B 如果否:从外部API开始轮询数据A并开始轮询用户3 当然,我想做的是,由于User1和User2请求相同的数据,服务器不会向API发出两次请求。我不知道怎么做

此外,当用户发出请求且至少有一个用户仍处于连接状态时,必须每10或30秒轮询一次对API的请求

关于技术,我将不得不和NodeJS一起做。然后我考虑通过socket.io而不是ajax调用来完成所有这些


有人能给我解释一下一个可以在Node中实现这一功能的系统吗?

听起来您希望服务器缓存一个,以便在其他用户请求时,服务器可以快速发送一个存储在内存中的

Node.js代码如下:

var cachedData;

socket.on('requestDataA',function(data){
    var date = new Date().getTime();
    //check and see if cachedData is expired

    if(data >=cachedData.expireDate){
        cachedData=null;
    }

    if(!cachedData){
        pollServerToGetA(function(A){
            cachedData=A;
            socket.emit('dataA',cachedData);
        });
    }else{
        socket.emit('dataA',cacheData);
    }
});

谢谢,我做了一个小测试,它为其他用户提供缓存数据。但是我做的这些都没有日期/过期的东西。你能给我解释一下吗?这是否意味着我必须设置缓存过期时间?如果ie我每30秒轮询一次,那么我的缓存可能会每45秒过期一次?@BobbyShark我只是假设A会经常更改,并且在一定时间后,A将需要刷新,以便用户始终获得最新的数据,而不是旧的副本。将到期的日期将是到期日期。如果日期超过expireDate,这意味着应该从服务器中提取内容。您应该尽可能不频繁地轮询服务器,同时确保您获得的是最新版本的