2012-03-23 15 views
1

私はnode.jsで学校プロジェクトを開始しています。これは、TCPソケットを介して接続されたいくつかのnode.jsサーバーで構成されるシステムです。node.jsのTCPによる信頼性の高いメッセージング

私はいくつかのTCPライブラリ(ノード自体からネットモジュール、nodejitsuからnssocket、今私はゼロを試しています)を試しましたが、メッセージ配信の確認という重要な機能はないようです。

私が持っていると思いますが、このような何かを行うことができますライブラリのいくつかの種類がある

:メッセージが配信場合、または何か悪い(タイムアウト、ネットワーク障害された後にコールバック関数が呼び出されます

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

)が送信中に発生します。

私は自分のプロトコルをTCPで書くと思っていましたが、もっと頑強でテストしたいと思っています。すべての建設的な答えを

感謝:)

+0

私はあなたが戻って言って何かを送信する必要があるだろうと思います"うん、私はそれを得た"と確信している。最終的な物理的な目的地に到達しても、バッファリングはどうですか?これはTCPであり、 "メッセージ"というものはありません。それは流れです。 –

+0

うん、私はこれのようなものを考えました。しかし、今は "うん、私はそれが"パケットが失われたときに私は何をすべきですか?バッファリングは実際問題ではありません(私は思う) - それを扱うnssocketライブラリを使用します(またはデリミタをデータに追加するラッパーを単純に書くこともできます)。私が探していたのは、TCP上で「メッセージ抽象化」を提供し、メッセージが配信されているのか失われているのかを保証するライブラリのようなものでした...この要件は私にとっては絶対に重要です(そして、エキゾチックな:)私はほとんどの人が同様にそれを処理しているに違いないと確信しています...) – kobza

+0

Err、TCPに「パケットが失われました」、あるいは実際には「パケット」のようなものはありません。それはストリームであり、そのストリーム内のバイトの配送と順序は保証されていません(ソケットが閉じた場合を除き、明らかに)。保証されていないことは、データが断片化されているかどうかである。 –

答えて

0

あなた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 }); 
}); 
関連する問題