为什么我在更新节点时收到重复项?
Why do I receive duplicates while updating a node?
Gun 0.8.8,Node.js-到-Node.js,Node.js-到-浏览器
这是jsfiddle中的前端模拟https://jsfiddle.net/sergibondarenko/tktodk62/20/
为了彻底开始,我从 Chrome 本地存储中删除了本地 data.json
和 gun
数据。
在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
为什么我会收到重复的邮件?
更新
即使只有一个枪友也有重复
如果我理解正确的话,(不久前我自己也有这个问题)那是因为Gun假设它在一个去中心化的格子网络中。每个获得更新的节点都会将该更新重新广播到它知道的所有节点。尽管 Gun 目前是通过中继服务器集中的,但它是为去中心化而构建的。因此,当你创建一个更改时,你会广播它,但现在它只是通过中继服务器为你广播到每个节点,包括你自己的节点。因此,如果您有一个由三个对等点组成的网络,中继服务器会将更新发送给所有三个点(包括您)。您的对等方可以删除重复数据而不是重新广播更新,但其他节点将重新广播它假设去中心化。因此,您将从服务器获得一个更新,然后从每个其他节点获得另一个更新。
我仍然不太清楚为什么当我是唯一的同伴时我会收到多个更新 ping。我相信这与服务器慷慨地不止一次地广播更改有关,只是为了给系统增加一些冗余。
Gun 0.8.8,Node.js-到-Node.js,Node.js-到-浏览器
这是jsfiddle中的前端模拟https://jsfiddle.net/sergibondarenko/tktodk62/20/
为了彻底开始,我从 Chrome 本地存储中删除了本地 data.json
和 gun
数据。
在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
为什么我会收到重复的邮件?
更新
即使只有一个枪友也有重复
如果我理解正确的话,(不久前我自己也有这个问题)那是因为Gun假设它在一个去中心化的格子网络中。每个获得更新的节点都会将该更新重新广播到它知道的所有节点。尽管 Gun 目前是通过中继服务器集中的,但它是为去中心化而构建的。因此,当你创建一个更改时,你会广播它,但现在它只是通过中继服务器为你广播到每个节点,包括你自己的节点。因此,如果您有一个由三个对等点组成的网络,中继服务器会将更新发送给所有三个点(包括您)。您的对等方可以删除重复数据而不是重新广播更新,但其他节点将重新广播它假设去中心化。因此,您将从服务器获得一个更新,然后从每个其他节点获得另一个更新。
我仍然不太清楚为什么当我是唯一的同伴时我会收到多个更新 ping。我相信这与服务器慷慨地不止一次地广播更改有关,只是为了给系统增加一些冗余。