2014-04-13 54 views
6

İşlemlerin (https://www.firebase.com/docs/transactions.html) eşzamanlı bir şekilde ele alınması için harika bir yol olduğunu görüyorum, ancak yalnızca istemcilerden yapılabilir.REST API aracılığıyla Firebase işlemleri

Firebase'i kullanma biçimimiz, esas olarak sunucularımızdan veri yazmak ve bunları istemcilerde gözlemlemek. REST API aracılığıyla veri yazarken iyimser bir eşzamanlılık modeli elde etmenin bir yolu var mı?

Teşekkürler!

+0

Merhaba Martin, bu çalışmayı nasıl öngörüyorsunuz? İşlemlerin, istemcinin verileri ayarlama girişiminde bulunduğunu, sunucunun eşzamanlı değişiklikler ile yanıt vermeyi sürdürdüğü ve sonuçta bir değere ya da pes etmeyi sürdürdüğü bir geri-tartışmaya dayandığını unutmayın. – Kato

+0

Merhaba Kato, kesinlikle aynı tartışma sunucusu tarafını uygulamaya çalışıyorum. Bir nesnenin mevcut durumunu GET isteği ile firebase içinde alabilir ve daha sonra PUT ile değiştirebilirim, ancak bu nesnenin değiştirilip değiştirilmediğini bilmek için bir yol var mı? –

+0

Sanmıyorum; REST ile işlem denemenin bir parçası olan budur. Sanırım, işlemleri kolayca simüle eden bir çözüm oluşturabiliriz. Bir cevap vereyim. – Kato

cevap

13

Yazma işlemlerinin işlemlere benzer şekilde çalışması için bir güncelleştirme sayacı kullanabilirsiniz. (Aşağıda bazı sahte kodları kullanacağım; bunun için üzgünüm ama örnek için tam bir REST API'si yazmak istemedim.)

Örneğin, böyle bir neslim varsa:

{ 
    total: 100, 
    update_counter: 0 
} 

Ve böyle bir yazma kuralı:

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

şimdi sadece her operasyonla update_counter ileterek eşzamanlı değişiklikler önleyebilir.

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

Bu oldukça etkileyici görünüyor, çok teşekkürler! Bunu uygulamaya çalışacağım ve herhangi bir sorun olup olmadığını size bildireceğim. –

+0

Nesneleri güncellemek için mükemmel çalışır. Silmek için benzer bir şey uygulamak mümkün mü? –

+0

@ MartinŠťáva Bunu yapmak gerçekten mümkün değil, çünkü bir DELETE ile veri aktarmıyorsunuz. Sistemlerin çoğunun bunu önemsemediğini sanmıyorum, çünkü DELETE demeniz durumunda, DELETE demek istiyorsunuz demektir, ve doğru anahtar/URL'yi referans aldığınız sürece bundan önce ne olduğuyla ilgilenmiyorsunuz. –

3

Bilginize, Firebase Gerçek Zamanlı Veri Tabanı resmen şimdi bu destekler.

Daha fazla bilgi için blog ve docs10'u okuyun.

+0

@Martin Šťáva Evet, kullanıyorlar ve kullanıyorum ve işe yarıyor. – bibscy