2017-10-23 5 views
1

ガン0.8.8、Node.jsのツーのNode.js、Node.jsのツーブラウザノードを更新中に重複を受け取るのはなぜですか?ここで

は、私は地元の削除クリーンなスタートを行うにjsfiddle https://jsfiddle.net/sergibondarenko/tktodk62/20/

におけるフロントエンドのシミュレーションですChromeローカルストレージのdata.jsongunのデータ

はまた

v: { _: { '#': 'j948ewfltvmmHthoESzM', '>': { num: 1508766155692 } }, 
    num: 0 } 
k: stats 

良い、予想通り1件の結果を取得します

const gun = new Gun({peers:['http://localhost:8080/gun', 'http://localhost:8081/gun']});  
const node = gun.get('watcher/f0de26c0-a29f-11e7-8661-154b982951a4'); 
node.on(function (v, k) { 
    console.log('v:', v); 
    console.log('k:', k); 
}); 

は、Node.jsの

const node = gun.get('watcher/f0de26c0-a29f-11e7-8661-154b982951a4'); 
node.get('stats').on(function (v, k) { 
    console.log('v:', v); 
    console.log('k:', k); 
}); 

に聞くのNode.js

にノードを作成し、私がリスナーを持っていますブラウザ側で

<!DOCTYPE html> 
<html> 
    <script src="http://rawgit.com/amark/gun/master/gun.js"></script> 
    <body> 
    <script> 
     var gun = new Gun({peers:['http://localhost:8080/gun', 'http://localhost:8081/gun']}); 
     var node = gun.get('watcher/f0de26c0-a29f-11e7-8661-154b982951a4'); 
     node.get('stats').on(function (v, k) { 
     console.log('v:', v); 
     console.log('k:', k); 
     }); 
    </script> 
    </body> 
</html> 

そして予想通りノード作成に1つの結果を得る、良い

index.html:9 v: {"_":{"#":"j949102jDUdSklGduZh8",">":{"num":1508767186838}},"num":0} 
index.html:10 k: stats 

その後、私はノードを更新

const node = gun.get('watcher/f0de26c0-a29f-11e7-8661-154b982951a4'); 
node.put({ 
    stats: { 
    num: 2 
    }, 
    name: 'trex' 
}); 

そしてノード

両方のリスナーに重複結果を受け取ります.js

v: { _: { '#': 'j949102jDUdSklGduZh8', '>': { num: 1508769723940 } }, 
    num: 2 } 
k: stats 
v: { _: { '#': 'j949102jDUdSklGduZh8', '>': { num: 1508769723940 } }, 
    num: 2 } 
k: stats 

ブラウザ

index.html:9 v: {"_":{"#":"j949102jDUdSklGduZh8",">":{"num":1508769723940}},"num":2} 
index.html:10 k: stats 
index.html:9 v: {"_":{"#":"j949102jDUdSklGduZh8",">":{"num":1508769723940}},"num":2} 
index.html:10 k: stats 

は、なぜ私は重複を受けるのですか?


UPDATE

一つだけの銃ピアがあっても、重複があります。

答えて

2

私が正しく理解していれば(そして私はずっと前にこの質問をしていました)、Gunはそれが分散型格子ネットワークであると仮定しているからです。更新を取得した各ノードは、それが知っているすべてのノードに更新を再ブロードキャストします。 Gunは現在、リレーサーバーを介して集中管理されていますが、分散されるように構築されています。したがって、変更を作成するときにはブロードキャストしますが、現在はリレーサーバーを経由して、自分のものを含むすべてのノードにブロードキャストします。したがって、3つのピアからなるネットワークがある場合、リレーサーバーは3つすべて(あなたを含む)に更新を送信します。ピアは重複排除を行い、更新を再ブロードキャストできませんが、他のノードは分散化を前提に再ブロードキャストします。したがって、サーバーから1つの更新を取得し、次に別のノードから別の更新を取得します。

私が唯一のピアであるときに複数のアップデートpingが得られる理由はまだ分かりません。私は、システムに何らかの冗長性を追加するために、サーバが何度も変更を広範囲に放送していることと、何か関係があると考えています。

+0

はい、複数のピアhttps://github.com/amark/gun/wiki/porting-gunがある場合は重複しています。しかし、唯一のガンピースがあっても重複があります。非常に奇妙な、私はバグだと思う。 – trex

+0

ストレージアダプタを使用している場合、ストレージアダプタはピアのように動作し、アップデートを再ブロードキャストしていると聞いています。 – Joe

+1

@trex '.on(cb)'が複数回呼び出されることは、同じデータであっても、常に「正しい」動作とみなされます。だから、この答えを正しいものとしてマークしてください。同じデータを複数回取得することは確か迷惑になる可能性があるので、代わりに '.open(cb)'を使用することをお勧めします。文書の深さ全体を提供するなどの便利な機能がたくさんあります。https:/ /github.com/amark/gun/wiki/API#open。将来的には、どのように騒がしい '.on(cb)'を減らそうとしますが、今は必要です。 – marknadal

関連する問題