Ajax调用服务器饱和

时间:2015-09-24 12:15:45

标签: javascript php ajax socket.io zeromq

我在Windows Server 2008上使用PHP而不是IIS 7.5。

我的Web应用程序在后台3个不同的JSON页面中反复请求Ajax:

  • 第1页每6秒
  • 第2页每30秒
  • 第3页每60秒

他们检索与某些表的当前状态相关的数据。这样我就可以更新视图了。

通常我没有遇到太多麻烦,但最近我看到我的服务器已经满足了数百个未答复的请求,我相信这个问题可能是因为其中一个请求延迟了。

如果每隔6秒请求一次的page1需要45秒响应(由于数据库查询速度慢等),那么在我看来,请求开始逐个堆叠。 如果我有多个用户同时连接到Web应用程序(或使用多个选项卡),事情可能会变坏。

有关如何避免此类问题的任何建议吗?

我在考虑使用ZMQSockets.io in the client side之类的内容,但由于我要求的数据不会因任何用户操作而被解雇,我不会# 39;看看这是如何从服务器端触发的。

3 个答案:

答案 0 :(得分:1)

  

我在考虑在客户端使用ZMQ和Sockets.io这样的东西......

这几乎绝对是长期运行请求的最佳选择。

  

...但由于我要求的数据不会被任何用户操作触发,我不知道如何从服务器端触发此操作。

在这种情况下,用户操作'问题是连接到socket.io服务器。此缩减示例取自socket.io getting started个文档之一:

var io = require('socket.io')(http);

io.on('connection', function(socket) {
  console.log('a user connected');
});

当'连接'事件被触发,您可以开始侦听ZMQ消息队列上的消息。如有必要,您还可以启动长时间运行的查询。

答案 1 :(得分:0)

根据@epascarello的推荐,我最终解决了这个问题,如果我在X时间内没有得到任何响应,我会稍微改进一下。

  

如果请求未返回,请不要发送另一个请求。但修复服务器端代码并​​加快速度。

基本上我做了类似以下的事情:

var ELAPSED_TIME_LIMIT = 5; //5 minutes
var responseAnswered = true;
var prevTime = new Date().getTime();

setInterval(function(){
    //if it was answered or more than X m inutes passed since the last call
    if(responseAnsswered &&  elapsedTime() > ELAPSED_TIME_LIMIT){
        getData()
        updateElapsedTime();
    }
}, 6000);

function getData(){
    responseAnswered = false;
    $.post("http://whatever.com/action.json", function(result){
        responseAnswered = true
    });
}

//Returns the elapsed time since the last time prevTime was update for the given element.
function elapsedTime(){
    var curTime = new Date().getTime();

    //time difference between the last scroll and the current one
    var timeDiff = curTime - prevTime;

    //time in minutes
    return (timeDiff / 1000) / 60;
}

//updates the prevTime with the current time
function updateElapsedTime(){
    prevTime = new Date().getTime();
}

答案 2 :(得分:-1)

这是一个非常糟糕的设置。如果可能,您应该始终避免轮询。而不是每6秒从客户端向服务器发送请求,而是将数据从服务器发送到客户端。您应该在服务器端检查数据是否有任何变化,然后使用websockets将数据传输到客户端。您可以在服务器端使用nodejs来监视数据中的任何更改。