【问题标题】:Reliable messaging over TCP in node.jsnode.js 中基于 TCP 的可靠消息传递
【发布时间】:2012-03-23 14:54:31
【问题描述】:

我正在 node.js 中开始一个学校项目。这是一个由几个通过 TCP 套接字连接的 node.js 服务器组成的系统。

我尝试了一些 TCP 库(来自 node 本身的 Net 模块,来自 nodejitsu 的 nssocket,现在我正在尝试 zeromq),但它们似乎没有一个重要功能:消息传递确认。

我想要的是某种允许执行以下操作的库:

client.connect(server, port);
client.send(data, function callback(err, res) { ... });

在消息传递后或发送过程中发生错误(超时、网络故障)时,将调用回调函数。

我在想我会在 TCP 上编写自己的协议,但我更喜欢一些更健壮和经过测试的协议。

感谢任何建设性的回答:)

【问题讨论】:

  • 我认为你必须发回一些东西说“是的,我知道了”才能确定。即使它到达最终的物理目的地,缓冲等呢?再加上这是 TCP,没有“消息”之类的东西。这是一个流。
  • 是的,我想到了这样的事情。但是现在当“是的,我知道了”数据包丢失时我该怎么办?缓冲并不是一个真正的问题(我认为) - 我使用处理它的 nssocket 库(或者我可以简单地编写一些包装器,为数据添加分隔符......)。我一直在寻找的是某种库,它通过 TCP 提供“消息抽象”,并确保消息是传递还是丢失......这个要求对我来说绝对是至关重要的(我不认为它是异国情调 :) 我几乎可以肯定其他人一定也处理过它......)
  • Err,TCP 中不存在“丢失数据包”之类的东西,或者实际上没有“数据包”之类的东西。它是一个流,并且该流中字节的传递和顺序是保证(除非套接字关闭或其他什么,显然)。 保证的是数据是否会被分散或集中在一起。
  • 好的,我可能应该更深入地了解 TCP。谢谢!

标签: node.js


【解决方案1】:

这不是很方便,因为当您A->B 正常,但接收确认失败(B->A)时会发生什么?无论如何,很容易自己滚动,比如(伪):

发件人

var callbacks = {};
function send (msg, callback) {
    // assign unique request id
    msg.msgId = uuid.v4();
    msg.timestamp = new Date();
    callbacks[msg.msgId] = callback;

    // send over TCP
}

socket.on("confirmation", function (msg) {
    callbacks[msg.msgId](null);
    delete callbacks[msg.msgId];
});

// now you'll need some polling mechanism that checks for messages that take
// more than the timeout and clean them

接收者

socket.on("message", function (msg) {
    // send confirmation to sender
    socket.emit("confirmation", { msgId: msg.msgId });
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 2016-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多