2016-07-01 4 views
1

Построение приложения с присутствием после документов firebase, есть ли сценарий, когда отключается при отключении приложения? Мы видим случаи, когда узел присутствия показывает, что приложение переходит в автономный режим, а затем обратно в сети в течение нескольких секунд, когда мы не теряем сетевое соединение.Firebase onDisconnect() стрельба несколько раз

Мы видим на нескольких встроенных устройствах, установленных в поле, где для присутствия установлено значение «ложь», а затем почти сразу же назад - «истина», и оно происходит на всех устройствах в течение нескольких секунд друг от друга. Из проведенного нами тестирования и онлайн-документов мы знаем, что, если мы потеряем подключение к Интернету на устройстве, он занимает примерно 60 секунд, прежде чем таймаут на сервере запускает метод onDisconnect().

С тех пор мы добавили код в метод присутствия, который позволяет устройству, если он видит, что узел присутствия установлен в false, пока приложение действительно работает, вернет его обратно в true. Иногда, когда это происходит, мы получаем одну запись обратно в true, и это конец, в других случаях это похоже на то, что сервер и клиент сражаются друг с другом, а узел сбрасывается до истины много раз в течение 50-200 миллисекунды. Мы отслеживаем это путем нажатия на другой узел в GUID устройства каждый раз, когда мы заставляем присутствие вернуться к истинному. Это происходит только во время работы модуля и после того, как оно первоначально устанавливает присутствие.

Вот метод, который мы вызываем из наших различных модулей, работающих на устройстве, чтобы мы могли контролировать состояние каждого из модулей в любой момент времени.

exports.online = function (program, currentProgram) { 
var programPath = process.env.FIREBASE_DEVICES + process.env.GUID + '/status/' + program 
    var onlinePath = process.env.FIREBASE_DEVICES + process.env.GUID + '/statusOnlineTimes/' + program 
    var programRef = new firebase(programPath); 
    var statusRef = new firebase(process.env.FIREBASE_DEVICES + process.env.GUID + '/status/bootup'); 
    var onlineRef = new firebase(onlinePath) 
    amOnline.on('value', function(snapshot) { 
    if (snapshot.val()) { 
     programRef.onDisconnect().set(false); 
     programRef.set(true); 
     programRef.on('value', function(snapshot){ 
     if (snapshot.val() == false){ 
      programRef.set(true); 
      console.log('[NOTICE] Resetting', program, 'module status back to True after Fireabase set to False') 
      var objectToPush = { 
      program: program, 
      time: new Date().toJSON() 
      } 
      onlineRef.push(objectToPush) 
     } 
     }) 
     if (currentProgram != undefined) { 
     statusRef.onDisconnect().set('Offline') 
     statusRef.set(currentProgram) 
     } 
    } 
    }); 

вопрос мы там когда-нибудь экземпляр, где Firebase звонит метод, даже если он на самом деле не теряет свой статус в OnDisconnect()? У нас были случаи, когда мы увидели, что устройство переходит в автономный режим, а затем обратно через 60 секунд, прежде чем мы добавим код сброса. Код сброса состоял в том, чтобы бороться с еще одной проблемой, которая была у нас в поле, где, если питание было прервано на устройство, и он не сделал чистый выход, устройство может перезагрузиться и сбросить присутствие с помощью нового UID до истечения таймаута для предыдущего экземпляр уволился. Затем, как только тайм-аут будет запущен, устройство будет отображаться как офлайн, даже если оно действительно онлайн.

ответ

0

Таким образом, мы смогли остановить множественные нажатия, которые произошли, когда устройство снова подключилось, добавив вызов programRef.off() непосредственно перед вызовом programRef.on (...). То, что мы решили сделать, заключается в том, что в любое время, когда устройство вышло из автономного состояния, а callback amOnline.on (...) выпустил новый слушатель.

Теперь мы можем обрабатывать случай, когда onDisconnect() запускается из более ранней программы PID и перезаписывает текущую активную программу со статусом offline. Это, похоже, решает проблему, с которой мы сталкиваемся с состоянием гонки устройств в поле, которое может перезагружаться и восстанавливать соединение до запуска onDisconnect() для экземпляра, который не был полностью удален.

У нас по-прежнему возникает проблема, когда все устройства уходят, а затем обратно в сеть примерно в одно и то же время (в течение 1-3 секунд друг от друга). Существуют ли случаи, когда Firebase сбрасывает узел ./info/connected? Поскольку мы контролируем присутствие и фактически регистрируемся на событиях и вне событий, возможно, мы просто ловим событие, которое большинство людей не видит? Или есть что-то, что мы делаем неправильно?

Смежные вопросы