Javascript restapi与实时客户端

Javascript restapi与实时客户端,javascript,node.js,rest,real-time,polling,Javascript,Node.js,Rest,Real Time,Polling,我希望具有以下体系结构: 一种JSON REST API,实时统计数据被推送到并存储在Redis服务器中 JSON REST API调用,其中任意数量的客户端(本机或web)都可以在存储数据后接收该数据,即实时接收该数据 第一个客户端将只是一个web应用程序,稍后我可能会构建一个本地应用程序 我想知道我的唯一选择是否是让客户端轮询RESTAPI以进行更改?理想情况下,我希望服务器在更新到达时推送更新,这样我就不需要管理此轮询 我的体系结构是否适合我想要实现的目标,或者我是否遗漏了什么?您可以选择

我希望具有以下体系结构:

一种JSON REST API,实时统计数据被推送到并存储在Redis服务器中

JSON REST API调用,其中任意数量的客户端(本机或web)都可以在存储数据后接收该数据,即实时接收该数据

第一个客户端将只是一个web应用程序,稍后我可能会构建一个本地应用程序

我想知道我的唯一选择是否是让客户端轮询RESTAPI以进行更改?理想情况下,我希望服务器在更新到达时推送更新,这样我就不需要管理此轮询


我的体系结构是否适合我想要实现的目标,或者我是否遗漏了什么?

您可以选择Node.js和websocket进行实时推拉操作。
要不管理队列,您仍然可以选择MQ。

比轮询更有效的方法是使用WebSocket,例如或。可以将发射事件放置在数据存储事件下,以立即发送已存储的数据

使用Socket.IO,您可以这样做:

var io = require('socket.io').listen(80);
//note that you can listen on HTTP servers
//can also be used with Express applications, etc

//when data is stored, run this
io.sockets.emit('event', {
  object: 'that is sent to client'
});
var http = require('http');
var faye = require('faye');

var bayeux = new faye.NodeAdapter({
  mount: '/faye',
  timeout: 45
});
bayeux.listen(8000);
然后,您可以使用它告诉客户机有新数据,或者直接发送新存储的数据。可以定义自定义事件,例如

io.sockets.emit('data_receive', function (data) {...});
并将以如下方式接收客户端:

var socket = io.connect('http://socket.location');
socket.on('data_recieve, function (data) {
  //data is whatever sent from server
});
在费伊,你会这样做:

var io = require('socket.io').listen(80);
//note that you can listen on HTTP servers
//can also be used with Express applications, etc

//when data is stored, run this
io.sockets.emit('event', {
  object: 'that is sent to client'
});
var http = require('http');
var faye = require('faye');

var bayeux = new faye.NodeAdapter({
  mount: '/faye',
  timeout: 45
});
bayeux.listen(8000);
然后,在存储数据时,您将运行:

client.publish('/path', {
  data: 'Hello world'
});
任何创建了如下客户机的客户机:

var client = new Faye.Client('http://socket:port/path');

client.subscribe('/path', function(data) {
  alert('Received data: ' + data.text);
});
将接收数据