Вопрос

Я нахожу транзакциями ( https://www.firebase.com/docs/transactions.html )Будьте крутым способом обработки параллелизма, однако кажется, что они могут быть сделаны только от клиентов.

То, как мы используем Firebase, в основном путем записи данных с наших серверов и наблюдая за ними на клиентах.Есть ли способ добиться оптимистической модели параллелизма при записи данных через API для отдыха?

Спасибо!

Это было полезно?

Решение

Вы можете использовать счетчик обновлений, чтобы сделать запись OPS подобным образом для транзакций.(Я собираюсь использовать немного псевдоустройства ниже; извините за это, но я не хотел написать полный API для отдыха на примере.)

Например, если у меня есть такой объект:

{
   total: 100,
   update_counter: 0
}
.

и правило записи, как это:

{
   ".write": "newData.hasChild('update_counter')",
   "update_counter": {
      ".validate": "newData.val() === data.val()+1"
   }
}
.

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

var url = 'https://<INSTANCE>.firebaseio.com/path/to/data.json';
addToTotal(url, 25, function(data) {
   console.log('new total is '+data.total);
});

function addToTotal(url, amount, next) {
   getCurrentValue(url, function(in) {
      var data = { total: in.total+amount, update_counter: in.update_counter+1 };
      setCurrentValue(ref, data, next, addToTotal.bind(null, ref, amount, next));
   });
}

function getCurrentValue(url, next) {
   // var data = (results of GET request to the URL) 
   next( data );
}

function setCurrentValue(url, data, next, retryMethod) {
   // set the data with a PUT request to the URL
   // if the PUT fails with 403 (permission denied) then
   // we assume there was a concurrent edit and we need
   // to try our pseudo-transaction again
   // we have to make some assumptions that permission_denied does not
   // occur for any other reasons, so we might want some extra checking, fallbacks,
   // or a max number of retries here
   // var statusCode = (server's response code to PUT request)
   if( statusCode === 403 ) {
       retryMethod();
   }
   else {
       next(data);
   }
}
.

Другие советы

fyi, база данных realtime firebase официально поддерживает это сейчас.

Прочитайте блог и Документы для получения дополнительной информации.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top