Socket.IO服务器限制一个快速的客户端

我有一个使用socket.io的服务器,我需要一种方法来限制发送服务器数据的客户端太快。 服务器公开了一个TCP接口和一个socket.io接口 – 与TCP服务器(来自net模块)我可以使用socket.pause()socket.resume() ,这有效地socket.resume()了客户端。 但是对于socket.io的socket类,没有pause()resume()方法。

向客户反馈最简单的方法是什么,它是压倒了服务器,需要放慢速度? 我喜欢socket.pause()socket.resume()因为它不需要客户端的任何额外的代码 – 备份TCP套接字,事情自然减慢。 任何等效的socket.io?

更新:我提供了一个API来与服务器交互(目前有一个运行在TCP上的python版本和一个使用socket.io的JavaScript版本)。 所以我不能真正控制客户端的function。 这就是为什么使用socket.pause()socket.resume()如此之好 – 备份TCPstream会减慢python客户端的速度,无论它做什么。 我正在寻找一个JavaScript客户端的等价物。

足够的挖掘,我发现这一点:

 this.manager.transports[this.id].socket.pause(); 

 this.manager.transports[this.id].socket.resume(); 

授予这可能不会工作,如果socket.io连接不是一个networking套接字连接,并可能打破未来的更新,但现在我要去。 当我将来有一段时间的时候,我可能会把它QUOTA_EXCEEDED Pascal提出的QUOTA_EXCEEDED解决scheme。

看起来你应该放慢你的客户。 如果一个客户端发送的服务器速度太快,以至于跟100多个客户端不太一样。

一种方法是让客户等待每个发射的回应,然后发射其他东西。 这样,服务器可以控制客户端可以通过仅仅在准备好时回答的速度有多快,或者只在设定的时间之后回答。

如果这还不够,当客户端每秒超出x次请求时,开始回复类似QUOTA_EXCEEDED的错误,并忽略它们发送的数据。这将迫使外部开发人员使他们的应用程序按照您的要求行事。

如果你在你的服务器上有一个callback,通常会把回复发回给你的客户端,你可以尝试改变它,像这样:

之前:

  var respond = function (res, callback) { res.send(data); }; 

 var respond = function (res, callback) { setTimeout(function(){ res.send(data); }, 500); // or whatever delay you want. }; 

作为另一个build议,我会提出一个这样的解决scheme:通常MySQL会获得大量的请求,而这些请求会比请求进来的速度花费更长时间。服务器可以将请求logging到db中的表中假设这个动作对于请求进入的速率是足够快的,然后以正常的速率处理队列以供服务器维持。 此缓冲区系统将允许服务器运行缓慢,但仍处理所有请求。

但是,如果你想要顺序的东西,那么请求callback应该在客户端可以发送另一个请求之前被validation。 在这种情况下,应该有一个服务器就绪标志。 如果客户端在标志为红色时发送请求,则可能会有消息通知客户端速度变慢。

这是一个肮脏的方法来实现节stream。 虽然这是一个老post, 有些人可能从中受益:

首先注册一个中间件:

 io.on("connection", function (socket) { socket.use(function (packet, next) { if (throttler.canBeServed(socket, packet)) { next(); } }); //You other code .. }); 

canBeServed是一个简单的调节器,如下所示:

 function canBeServed(socket, packet) { if (socket.markedForDisconnect) { return false; } var previous = socket.lastAccess; var now = Date.now(); if (previous) { var diff = now - previous; //Check diff and disconnect if needed. if (diff < 50) { socket.markedForDisconnect = true; setTimeout(function () { socket.disconnect(true); }, 1000); return false; } } socket.lastAccess = now; return true; } 

您可以使用process.hrtime()而不是Date.time()。