Почему я получаю дубликаты при обновлении узла?

1

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

Вот симуляция интерфейса в jsfiddle https://jsfiddle.net/sergibondarenko/tktodk62/20/

Для чистого старта я удалил локальные данные data.json и gun из локального хранилища Chrome.

Создание узла в 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

1 ответ

2
Лучший ответ

Если я правильно понимаю, (И у меня был этот вопрос сам не так давно), то это потому, что Gun предполагает, что он находится в децентрализованной сетке решетки. Каждый узел, который получает обновление, ретранслирует это обновление ко всем узлам, о которых он знает. Несмотря на то, что Gun в настоящее время централизован через сервер ретрансляции, он построен для децентрализации. Поэтому, когда вы создаете изменение, вы будете транслировать его, но прямо сейчас он проходит через сервер ретрансляции, который транслирует вас на каждый узел, включая ваш собственный. Поэтому, если у вас есть сеть из трех одноранговых узлов, сервер ретрансляции отправляет обновление всем трем (включая вас). Ваш партнер может дедуплицировать, а не ретранслировать обновление, но другие узлы будут ретранслировать его, предполагая децентрализацию. Таким образом, вы получите одно обновление с сервера, а затем другое из другого узла.

Я до сих пор не совсем понимаю, почему я получаю несколько обновлений, когда я являюсь единственным партнером. Я считаю, что это как-то связано с тем, что сервер щедро трансформирует изменение более одного раза, чтобы добавить некоторую избыточность в систему.

  • 0
    Да, у вас есть дубликаты, если есть несколько пиров github.com/amark/gun/wiki/porting-gun . Но есть дубликаты, даже если есть только один сверстник. Очень странно, я думаю, что это ошибка.
  • 0
    Я слышал, что если вы используете адаптер хранения, адаптер хранения ведет себя как одноранговый узел, а также ретранслирует обновление.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню