【发布时间】:2018-02-02 20:36:55
【问题描述】:
据我所知,Web Sockets 允许双向通信。和 Web 套接字(例如:Socket.io)连接始终处于打开状态。因此,每当有新数据到达时,数据应通过套接字自动推送到视图。
但在下面的代码中,我使用 set_interval 进行 http.get 调用。每 1 秒调用一次 set_interval。
现在,这样做并没有给人一种实时的感觉,即每 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);
}
});
});
}
我正在根据上面设置的 FETCH_INTERVAL 调用方法 getQuote
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 URL 和访问 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.
我如何同时将所有这些实时推送到多个客户端? 你能和我分享一个路线图吗?我得到了实时数据馈送的第一块拼图。
【问题讨论】:
-
为了获得更多的实时性(而不是在服务器上轮询),您需要从您的股票价格源中获取某种实时信息,以便它告诉您您正在监控的给定股票价格何时发生变化。然后,您让您的服务器跟踪哪个客户正在观看哪些股票,然后您立即将给定股票价格的更新发送给正在观看该股票的任何客户。在服务器上轮询一次比在每个客户端轮询更有效,但它仍然是轮询并且受制于轮询的非实时方面。摆脱这种情况的唯一方法是从源头获取实时提要。
-
@jfriend00 哦,好吧,我明白你的意思了。因此,只有当提要是实时的时,我才能避免在每个 set_interval 进行检查。我们可以聊几分钟吗?关于同一主题,我还有几个问题。
-
请将您的问题放入您的问题中(然后添加评论以指向编辑),而不是离线其他人看不到的地方。
-
另外,如果有 100 位客户每个人都在看一只给定的股票,那么您不希望对该股票价格进行 100 次轮询。您希望对其进行一次轮询,然后将该报价转发给所有 100 个客户。所以,你也必须重新考虑你正在做的事情。
-
@jfriend00 我已经更新了我的问题,据我所知添加了 3 个问题。
标签: node.js ajax api sockets get