1

我试图弄清楚什么是高度可扩展的解决方案(服务于 10000+ 的多个用户)。

目标:我想要实现的是将鼠标坐标流写入二进制文件到服务器,即一旦流关闭,服务器直接从用户交互保存到服务器。坐标应每 20 毫秒(约 50 fps)推送一次,以创建鼠标移动的紧密表示。

a) 我知道 nodeJS 可用于写入流,但我不确定这样的结构是否可以处理如此高的更新频率 - 如果这是由多个用户完成的,这种方法可能会失败。

b)另一种可能性是将文件本地写入二进制文件,然后将其上传到服务器。

任何人都可以评论这些方法的功能以及是否可以使用另一种方法?

4

2 回答 2

1

根据您关于服务器不需要实时数据的评论,您绝对不应该每 20 毫秒向服务器发送一次数据。将其保存在客户端并以块的形式发送,例如每 30 或 60 秒一次。这可以在数组的内存中完成。保存鼠标坐标不是很密集。

一旦你准备好发送它,我认为你会发现XMLHttpRequest速度足够快,足以满足你的需要。

这个演示展示了如何捕捉到坐标并显示 50fps 是可行的(我在 OS X 上的 Chrome 中达到了 60fps)。

演示:http: //jsfiddle.net/ThinkingStiff/2Ls3A/

var coordinates = [],
    count = 0,
    SECONDS = 1000,
    INTERVAL = 5; 

window.onmousemove = function ( event ) {

    //move cursor over page for at least 10 secs for an accurate reading
    coordinates.push( [event.pageX, event.pageY] );
    
};

window.setInterval( function () {
    
    console.log( ( coordinates.length - count ) / INTERVAL + 'fps' );
    count = coordinates.length;
    
}, INTERVAL * SECONDS ); 

如果您真的认为在发送数据方面需要更高的效率,那么通过 Internet 连接客户端和服务器计算机的最低延迟方法是持久 TCP 套接字。这在 HTML 中通过WebSocket API.

ws:例如,几乎每种服务器端语言都有一些库使用URL 模式(wss:为了安全)来处理端点socket.io

客户:

var socket = new WebSocket('ws://example.com/endpoint' );

socket.onopen = function () {

    socket.send( 'send some text' );

};
于 2012-07-01T20:44:47.647 回答
0

我认为更好的解决方案是将点存储到一个数组中,然后转身将其发送到服务器。

此时您需要启动一个新对象并让它获得新的更新,当您进入发送到服务器的函数时,这样,在您准备和发送数据并获得响应期间,你仍然可以收集数据。

但是,您可能不会获得 50fps,但您可以在不同的浏览器上进行测试,看看预期的帧速率是合理的。

于 2012-07-01T20:42:22.617 回答