为什么流数据无法在Node js中连续工作?

时间:2019-06-29 19:47:04

标签: node.js socket.io

曾经试图花几天时间来不断读取数据,但仍未找到解决方案。实际上,我对此很不好。我正在使用套接字io进行实时数据更新。对于节点js,我的数据非常大,无法正常传输,因此我不得不分批传输数据。问题是套接字在第一次加载后停止更新新的json数据。第一次加载时数据更新良好。除非重新启动节点,否则块数据将停止传输。

这是我完整的服务器文件:

var EventEmitter = require('events');
const emitter = new EventEmitter()
emitter.setMaxListeners(0)

var express = require('express'); 
var app = express();
var fs = require('fs');
var readableStream = fs.createReadStream('./edata.json')
var options = {
    key: fs.readFileSync('/etc/letsencrypt/live/xsite.com/privkey.pem'),
    cert: fs.readFileSync('/etc/letsencrypt/live/xsite.com/fullchain.pem'),
    ca: fs.readFileSync('/etc/letsencrypt/live/xsite.com/chain.pem')
};

var https = require('https').Server(options, app);

var zmq = require('zeromq')
  , sock = zmq.socket('pull');
  sock.bind('tcp://10.150.0.6:1111');
var io = require('socket.io')(https); 

io.on('connection', function(socket){ 
     socket.on('disconnect',function(){
        console.log("client disconnected");
    })  

    sock.on('message',function(chunk){  
    readableStream.on('data',chunk=>{
        console.log("working emitter", chunk.toString())
     socket.emit('latest_score',chunk.toString());      
    })
   });  
});

  https.listen(1969);
  sock.on('connect', function(fd, ep) {console.log('connect, endpoint:', ep);});

console.log('Server connected to port 1969');

如果这里有人可以建议我如何连续传输数据而不必重启节点。敬请谅解。

1 个答案:

答案 0 :(得分:1)

您设计的事件处理方式可能是错误的。我将逐步解释您的设计。

  1. 您定义并初始化readableStream以流式传输文件。由于没有data事件处理程序,因此它不会开始流动。因此,流最初在等待。
  2. 您将sock定义并初始化为Zeromq套接字。
  3. 您定义一个socket.io服务器。
  4. 您定义一个io.on('connection', ...)侦听器,以便在传入socket.io连接时得到通知。
  5. io.on('connection', ...)内,您执行sock.on('message', function(chunk){{...});,这将为您在zeromq套接字上传入message事件的监听器。
  6. 在该zeromq侦听器内,您设置了readableStream.on('data',chunk=>{ socket.emit(...)});。因此,这是data上的第一个readableStream事件侦听器,因此它将开始流的流动,您将获得一系列data事件,并将这些事件发送到套接字。 io套接字。
  7. 假设没有其他Zeromq事件并且没有其他socket.io套接字到达,那么上述步骤中的事件中的readableStream数据将全部流过,并将所有数据发送到socket.io套接字上。
  8. 现在,想象一下readableStream中的所有内容都已经发送完(流结束并结束)之后,另一个socket.io连接进来了。此时,您将再次等待zermomq消息。发生这种情况时,您将在data上注册另一个readableStream事件处理程序。但是,readyStream已经完成并关闭。它不再有data个事件,因此第二个socket.io连接没有任何发送。
  9. 如果从第一个开始在流过程的中间连接了多个socket.io连接,则可能发生更糟的事情。您的第二个socket.io连接可能只是数据流的一部分。
  10. 而且,我不知道您的zeromq message侦听器在这里应该做什么,因为直到出现该消息之前,没有任何内容开始流向第一个socket.io连接。

因此...如何解决此问题取决于您真正希望每个新的socket.io连接的行为如何。您将必须对此进行充分说明,并说明与zeromq消息有何关系,以便我们提出固定设计。但是,希望对现有代码的这种解释将解释为什么您看到自己的行为。

如果要将数据从可读流发送到每个新的socket.io连接,则必须为每个socket.io连接创建一个新的单独的可读流。我仍然不知道这与Zeromq有什么关系,为什么不开始任何操作,直到收到Zeromq消息,或者在流传输数据后再收到另一个Zeromq消息时,您会期望发生什么。