node.js - 绑定(bind)前连接时套接字忙

标签 node.js zeromq

我正在使用 zeromq将消息从 node.js 服务器推送到我的工作人员。我在 node.js 端创建了一个 router socket

var sender = zmq.socket('router');
sender.bind('tcp://127.0.0.1:6633', function(err) {
  if (err) {
    console.log( 'Error binding socket' );
    return;
  }
  console.log('OK!');
}

并通过工作代码中的dealer连接到这个地址。

当 worker 在 bind 之前首先连接时会出现问题(并非总是如此,但经常发生)。这应该不是关于 zeromq 文档的问题,所以我认为这是 node.js binding 中的问题。 ,问题是我该如何解决这个问题?

还有一个问题,我可以在 process.on('uncaughtException',...) 中捕获此异常 Socket is busy,而不是在 bind 中 函数

我应该提到我是在 Windows 7 64 位上执行此操作的。

最佳答案

问题可能是您在实际上应该使用 bindSync() 的地方使用了 bind()。当您阅读源代码时,您会发现异步 bind() 实际上是 locks the socketchecks the lock every time你用它做任何事。您可能遇到的情况是,一个工作人员在套接字解锁之前进行连接,因此它会抛出异常。只需将 bind() 替换为 bindSync() 对我有用。然而,这不是我猜想的理想解决方案,或者更确切地说不是 node.js-ish。让我们证明我的意思:

var zmq = require('zmq')
  , sender;
sender = zmq.socket('router');
sender.bind('tcp://127.0.0.1:6633', function(err) {
  if (err) {
    console.log( 'Error binding socket' );
    return;
  }
  sender.close(); // This is fine! The socket is ready!
});

sender.close(); // This is wrong! The socket is not ready yet!

因此您可以调用 bindSync() 并且不关心,或者调用 bind() 并继续回调中的工作,但您绝对不能使用 bind() 并继续而不等待它完成。 bindSync() 使代码更易于阅读,但您在调用期间阻塞了整个 node.js 实例。所以我认为 bind() 方式在应该使用 node.js 的方式上更干净......

希望这对您有所帮助 ;-)

关于node.js - 绑定(bind)前连接时套接字忙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14322599/

相关文章:

node.js - Promise 和 Azure 语音转文本

javascript - 监控间隔如何影响 ZeroMQ 中的网络流量 ~.1 [GB/s]?

node.js - 如何使用摘要身份验证在 MongoDB Atlas API 上进行身份验证?

node.js - 无法从 inversify-express-utils Controller 全局捕获错误

c++ - 如何使用新的套接字类型扩展 ZeroMQ?

python - ZMQ 上下文套接字创建在新计算机上慢得多

python 脚本在 ZMQ recv() 超时后不终止

zeromq - zeromq 中的懒惰发布/订阅,仅获取最后一条消息

javascript - 尝试通过 Dropbox SDK 访问 Dropbox API 时出现错误 500

node.js - 如何在heroku上使用react路由?