我试图找出一个高度可扩展的解决方案(为 10000 多个用户提供服务)。
目标:我想要实现的是将鼠标坐标流写入到服务器的二进制文件中,即一旦流关闭,服务器就会直接从用户交互保存到服务器。应每 20 毫秒(约 50 fps)推送一次坐标,以创建鼠标移动的精确表示。
a)我知道nodeJS可以用来做写流,但我不确定这样的结构是否可以处理如此高频率的更新 - 而且如果这是由多个用户完成的,这种方法可能会失败。
b)另一种可能性是在本地将文件写入二进制文件,然后将其上传到服务器。
任何人都可以评论这些方法的功能以及是否可以使用其他方法?
最佳答案
根据您的评论,服务器不需要实时数据,您绝对不应该每20ms向服务器发送一次数据。将其保存在客户端上并分块发送,例如每 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 套接字。这可以通过 WebSocket API
在 HTML 中获得。
几乎每种服务器端语言都有库使用 ws:
URL 架构(wss:
表示安全)来处理端点,例如 socket.io
。
客户端:
var socket = new WebSocket('ws://example.com/endpoint' );
socket.onopen = function () {
socket.send( 'send some text' );
};
关于Javascript 二进制文件到服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11285267/