2013-07-03 17 views
38

Firebase, bir kaynağın güncellenmesine olanak tanır transactionally. Anladığım kadarıyla, bu alıcı, "Eski değer X ise, yeni değeri Y yapın" diyerek sunucuya bu satın alma isteklerini gönderir. Çekişme varsa sunucu, kabul edilene kadar istemciden çoklu güncellemeleri reddedebilir.Firebase: Birden çok kaynağı nasıl atomik olarak güncellerim?

Şimdi, birden çok kaynağı atomik olarak güncellemek istiyorsam ne olur?

İlk güncelleştirme kabul edilirse ne olur ve sonra ikinci güncellemenin kabul edilmesinden önce istemcinin bağlantısı kesilir. Bir atomik işlemde birden çok güncelleme eklemenin bir yolu var mı? Aksi takdirde, bu problem için idiomatik bir çözüm var mı?

cevap

44

GÜNCELLEME

O atomik çoklu konumları düzenlemek için şimdi mümkündür. Ayrıntılar için bkz. this blog post.

var mergedUpdate = {}; 
mergedUpdate[ 'users/' + userId + '/widgets/' + widgetId ] = true; 
mergedUpdate[ 'widgets/' + widgetId ] = widgetData; 

var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com/"); 
ref.update(mergedUpdate); 

Bu (değer şu anda X ise, Y'nin olun) işlem verilerini uygulanması, ancak bu parça security rules taşınmış olabilir değildir. Örneğin, aynı anda iki sayaçları güncellemek istiyorsanız, aşağıdaki gibi kuralları ekleyebilirsiniz:

{ 
    "counter1": { 
    ".validate": "newData.val() === (data.val()||0)+1" 
    }, 

    "counter2"1 { 
    ".validate": "newData.val() === (data.val()||0)+1" 
    } 
} 

Şimdi yukarıdaki gibi aynı çoklu yol güncellemesini deneyebilir. En son onları sunucudan okuduğumuzdan beri değerler değiştiyse, girişim başarısız olur. Başarısızlığın doğrulamadan kaynaklanıp kaynaklanmadığını görmek için if(error.code === 'PERMISSION_DENIED') { ... } numaralı telefonu kontrol edebilir ve buna göre tekrar deneyebiliriz.

ORİJİNAL SONRASI

Bunu yapmanın tek yolu ortak bir atadan üzerinde işlem çalıştırmaktır. Örneğin,/a/b/c ve/a/x/y'yi güncellemek isterseniz,/a konumunda bir işlem yürütebilir ve her iki değeri de değiştirebilirsiniz. Bu yaklaşımın olumsuz tarafı, işlem içindeki tüm verilerin indirilmesi ve sunucuya geri gönderilmesi gerektiğinden, ağ G/Ç'lerinde pahalı olabileceği yönündedir.

Göz önünde bulundurmak isteyebileceğiniz daha karmaşık ancak potansiyel olarak daha güçlü bir yaklaşım, verilerinizi yeniden yapılandırmaktır, böylece gerçek değerleri depolamak yerine, düzenlemelerin geçmişini depolarsınız. Örneğin, banka bakiyesi bilgilerini saklıyorsanız, para yatırma ve para çekme geçmişi saklayabilirsiniz. O zaman dengeyi almak istediğinde, tüm geçmişi tekrar oynayacak ve son dengeyi hesaplayacaksın.

Bu yaklaşımın güzelliği, atomik güncellemeler yapmanıza izin vermesidir. Örneğin, accountA'dan accountB'ye para aktarıyorsanız, günlüğün sonuna "hesap A'dan accountB N dolara transfer" diyen bir öğe eklersiniz. Tek elemanın atomik bir işlem olduğunu eklemek.

Bu, ortak metin düzenleyicimiz olan Firepad ile yaptığımız yaklaşımdır.

+0

Cevabınız için teşekkür ederiz. Kavramsal olarak güncellemekten ziyade yeni işlemlerin saklanması gibi kavramsal olarak, ama bir sorgu materyalizasyon özelliği varsa bunun sadece performans açısından bakılabilir olduğunu düşünüyorum. Tüm tarihin tekrar oynatılması yavaş olacaktır. –

+0

Bir tane yok (en azından henüz değil), fakat bunun nasıl faydalı olacağını kesinlikle görüyoruz! Şimdilik, istemcideki sorguyu gerçekleştirebilir ve Firebase'de bir "kontrol noktası" na geri yükleyebilirsiniz (bu, Firepad'in nasıl çalıştığını gösterir), veya bir materyalin gerçekleştiği bir Firebase istemcisi olarak çalışan bir node.js veya Java tabanlı sunucuya sahip olabilirsiniz. senin için. –

+0

HI! Thanx, ama ben bunu denedim ve bir hata aldım: "Satır 10: Sol işleneni, || boole olmalıdır." Bir şey mi eksik? Firebase 3.0 kullanıyorum ... –

0

başka bir yolu .... çok sıkıcı olduğunu ... ve gerçekten işlemler ... Firebase atomik sağlayan bir değere değiştirir gibi, anlamı olan bir kilit veya semafor yaratabilecek

"başlatılmamış x, y ve z kaynaklarındaki bir işlem "...Tabii ki, kaynakları engellemediği için gerçek bir işlem değil, kilidin bir parçası. Sözleşmeyle işleme diyebiliriz. Müşteriler, kilit dolu olduğunda, x, y ve z kaynaklarını değiştirmemeleri gerektiğini bilmelidirler.

+2

Bu iki müşteri aynı anda semafor için sorduğunda bu tatili. gerçek bir kilit değil bu yüzden eşzamanlılık sorunu çözmez, sadece şansını azaltır. –

İlgili konular