2014-04-13 14 views
6

Ich finde Transaktionen (https://www.firebase.com/docs/transactions.html) eine coole Art der Behandlung von Nebenläufigkeit, aber es scheint, dass sie nur von Clients aus erfolgen können.Firebase-Transaktionen über REST-API

Wir verwenden Firebase hauptsächlich, indem wir Daten von unseren Servern schreiben und sie auf Clients beobachten. Gibt es eine Möglichkeit, ein optimistisches Parallelitätsmodell zu erstellen, wenn Daten über die REST-API geschrieben werden?

Danke!

+0

Hallo Martin, wie stellst du dir das vor? Denken Sie daran, dass diese Transaktionen auf einer Hin-und-her-Diskussion beruhen, bei der der Client versucht, die Daten zu setzen, der Server antwortet immer wieder mit gleichzeitigen Änderungen, und sie legen schließlich einen Wert fest oder geben auf. – Kato

+0

Hallo Kato, sicher, ich versuche, genau die gleiche Diskussion Server-Seite zu implementieren. Ich kann den aktuellen Status eines Objekts innerhalb der Firebase über die GET-Anforderung abrufen und dann über PUT ändern, aber gibt es eine Möglichkeit für mich zu wissen, ob dieses Objekt inzwischen geändert wurde? –

+0

Ich glaube nicht; Das ist Teil der Probleme mit dem Versuch, Transaktionen über REST zu versuchen. Ich nehme an, wir könnten eine Lösung zusammenstellen, die Transaktionen einfach genug simuliert. Lass mich eine Antwort geben. – Kato

Antwort

13

Sie könnten einen Aktualisierungszähler verwenden, um Schreiboperationen ähnlich wie Transaktionen auszuführen. (Ich werde unten einen Pseudo-Code verwenden; tut mir leid, aber ich wollte kein vollständiges REST-API für ein Beispiel schreiben.)

Zum Beispiel, wenn ich ein Objekt wie dieses habe:

{ 
    total: 100, 
    update_counter: 0 
} 

und eine Schreibregel wie folgt aus:

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

ich jetzt gleichzeitige Änderungen bei jedem Vorgang durch einfaches Durchleiten im update_counter verhindern könnte. Zum Beispiel:

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

Das sieht ziemlich beeindruckend aus, vielen Dank! Ich werde versuchen, es umzusetzen und Sie wissen zu lassen, ob irgendwelche Probleme auftreten. –

+0

Funktioniert perfekt zum Aktualisieren von Objekten. Ist es möglich, eine ähnliche Sache zum Löschen zu implementieren? –

+0

@ MartinŠťáva Es ist nicht wirklich möglich, das zu tun, denke ich, da Sie keine Daten mit einem DELETE übergeben. Ich denke nicht, dass die meisten Systeme sich darum kümmern, weil sie davon ausgehen, dass wenn du DELETE sagst, du wirklich DELETE meinst und es egal ist, was vorher drin war, solange du den richtigen Schlüssel/URL referenzierst. –

2

Check-out-Transaktionen Firebase Projekt: https://github.com/vacuumlabs/firebase-transactions

glaube ich, kann dies für Ihren Fall sehr nützlich sein, vor allem, wenn Sie eine Menge von Schreibvorgängen auf dem Server zu tun.

(Disclaimer: Ich bin einer der Autoren)

3

FYI, Firebase Realtime-Datenbank unterstützt offiziell das jetzt.

Lesen Sie die blog und die docs für weitere Informationen.

+0

@Martin Šťáva Ja, sie tun und ich benutze es und es funktioniert. – bibscy

Verwandte Themen