据我所知,Web Sockets允许双向通信。和Web套接字(例如:Socket.io)连接始终打开。因此,每当新数据到达时,数据应通过套接字自动推送到视图。
但是在下面的代码中我使用 set_interval 来进行http.get调用。和set_interval每1秒调用一次。
现在,做这些并不会给人一种实时感觉,即新数据每1秒被拉一次。这是静态定义的。
简而言之,我想自动化下面代码中的set_interval所做的事情。我不想要静态获取间隔值。这是因为有时股票价格可能会在100毫秒内发生变化,有时会在几秒钟内发生变化。
现在,如果我将间隔设置为1秒,那就是每1秒拨一次电话。不会看到市场波动剧烈波动的真实感受。
我不确定开发人员在IOT应用程序中获取数据的频率。例如,汽车是实时监控的,让我们说实时获取汽车的速度,并在网络或移动应用程序上绘图。
如何实现与Stock Ticker类似的功能?我想简单地将应用程序插入到API中,当新数据到达时,立即将其推送给所有观众(订阅者)时间。
////
// CONFIGURATION SETTINGS
////
var FETCH_INTERVAL = 1000;
var PRETTY_PRINT_JSON = true;
////
// START
////
var express = require('express');
var http = require('http');
var https = require('https');
var io = require('socket.io');
var cors = require('cors');
function getQuote(socket, ticker) {
https.get({
port: 443,
method: 'GET',
hostname: 'www.google.com',
path: '/finance/info?client=ig&q=' + ticker,
timeout: 1000
}, function(response) {
response.setEncoding('utf8');
var data = '';
response.on('data', function(chunk) {
data += chunk;
});
response.on('end', function() {
if(data.length > 0) {
var dataObj;
try {
dataObj = JSON.parse(data.substring(3));
} catch(e) {
return false;
}
socket.emit(ticker, dataObj[0].l_cur);
}
});
});
}
我正在调用方法getQuote,具体取决于上面设置的FETCH_INTERVAL
function trackTicker(socket, ticker) {
// run the first time immediately
getQuote(socket, ticker);
// every N seconds
var timer = setInterval(function() {
getQuote(socket, ticker);
}, FETCH_INTERVAL);
socket.on('disconnect', function () {
clearInterval(timer);
});
}
var app = express();
app.use(cors());
var server = http.createServer(app);
var io = io.listen(server);
io.set('origins', '*:*');
app.get('/', function(req, res) {
res.sendfile(__dirname + '/index.html');
});
io.sockets.on('connection', function(socket) {
socket.on('ticker', function(ticker) {
trackTicker(socket, ticker);
});
});
server.listen(process.env.PORT || 4000);
好的,所以我需要实时提要。 (此位已排序)
据我所知,实时订阅源非常昂贵,每个在线客户端购买10,000多个终端点非常昂贵。
1)如何利用实时Feed为1000名最终用户提供服务?我可以使用网络套接字,Redis,发布/订阅,广播或某些技术将实时数据复制到吨用户吗?我想要一个有效的解决方案,因为我希望尽可能降低实时数据馈送的费用。
我该如何解决这个问题?
2)是的,我理解轮询需要在服务器端而不是在客户端完成(以避免为每个客户端进行轮询)。但那么我需要使用什么技术? websockets,redis,pub / sub等..
我有API网址和访问API的令牌。
3)我不仅需要获取数据并将其推送给最终用户。但我需要对获取的数据进行一些计算,还需要从Redis或数据库中提取数据并对其进行计算然后将其推送到视图。
例如:
1) data I get in real-time market feed {"a":10, "b":20}
2) get data from DB or Redis {"x":2, "y":4}
3) do computation : z = a * x + b * y
4) finally push value of z in the view.
如何将所有这些实时同时推送到多个客户端? 你可以和我分享一个路线图吗?我得到了第一部获得实时数据传输的难题。
答案 0 :(得分:2)
1)如何利用实时Feed为1000名最终用户提供服务?我可以使用网络套接字,Redis,发布/订阅,广播或某些技术将实时数据复制到吨用户吗?我想要一个有效的解决方案,因为我希望尽可能降低实时数据馈送的费用。
我该如何解决这个问题?
To" push"数据到浏览器客户端,您可能希望使用webSocket或socket.io(构建在webSockets之上)。然后,只要您的服务器知道有更新,它就可以立即将该更新发送给对该信息感兴趣的任何当前连接的客户端。基本思想是,只要网页被打开,客户端就会在加载网页后立即连接到您的服务器,并在网页打开时保持该连接打开。
2)是的,我理解轮询需要在服务器端而不是在客户端完成(以避免为每个客户端进行轮询)。但那么我需要使用什么技术? websockets,redis,pub / sub等..
我不清楚你在这里究竟是什么问题。您将使用提供商提供的最有效技术获得最新价格。如果他们提供的只是http调用,那么您必须使用http请求定期轮询。如果他们提供webSocket接口来获取更新,那么这将是更可取的。
如何跟踪哪些客户对哪些信息感兴趣以及如何分发更新有很多选择。对于单个服务器,您可以使用股票价格地图轻松构建自己的服务,其中股票代码是关键字,客户端标识符数组是地图中的值。然后,每当您获得给定股票的更新时,您只需获取对该股票感兴趣的客户端ID列表,并将更新发送给它们(通过其webSocket / socket.io连接)。
这也是一个自然的pub / sub类型的应用程序,所以支持pub / sub的任何后端都可以正常工作。您甚至可以在.emit(stock, price)
使用EventEmitter,并且每个单独的连接都会为他们感兴趣的股票代码添加一个监听器。
对于大规模的多台服务器,您可能希望使用一些管理发布/订阅流程的外部流程。 Redis是候选人。
3)我不仅需要获取数据并将其推送给最终用户。但我需要对获取的数据进行一些计算,还需要从Redis或数据库中提取数据并对其进行计算然后将其推送到视图。
我真的不知道这里有什么问题。选择您喜欢的数据库来存储您需要获取的信息,以便您可以根据需要获取它。
如何将所有这些实时同时推送到多个客户端?你能和我分享路线图吗?我得到了第一个获得实时数据传输的难题。
然后,按照这一系列事件。