gpt4 book ai didi

node.js - 如何使用 zmq (zeromq) 在两个 NodeJS 服务器之间发送多个请求和路由异步响应?

转载 作者:搜寻专家 更新时间:2023-11-01 00:31:19 26 4
gpt4 key购买 nike

我有一个 NodeJS API 网络服务器(我们称它为 WS1),它从客户端接收 RESTful HTTP 请求,并响应需要首先查询另一个本地服务器(我们称它为 WS2)。

流程大致是这样的:

  1. WS1 接收来自客户端的 HTTP 请求并对其进行解析。
  2. WS1 向 WS2 发送请求以获取一些信息。
  3. 当 WS1 收到来自 WS2 的响应时,它完成对原始请求的处理并将响应发送回客户端。

到目前为止,WS1 和 WS2 之间的所有通信都是通过 HTTP 请求完成的,因为两台机器位于同一本地网络上。

虽然我正在考虑开始使用 zmq,但为了加快速度反而。我查看了他们在文档中显示的模式,但仍未找出并发问题。

WS1 每秒可以向 WS2 发送许多请求,并且不能保证 WS2 以与接收请求相同的顺序回复,因为一些异步操作在内部可能比其他操作花费更长的时间。

那么,在 NodeJS 中使用 zmq,我如何确保当 WS1 从 WS2 收到消息时它知道它属于哪个原始客户端请求?是否有内置机制来处理它?<​​/p>

谢谢!

最佳答案

0MQ 是一个有趣的工具集,有助于抽象套接字通信。有一些机制(你应该选择正确的套接字类型)允许服务器响应正确的客户端,并且它是在 0mq 的范围内处理的。

基本的 API 类型是:

  1. 推拉
  2. 发布-订阅
  3. 请求-回复

如果您希望能够让一台机器响应发起者,那么我相信您需要 REQ-REP api 类型。

然后您需要考虑每一侧的多路复用以使连接器正确。但为了简单起见,一开始保持一对一:

示例客户端(来自 http://zguide.zeromq.org/js:rrclient

// Hello World client in Node.js
// Connects REQ socket to tcp://localhost:5559
// Sends "Hello" to server, expects "World" back

var zmq = require('zmq')
, requester = zmq.socket('req');

requester.connect('tcp://localhost:5559');
var replyNbr = 0;
requester.on('message', function(msg) {
console.log('got reply', replyNbr, msg.toString());
replyNbr += 1;
});

for (var i = 0; i < 10; ++i) {
requester.send("Hello");
}

示例服务器(来自 http://zguide.zeromq.org/js:rrserver)

// Hello World server in Node.js
// Connects REP socket to tcp://*:5560
// Expects "Hello" from client, replies with "World"

var zmq = require('zmq')
, responder = zmq.socket('rep');

responder.connect('tcp://localhost:5560');
responder.on('message', function(msg) {

console.log('received request:', msg.toString());
setTimeout(function() {
responder.send("World");
}, 1000);
});

返回客户端的回复路由由 0MQ 自动处理。它是消息的一部分(虽然我不记得你是否在这些示例中看到了地址缓冲区——它可能被抽象掉了)。请求信封如下所示:

enter image description here

它是第一帧,它允许 0MQ 能够回复正确的客户端。

一旦它开始运行,您就可以考虑 1..* *..1 和 ..。它真正做的只是要求您在适当的地方将套接字类型更改为 DEALER 和 ROUTER。

enter image description here

关于node.js - 如何使用 zmq (zeromq) 在两个 NodeJS 服务器之间发送多个请求和路由异步响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32668327/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com