为什么在更新节点时会收到重复项?

时间:2017-10-23 15:43:05

标签: javascript gun

Gun 0.8.8,Node.js-to-Node.js,Node.js-to-browser

以下是jsfiddle https://jsfiddle.net/sergibondarenko/tktodk62/20/

中的前端模拟

要做一个干净的开始,我从Chrome本地存储中删除了本地data.jsongun数据。

在Node.js中创建一个节点

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);
});

按预期获得1个结果,好

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

另外,我在浏览器端有一个监听器

<!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'
});

在两个侦听器上接收重复结果

Node.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

为什么我会收到重复项?

更新

即使只有一个枪支同伴,也有重复。

1 个答案:

答案 0 :(得分:2)

如果我理解正确,(我不久前就自己提出了这个问题)那么它就是因为Gun认为它是在一个分散的格子网络中。获得更新的每个节点,重新广播更新到它知道的所有节点。即使Gun目前通过中继服务器集中,它也可以分散构建。因此,当您创建更改时,您将广播它,但是现在它只是通过中继服务器,它将广播给您包括您自己的每个节点。因此,如果您有三个对等网络,则中继服务器会将更新发送给所有三个(包括您)。您的对等方可以进行重复数据删除而不是重新广播更新,但其他节点将重新广播它,假设分散。因此,您将从服务器获得一个更新,然后从另一个节点获得另一个更新。

当我是唯一的同伴时,我还不太清楚为什么我会获得多次更新ping。我相信它与服务器有关,只是为了给系统添加一些冗余而不止一次地广播变化。