2015-07-20 7 views
6

मुझे नीचे कुछ धागा मिला है जो इस परिदृश्य के बारे में बात करते हैं।फायरबेस: एकल लेनदेन में एकाधिक ऑब्जेक्ट्स अपडेट करें

हालांकि अभी भी लगता है के लिए संघर्ष कर, अगर कोई इस के लिए सिफारिश की डेटा संरचना डिजाइन। मुझे एक मल्टी-राइट लाइब्रेरी firebase-multi-write दिखाई देती है जो कहती है कि आपको शायद ज्यादातर मामलों में इसकी आवश्यकता नहीं है।

लेकिन मैं मैं इस की जरूरत है लगता है, मेरे परिदृश्य है:। 3 उपयोगकर्ताओं

/users/A : {credit:20} 

/users/B : {credit:3} 

/users/C : {credit:10} 

और प्रत्येक उपयोगकर्ता के सभी एक ही समय पर एक दूसरे से क्रेडिट चोरी कर सकते हैं,

  • एक बी क्रेडिट से चोरी {21, 2}
  • सी क्रेडिट से बी चोरी करता है जैसे {3, 9}
  • सी क्रेडिट से चोरी करता है जैसे {11, 2 0}

अब मुझे प्रत्येक स्थिरता को बनाए रखने के लिए प्रत्येक उपयोगकर्ता के लिए क्रेडिट अपडेट करने की आवश्यकता है, ताकि प्रत्येक चोरी ऑपरेशन प्रकृति में परमाणु हो।

जावा में डेटा अखंडता को बनाए रखते हुए, इस तरह के परिदृश्य को संभालने का सबसे अच्छा तरीका क्या होगा?

+1

आपका पहला जुड़ा हुआ धागा वार्ता (इवेंट सोर्सिंग - http://martinfowler.com/eaaDev/ EventSourcing.html)। आप एक ही घटना लिखेंगे जो सभी तीन चोरी घटनाओं को कैप्चर करेगी और फिर जब आपको वर्तमान क्रेडिट शेष राशि खोजने की आवश्यकता होगी तो आप प्रारंभिक स्थिति (शायद 0 क्रेडिट) लोड करेंगे और फिर अंतिम स्थिति में समाप्त होने तक ईवेंट इतिहास को प्लेबैक करेंगे। बोनस अंक - आपके पास सभी "चोरी" का इतिहास है। क्या कोई कारण स्वीकार्य नहीं है? –

+0

धन्यवाद, मैंने जो परिदृश्य उल्लेख किया है वह वर्कफ़्लो का सरलीकृत संस्करण था जिसे मैं कल्पना करता हूं। यह सरल गेमिंग ऐप का एक हिस्सा है, जहां ए बी को चुराता है, और अगले पल में बी ने सी और डी खिलाड़ियों के मिश्रण के साथ इसे वापस चुरा लिया। तो यह एक साधारण परमाणु अद्यतन के लिए बस बहुत अधिक गणना ?? – duskandawn

+0

मुझे पता नहीं है कि परमाणु परिचालन काम करेगा या नहीं - लेकिन जो आप वर्णन कर रहे हैं वह मुझे परमाणु ऑपरेशन की तरह नहीं लगता है। यदि ए बी से लेता है और फिर "अगले पल में" बी इसे वापस चुरा लेता है ... यह परमाणु नहीं है। यह दो अलग-अलग ऑपरेशन है जो समय पर एक दूसरे के पास होते हैं। वास्तव में –

उत्तर

3

सितंबर/2015 में फायरबेस डेवलपर्स new version जारी किए गए।

इस रिलीज के साथ

, अब आप इस एकल परमाणु अद्यतन में दोनों स्थानों पर कर सकते हैं: एक और दृष्टिकोण के बारे में

Firebase ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com"); 
// Generate a new push ID for the new post 

Firebase newPostRef = ref.child("posts").push(); 
String newPostKey = newPostRef.getKey(); 

// Create the data we want to update 
Map newPost = new HashMap(); 
newPost.put("title", "New Post"); 
newPost.put("content", "Here is my new post!"); 

Map updatedUserData = new HashMap(); 
updatedUserData.put("users/posts/" + newPostKey, true); 
updatedUserData.put("posts/" + newPostKey, newPost); 

// Do a deep-path update 
ref.updateChildren(updatedUserData, new Firebase.CompletionListener() { 
    @Override 
    public void onComplete(FirebaseError firebaseError, Firebase firebase) { 
     if (firebaseError != null) { 
      System.out.println("Error updating data: " + firebaseError.getMessage()); 
     } 
    } 
}); 
संबंधित मुद्दे