我正在尝试运行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 }));
}