不从群集接收响应消息

时间:2019-02-09 17:24:23

标签: node.js

我正在尝试运行Jim Jim Wilson的Node.js 8 The Right Way中的程序。在第4章中,有一节演示了使用集群的消息交换模式。当我运行“ zmq-filer-rep-cluster.js”时,我的工作人员上线了。但是,当我运行“ zmq-filer-req-loop.js target.txt”时,发出了五个对target.txt的请求,但是我没有从集群收到预期的响应。

FYI:我正在Windows上运行它,起初我遇到了以下使用ipc的代码行以及它是如何基于Unix的套接字的问题。

const dealer = zmq.socket('dealer').bind('ipc://filer-dealer:ipc'); 

跳到堆栈溢出并阅读一些提示我需要使用tcp的问题。我做到了,您将在下面的代码中看到,但是我没有收到集群的响应。

这里的解决方案是什么? 谢谢, C

zmq-filer-rep-cluster.js

'use strict';
 const cluster = require('cluster');
 const fs = require('fs');
  const zmq = require('zeromq');

 const numWorkers = require('os').cpus().length;

if (cluster.isMaster) {

   // Master process creates ROUTER and DEALER sockets and binds endpoints.
 const router = zmq.socket('router').bind('tcp://127.0.0.1:60401'); 
 const dealer = zmq.socket('dealer').bind('tcp://dealer-filer:60401'); 

 // Forward messages between the router and dealer.
 router.on('message', (...frames) => dealer.send(frames));
 dealer.on('message', (...frames) => router.send(frames));

 // Listen for workers to come online.
 cluster.on('online',
     worker => console.log(`Worker ${worker.process.pid} is online.`));

 // Fork a worker process for each CPU.
 for (let i = 0; i < numWorkers; i++) {
   cluster.fork();
 }

   } else {

 // Worker processes create a REP socket and connect to the DEALER.
 const responder = zmq.socket('rep').connect('tcp://dealer-filer:60401');

 responder.on('message', data => {

   // Parse incoming message.
   const request = JSON.parse(data);
   console.log(`${process.pid} received request for: ${request.path}`);

   // Read the file and reply with content.
   fs.readFile(request.path, (err, content) => {
     console.log(`${process.pid} sending response`);
     responder.send(JSON.stringify({
       content: content.toString(),
       timestamp: Date.now(),
       pid: process.pid
     }));
   });

 });

 }

zmq-filer-req-loop.js

'use strict';
const zmq = require('zeromq');
const filename = process.argv[2];

// Create request endpoint.
const requester = zmq.socket('req');

  // Handle replies from the responder.
requester.on('message', data => {
  const response = JSON.parse(data);
   console.log('Received response:', response);
});

requester.connect('tcp://127.0.0.1:60401');

// Send requests for content.
for (let i = 1; i <= 5; i++) {
 console.log(`Sending request ${i} for ${filename}`);
  requester.send(JSON.stringify({ path: filename }));
}

0 个答案:

没有答案