скорость чтения базы данных в реальном времени - PullRequest
0 голосов
/ 17 января 2019

моя работа заключается в том, что firebase подписывается на брокер mqtt и разбивает полученные брокером сообщения в БД в реальном времени

Нет задержки при получении сообщения mqtt, но если узел уже существует в БД и если он существует, то последнее значение ключа и операции записи данных занимают около 1-2 секунд каждая

вот мой код

function handleMsg(topic, payload) {
    //send message to start
    const msg_text = payload.toString()

    test_promise(msg_text)
    .then(function(snapshot){return test_promise2(snapshot);})
    .then(function(snapshot){return test_promise3(snapshot);})
    .then(function(msg){ console.log(log); log='';})
    .catch(function(msg) { console.log(log); log='';});
}
function test_promise(msg_text){
    return new Promise(function (resolve, reject){
        msg_split = msg_text.split("::");
        var db_ref = db.ref("backmountain_"+device_id+"_"+time);    
        db_ref.once('value',function(snapshot){
            //strat -> end , 1.4 ~ 2 second
            return resolve(msg_text+"::"+snapshot.exists());
        }).catch(function(err){
            return reject("test_promise reject : "+err);
        });
    });
}
function test_promise2(msg_text){
    return new Promise(function (resolve, reject){
        var db_ref = db.ref("backmountain_"+device_id+"_"+time);    
        if(chk_exists == "true"){
            //key orderByKey > orderByChild > orderByValue  
            db_ref.orderByKey().limitToLast(1).once("child_added").then( function(lastkey){
               //strat -> end , 1.4 ~ 2 second
                return resolve(msg_text+"::"+s_id);
            })
            .catch(function(err){
                return reject("test_promise2 limitToLast reject : "+err);
            });
        } else if(chk_exists=='false'){
            return resolve(msg_text+"::"+"1");  
        }
    });
}
function test_promise3(msg_text){
    return new Promise(function (resolve, reject){
        var db_ref = db.ref("backmountain_"+device_id+"_"+time);    
        db_ref.push().set({
            data
        }).catch(function(err){
            return reject("test_promise3 set reject : "+err);
        });
        return resolve("test_promise3 OK : ");
    });
}

Я развернул тестовую функцию, разложил каждую задачу БД и попробовал ее одну за другой, но это происходит потому, что произошла та же задержка, поэтому она не задерживается обещанием

Я в основном работал над примерами, поэтому, если у вас есть другие хорошие способы или вам нужна дополнительная настройка, пожалуйста, ответьте на них.

Структура БД здесь

введите описание изображения здесь

1 Ответ

0 голосов
/ 17 января 2019

Документация гласит следующее. Почему бы просто не сохранить все как новое, поскольку это уже работает для вас? Вы можете использовать облачную функцию для Firebase, чтобы периодически архивировать / удалять старые сообщения.

Например, приложение для ведения блогов в социальных сетях может создать сообщение и одновременно обновите его до фида недавней активности и публикации фид активности пользователя, используя такой код:

function writeNewPost(uid, username, picture, title, body) {
  // A post entry.
  var postData = {
    author: username,
    uid: uid,
    body: body,
    title: title,
    starCount: 0,
    authorPic: picture
  };

  // Get a key for a new Post.
  var newPostKey = firebase.database().ref().child('posts').push().key;

  // Write the new post's data simultaneously in the posts list and the user's post list.
  var updates = {};
  updates['/posts/' + newPostKey] = postData;
  updates['/user-posts/' + uid + '/' + newPostKey] = postData;

  return firebase.database().ref().update(updates);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...