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

问题描述:

据我所知网络套接字允许双向通信。和网络套接字(例如:Socket.io)连接始终打开。所以,每当新数据到达时,数据应该通过套接字自动推送到视图。如何自动化API获取数据请求?当使用网络套接字

但在下面的代码中,我使用set_interval来进行http.get调用。每隔1秒调用一次set_interval。

现在,这样做并没有给出实时的感觉,即新的数据每1秒钟被拉一次。这是静态定义的。

in-short,我想在下面的代码中自动执行set_interval的操作。我不想要一个静态提取间隔值。这是因为股票的价格可能会在100ms内变化,有时它会在几秒内发生一次变化

现在,如果我将间隔设置为1秒,那么每1秒钟拨打一次电话。看不到市场走势高位波动的真实感受。

我不知道通常开发人员如何在IOT应用程序中获取数据。例如实时监控汽车,并假设汽车的速度实时提取,并绘制在网络或移动应用程序上。

如何在股票代码中实现类似的功能?我想简单地将应用程序插入到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)如何使用实时馈送服务1000位最终用户?我可以使用网络套接字,Redis,发布/订阅,广播或将实时馈送复制到大量用户的技术吗?我想要一个高效的解决方案,因为我想尽可能降低实时数据馈送的费用。

我该如何解决这个问题?

2)是的,我知道轮询需要在服务器端进行,而不是在客户端(为了避免对每个客户端进行轮询)。但那么我需要使用哪些技术? websocket,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. 

我该怎么做所有这些实时在同一时间将其推送到多个客户端? 你能跟我分享路线图吗?我得到了实时数据馈送的第一个难题。

+1

为了获得更多的实时性(与在服务器上进行轮询相反),您需要来自股票价格源的某种实时饲料,以便告知您何时监控给定股价变化。然后,您的服务器会跟踪哪个客户端正在监视哪些股票,并且您立即将给定股票价格的更新发送给正在监视该股票的任何客户端。在服务器上轮询一次比在每个客户端进行轮询效率更高,但它仍在轮询,并受到轮询的非实时方面的影响。摆脱这种情况的唯一方法是从源头获得实时馈送。 – jfriend00

+0

@ jfriend00哦,好吧,我明白你的意思了。所以只有当饲料是实时的,我可以避免检查每个set_interval。我们可以聊几分钟吗?关于同一主题,我还有几个问题。 –

+0

请将您的问题放到您的问题中(然后添加注释以指向编辑),而不是脱机,其他人无法看到它们。 – jfriend00

1)如何利用实时馈送服务1000位最终用户?我可以使用网络套接字,Redis,发布/订阅,广播或将实时馈送复制到大量用户的技术吗?我想要一个高效的解决方案,因为我想尽可能降低实时数据馈送的费用。

我该如何解决这个问题?

要将数据“推送”到浏览器客户端,您需要使用webSocket或socket.io(构建于webSockets之上)。然后,只要您的服务器知道有更新,它就可以立即将该更新发送给对该信息感兴趣的任何当前连接的客户端。基本思想是客户端在加载网页后立即连接到服务器,并在网页打开时保持该连接处于打开状态。

2)是的,我知道轮询需要在服务器端完成,而不是在客户端(为了避免对每个客户端进行轮询)。但那么我需要使用哪些技术? websockets,redis,pub/sub等。

我不清楚你到底在问什么。您将使用您的提供商提供的最有效的技术获得更新的价格。如果他们提供的都是http调用,那么您必须定期使用http请求进行轮询。如果他们提供webSocket接口来获取更新,那么这将是更可取的。

对于如何跟踪哪些客户对哪些信息以及如何分发更新感兴趣,有很多选择。对于单个服务器,只需使用股票价格的地图即可轻松构建自己的股票,其中股票代码是关键字,客户端标识符数组是地图中的值。然后,每当你得到一个给定股票的更新时,你只需获取对该股票感兴趣的客户ID列表,并将更新发送给它们(通过它们的webSocket/socket.io连接)。

这也是一种自然的pub/sub类型的应用程序,所以任何支持pub/sub的后端都可以正常工作。您甚至可以使用EventEmitter,您可以在其中为每个单独的连接添加他们感兴趣的股票代码的监听器。

对于多台服务器,您可能希望使用一些外部进程来管理pub /子过程。 Redis是这方面的人选。

3)我不仅需要获取数据并将其推送给最终用户。但是我需要对提取的数据进行一些计算,还需要从Redis或数据库中提取数据,然后对其进行计算,然后将其推送到视图。

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

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

  1. 实时数据馈送。
  2. 用于存储用于计算的元数据的数据库。
  3. 一些酒吧/子系统,无论是家庭或预建套餐。

然后,按照这一系列事件。

  1. 客户端登录,连接webSocket或socket.io连接。
  2. 服务器接受客户端连接并分配clientID并跟踪clientID和webSocket/socket.io连接之间某种映射的连接。仅供参考,socket.io会自动为您执行此操作。
  3. 客户告诉它要监视(发送过来的WebSocket/socket.io可能消息哪些项目服务器连接。
  4. 服务器注册在酒馆利息/子系统(主要订阅客户端要监视每个项目。
  5. 其他客户做同样的事情。
  6. 每次上特定项目的客户端请求数据时,服务器将确保其获得该项目(但是服务器获取其更新)更新。
  7. 服务器获取新信息对于一个或多个客户感兴趣的某些项目。
  8. N新数据被发送到发布/订阅系统,并且发布/订阅系统将该信息广播给那些对该特定项目的信息感兴趣的客户。这些工作的细节取决于你选择的pub/sub系统,以及它如何通知订阅者一个更改,但最终会通过webSocket/socket.io发送一条消息,以发送已更改的项目。
  9. 当客户端断开连接时,他们的发布/订阅订阅被“取消订阅”。
+0

好的我得到了我的第二个问题的答案。也就是说,最好使用ws(websocket非安全)或wss(websocket安全协议)通过http实时数据,因为websockets协议是全双工通信通道,它使浏览器和Web服务器之间的交互变得更低开销,促进实时数据传输到服务器 –

+0

在Q3,我问到数据库的原因是因为:如果我使用mongoDB让我们说作为数据库。那么我认为,每秒钟打开和关闭MongoDB连接来获取数据不是很糟糕吗?这就是为什么我认为redis内存中缓存会更好,并且我可以每隔一段时间缓存数据库中的新值,而不是每秒一次,不是吗?我认为数据库是沉重的操作和耗时。我不知道什么是最好的方式来存储一些数据,这是由管理更新,也用于非常频繁的计算 –

+1

@MurlidharFichadia - 什么数据库选择取决于您的具体要求,这是一个不平凡的任务研究和绘制适当的结论。如果你不需要对磁盘进行常规数据持久化,并且数据集很容易适应内存,那么redis是一种常见的选择。对于mongoDB,无需一直打开和关闭连接。您可以打开一个连接并保持打开状态,然后通过该连接进行多个查询。根据操作,数据库类型以及查询的优化方式,数据库操作可能很重或很轻。 – jfriend00