Pregunta

Encuentro transacciones ( https://www.firebase.com/docs/transactions.html ) aSé una forma genial de manejar la concurrencia, sin embargo, parece que solo se pueden hacer de los clientes.

La forma en que usamos Firebase es principalmente escribiendo datos de nuestros servidores y observándolos en clientes.¿Hay alguna manera de lograr un modelo de concurrencia optimista al escribir datos a través de API de descanso?

¡Gracias!

¿Fue útil?

Solución

Podría utilizar un contador de actualización para hacer que Write Ops funcione de manera similar a las transacciones.(Voy a usar un pseudo-código a continuación; Lo siento por eso, pero no quería escribir una API de descanso completa para un ejemplo).

Por ejemplo, si tengo un objeto como este:

{
   total: 100,
   update_counter: 0
}

y una regla de escritura como esta:

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

Ahora podría prevenir modificaciones concurrentes simplemente pasando en la actualización.Por ejemplo:

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);
   }
}

Otros consejos

FYI, la base de datos en tiempo real de Firebase apoya oficialmente esto ahora.

Lea el Blog y el docs para más información.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top