私はNode.JSの基礎を教える本を読んでいます。私は1つのレスポンダと1つのリクエスタという2つのプログラムを作成しました。リクエストメッセージとレスポンスメッセージが順不同ですか?
応答:
"use strict";
const fs = require("fs");
const zmq = require("zmq");
const responder = zmq.socket("rep"); // Create socket to reply to client requests
// Handle incoming requests
responder.on("message", function(data) {
// Parse incoming message
let request = JSON.parse(data);
console.log("Received request to get: " + request.path);
// Read file and reply with content
fs.readFile(request.path, function(err, content) {
console.log("Sending response content");
responder.send(JSON.stringify({
content: content.toString(),
timestamp: Date.now(),
pid: process.pid
}));
});
});
// Listen on TCP port 5433
responder.bind("tcp://127.0.0.1:5433", function(err) {
console.log("Listening for zmq requesters...");
});
// Close the responder when the Node process ends
process.on("SIGINT", function() {
console.log("Shutting down...");
responder.close();
});
依頼者:
"use strict";
const zmq = require("zmq");
const filename = process.argv[2];
const requester = zmq.socket("req"); // Create request endpoint
// Handle replies from responder
requester.on("message", function(data) {
let response = JSON.parse(data);
console.log("Received response:", response);
});
requester.connect("tcp://localhost:5433");
// Send request for content
for (let i=1; i <= 3; i++) {
console.log("Sending request " + i + " for " + filename);
requester.send(JSON.stringify({
path: filename
}));
}
だから私はその後、私はこのような要求元のプログラムは、(target.txt
すでにファイルシステム上に存在して実行し、罰金を起動し、応答プログラムを実行します):
> node requester.js target.txt
奇妙なことは、Node.jsのシングルスレッドでは、私はへの出力は、常にがあること期待:
Sending request 1 for target.txt
Sending request 2 for target.txt
Sending request 3 for target.txt
Received response: { ...
しかし、時々私はそれを取得しますが、時々私は取得しています:
Sending request 1 for target.txt
Sending request 2 for target.txt
Received response: { ...
Sending request 3 for target.txt
はどのようにこれをすることができますか?イベントループは私の
for
ループを実行しています。これは "送信要求"行が出力され、応答ハンドラを呼び出す機会があることを意味します。 3番目のリクエストがログに記録される前に、時々レスポンスが記録されるのはなぜですか?
私は、ネットワークの不確実な性質を考えると、要求/応答の順序に頼るべきではないと思います。 あなたはrequest1と今度はrequest2とrequest3を作ることができますが、あなたはどんな順序でも応答を得ることができます。 – klikas
@klikas Node.jsのシングルスレッドの性質を理解していますか? – Jez
Node.jsがシングルスレッドであることを理解していますが、現実のシナリオでは、リクエストが常に特定の順序でサーバーにヒットすることを実際にどのように保証できるのか分かりません。 – klikas