如何自动化API获取数据请求?使用网络套接字时

时间:2017-08-24 20:37:35

标签: node.js ajax api sockets get

据我所知,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. 

如何将所有这些实时同时推送到多个客户端? 你可以和我分享一个路线图吗?我得到了第一部获得实时数据传输的难题。

1 个答案:

答案 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或数据库中提取数据并对其进行计算然后将其推送到视图。

我真的不知道这里有什么问题。选择您喜欢的数据库来存储您需要获取的信息,以便您可以根据需要获取它。

  

如何将所有这些实时同时推送到多个客户端?你能和我分享路线图吗?我得到了第一个获得实时数据传输的难题。

  1. 实时数据Feed。
  2. 用于存储用于计算的元数据的数据库。
  3. 某些发布/订阅系统,无论是自制还是预建包。
  4. 然后,按照这一系列事件。

    1. 客户端登录,连接webSocket或socket.io连接。
    2. 服务器接受客户端连接并分配clientID并在clientID和webSocket / socket.io连接之间的某种Map中跟踪连接。仅供参考,socket.io会自动为您完成此操作。
    3. 客户端告诉服务器它想监视哪些项目(可能是通过webSocket / socket.io连接发送的消息。
    4. 服务器注册了对pub / sub系统感兴趣的内容(基本上是将客户端订阅到它想监视的每个项目。
    5. 其他客户做同样的事情。
    6. 每次客户端请求特定项目的数据时,服务器都会确保它正在获取该项目的更新(但服务器会获取其更新)。
    7. 服务器获取一个或多个客户感兴趣的某个项目的新信息。
    8. 新数据被发送到pub / sub系统,pub / sub系统将该信息广播给那些对该特定项目的信息感兴趣的客户端。有关工作原理的详细信息取决于您选择的发布/订阅系统以及如何通知订阅者更改,但最终会通过webSocket / socket.io发送已更改项目的消息。
    9. 当客户断开连接时,他们的发布/订阅订阅是"取消订阅"。