Firebase Auth और रीयल-टाइम database applications · पाठ

परमाणु काउंटर और कतारें

विश्वसनीय परमाणु काउंटर बनाएँ और मजबूत एप्लिकेशन तर्क के लिए Realtime Database का उपयोग करके संदेश कतारें लागू करें

पाठ 3, कुल 4 में से12 चरण

परमाणु काउंटर और कतारें, CoddyKit पर Firebase Auth और रीयल-टाइम database applications का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह Firebase Auth और रीयल-टाइम database applications सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Firebase Auth और रीयल-टाइम database applications पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

परमाणु कार्य क्यों महत्वपूर्ण हैं

रीयल-टाइम अनुप्रयोगों में, कई उपयोगकर्ता एक ही डेटा को एक साथ अपडेट करने का प्रयास कर सकते हैं। इससे रेस कंडीशन नामक स्थिति उत्पन्न हो सकती है।

  • कल्पना कीजिए कि दो उपयोगकर्ता ठीक एक ही समय पर किसी पोस्ट को पसंद करते हैं।
  • उचित प्रबंधन के बिना, एक 'पसंद' दूसरी को अधिलेखित कर सकती है।
  • इससे गलत डेटा प्राप्त होता है, जैसे किसी पोस्ट पर 11 पसंद होनी चाहिए, लेकिन वह 10 दिखाई दे।

परमाणु कार्य सुनिश्चित करते हैं कि डेटा अपडेट एकल, अविभाज्य इकाई के रूप में किए जाएँ, जिससे ऐसी समस्याएँ रोकी जा सकें।

परमाणु काउंटर को समझना

परमाणु काउंटर एक संख्यात्मक मान है जिसे कई क्लाइंट एक ही समय पर बदलने का प्रयास करने पर भी विश्वसनीय रूप से बढ़ाया या घटाया जा सकता है।

यह इन सुविधाओं के लिए महत्वपूर्ण है:

  • सामग्री पर 'पसंद' या 'अपवोट' गिनना।
  • पृष्ठ देखे जाने या डाउनलोड की संख्या दर्ज करना।
  • ई-कॉमर्स ऐप में इन्वेंटरी स्तरों का प्रबंधन करना।

Firebase Realtime Database इन्हें सुरक्षित रूप से लागू करने के लिए एक शक्तिशाली तंत्र प्रदान करता है।

ट्रांज़ैक्शन के साथ लागू करना

परमाणु कार्य बनाने के लिए Firebase की transaction() विधि महत्वपूर्ण है। यह सुनिश्चित करती है कि अन्य लेखन कार्य एक साथ होने पर भी अपडेट फ़ंक्शन सबसे नवीनतम डेटा पर निष्पादित हो।

  • आपके अपडेट फ़ंक्शन को वर्तमान डेटा प्राप्त होता है।
  • यह वह नया मान लौटाता है जिसे आप लिखना चाहते हैं।
  • प्रक्रिया के दौरान डेटा बदलने पर Firebase ट्रांज़ैक्शन का दोबारा प्रयास स्वचालित रूप से करता है।

इससे यह सुनिश्चित होता है कि आपके काउंटर अपडेट हमेशा नवीनतम स्थिति पर आधारित हों।

कोड: सरल परमाणु काउंटर

यहाँ ट्रांज़ैक्शन का उपयोग करके काउंटर को परमाणु रूप से बढ़ाने का तरीका बताया गया है। यह उदाहरण Firebase के ट्रांज़ैक्शन तर्क का अनुकरण करता है।

class MockRef {
  constructor(value) {
    this.value = value;
  }
  async transaction(updateFunction) {
    const currentValue = this.value;
    const newValue = updateFunction(currentValue);
    if (newValue !== undefined) {
      this.value = newValue;
      console.log(`Counter updated to: ${this.value}`);
      return { committed: true, snapshot: { val: () => this.value } };
    }
    return { committed: false };
  }
  val() { return this.value; }
}

async function main() {
  const counterRef = new MockRef(0);
  console.log("Initial count:", counterRef.val());

  // Attempt to increment the counter
  await counterRef.transaction(currentCount => {
    return (currentCount || 0) + 1;
  });

  console.log("Final count (after one increment):");
  console.log(counterRef.val());
}

main();

ट्रांज़ैक्शन तर्क की व्याख्या

transaction() विधि में, कॉलबैक फ़ंक्शन को currentCount प्राप्त होता है। यदि काउंटर मौजूद नहीं है (null), तो बढ़ाने से पहले उसका डिफ़ॉल्ट मान 0 रखा जाता है।

  • कॉलबैक से undefined लौटाने पर ट्रांज़ैक्शन रद्द हो जाता है।
  • कोई भी अन्य मान (जैसे बढ़ाई गई गिनती) लौटाने पर ट्रांज़ैक्शन जमा हो जाता है।
  • ट्रांज़ैक्शन चलने के दौरान डेटा बदलने पर Firebase दोबारा प्रयासों को स्वचालित रूप से संभालता है।

इससे भारी लोड में भी अंतिम गिनती हमेशा सही रहती है।

संदेश कतारों का परिचय

संदेश कतार किसी एप्लिकेशन के अलग-अलग हिस्सों (या अलग-अलग एप्लिकेशन) के लिए अतुल्यकालिक रूप से संवाद करने का एक तरीका है। यह उन कार्यों की कार्य-सूची जैसी होती है, जिन्हें तुरंत संसाधित करने की आवश्यकता नहीं होती।

इसके प्रमुख लाभ हैं:

  • अलगाव: भेजने वालों को प्राप्तकर्ताओं के लिए प्रतीक्षा नहीं करनी पड़ती।
  • विश्वसनीयता: कार्यों को संसाधित होने तक संग्रहीत रखा जाता है।
  • स्केलेबिलिटी: कार्यों को संसाधित करने के लिए आसानी से अधिक वर्कर जोड़े जा सकते हैं।

Firebase Realtime Database एक सरल और प्रभावी संदेश कतार के रूप में काम कर सकता है।

एक सरल कतार बनाना

Realtime Database के साथ कतार बनाने के लिए आम तौर पर आप कार्यों की एक सूची बनाते हैं। नए कार्य इस सूची में जोड़े जाते हैं और वर्कर प्रक्रियाएँ उन्हें संसाधित करती हैं।

  • हर कार्य संबंधित डेटा वाली एक ऑब्जेक्ट होती है (जैसे, action, payload).
  • push() का उपयोग अद्वितीय और समयानुसार क्रमबद्ध keys बनाता है, जो कतार के लिए बिल्कुल उपयुक्त हैं।
  • वर्कर नई आइटम पर नज़र रखते हैं और सबसे पुरानी आइटम को पहले संसाधित करते हैं।

यह संरचना बैकग्राउंड कार्यों के मजबूत प्रबंधन की सुविधा देती है।

कोड: कतार में जोड़ना

Firebase की push() method का उपयोग करके कतार में कार्य जोड़ना बहुत सरल है। हर नई आइटम को एक अद्वितीय key मिलती है।

class MockDatabase {
  constructor() {
    this.data = {};
  }
  ref(path) {
    return {
      push: (value) => {
        const key = `item_${Object.keys(this.data[path] || {}).length}_${Date.now()}`;
        if (!this.data[path]) {
          this.data[path] = {};
        }
        this.data[path][key] = value;
        console.log(`Added to ${path}: ${JSON.stringify(value)}`);
        return { key: key };
      },
      val: () => this.data[path]
    };
  }
}

async function main() {
  const mockDb = new MockDatabase();
  const queueRef = mockDb.ref("tasks");

  console.log("Adding tasks to the queue...");
  await queueRef.push({ action: "sendEmail", userId: "user123" });
  await queueRef.push({ action: "generateReport", reportId: "rpt456" });

  console.log("\nCurrent queue items:");
  console.log(JSON.stringify(queueRef.val(), null, 2));
}

main();

कोड: कतार से संसाधित करना

कार्यों को विश्वसनीय रूप से संसाधित करने के लिए यह सुनिश्चित करना आवश्यक है कि किसी दिए गए कार्य को केवल एक वर्कर ही संसाधित करे। इसके लिए सबसे पुराने कार्य को प्राप्त करके उसे transaction का उपयोग करते हुए परमाणु रूप से हटाना या उसे 'संसाधित' के रूप में चिह्नित करना होता है।

class MockDatabase {
  constructor(initialData = {}) {
    this.data = initialData;
  }
  ref(path) {
    const self = this;
    return {
      orderByChild: (child) => ({ limitToFirst: (count) => ({ once: async (eventType) => {
        if (eventType === 'value') {
          const items = Object.entries(self.data[path] || {})
            .map(([key, value]) => ({ key, value }))
            .sort((a, b) => (a.value[child] || 0) - (b.value[child] || 0));
          const result = {};
          items.slice(0, count).forEach(item => { result[item.key] = item.value; });
          return { val: () => result };
        }
      }}) }),
      child: (key) => ({ transaction: async (updateFunction) => {
        const currentValue = self.data[path] ? self.data[path][key] : null;
        const newValue = updateFunction(currentValue);
        if (newValue === null) {
          delete self.data[path][key];
          console.log(`Transaction removed item: ${key}`);
          return { committed: true, snapshot: { val: () => null } };
        } else if (newValue !== undefined) {
          if (!self.data[path]) self.data[path] = {};
          self.data[path][key] = newValue;
          console.log(`Transaction updated item: ${key}`);
          return { committed: true, snapshot: { val: () => newValue } };
        }
        return { committed: false, snapshot: { val: () => currentValue } };
      }}),
      val: () => self.data[path]
    };
  }
}

async function main() {
  const initialTasks = {
    "task_A": { action: "sendEmail", userId: "user123", timestamp: 1678888000000 },
    "task_B": { action: "generateReport", reportId: "rpt456", timestamp: 1678888010000 }
  };
  const mockDb = new MockDatabase({ tasks: initialTasks });
  const queueRef = mockDb.ref("tasks");

  console.log("Initial queue items:", JSON.stringify(queueRef.val(), null, 2));

  const snapshot = await queueRef.orderByChild('timestamp').limitToFirst(1).once('value');
  const firstItem = snapshot.val();

  if (firstItem) {
    const firstKey = Object.keys(firstItem)[0];
    console.log(`Attempting to process task with key ${firstKey}`);
    const transactionResult = await queueRef.child(firstKey).transaction(currentData => {
      return currentData ? null : undefined; // Delete if exists, abort if not
    });

    if (transactionResult.committed) {
      console.log(`Successfully processed and removed task: ${firstKey}`);
    } else {
      console.log("Failed to process task (already processed or aborted).");
    }
  }
  console.log("\nQueue items after processing:");
  console.log(JSON.stringify(queueRef.val(), null, 2));
}

main();

काउंटर और कतार के बीच चुनाव

हालाँकि परमाणु काउंटर और कतार दोनों Firebase transactions का उपयोग करते हैं, वे अलग-अलग समस्याओं का समाधान करते हैं:

  • परमाणु काउंटर: सरल, संख्यात्मक अपडेट के लिए, जिनमें उच्च स्तर की संगतता आवश्यक होती है (जैसे वोटों की संख्या, इन्वेंटरी)।
  • संदेश कतार: कार्यों को अलग रखने, बैकग्राउंड प्रक्रियाओं को संभालने और बाद में संसाधित किए जा सकने वाले कार्यों के विश्वसनीय निष्पादन को सुनिश्चित करने के लिए।

इन पैटर्न को समझने से आप अधिक मजबूत और स्केलेबल रीयल-टाइम एप्लिकेशन बना सकते हैं।

त्वरित जाँच: परमाणु संचालन

आप अपने गेम में किसी उपयोगकर्ता के 'score' को विश्वसनीय रूप से बढ़ाना चाहते हैं और यह सुनिश्चित करना चाहते हैं कि अलग-अलग डिवाइस से होने वाले एक साथ के अपडेट के कारण कोई वृद्धि न छूटे। Firebase Realtime Database की कौन-सी सुविधा सबसे उपयुक्त है?

पुनरावृत्ति: परमाणु काउंटर और कतार

हमने देखा कि Firebase Realtime Database परमाणु संचालनों के माध्यम से मजबूत एप्लिकेशन लॉजिक की सुविधा देता है।

  • परमाणु काउंटर संख्यात्मक मानों को विश्वसनीय रूप से बढ़ाने या घटाने के लिए transaction() का उपयोग करते हैं और रेस कंडीशन को रोकते हैं।
  • संदेश कतार कार्य जोड़ने के लिए push() और सबसे पुराने कार्यों को परमाणु रूप से संसाधित करने (दावा करने/हटाने) के लिए transaction() का उपयोग करती हैं, जिससे अतुल्यकालिक और स्केलेबल बैकग्राउंड प्रोसेसिंग संभव होती है।

उच्च-प्रदर्शन, संगत और स्केलेबल रीयल-टाइम एप्लिकेशन बनाने के लिए इन पैटर्न में दक्षता प्राप्त करना अत्यंत महत्वपूर्ण है।

शुरुआत निःशुल्क

एआई शिक्षक के साथ Firebase Auth और रीयल-टाइम database applications सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
11
पाठ
44

अक्सर पूछे जाने वाले प्रश्न

क्या “परमाणु काउंटर और कतारें” पाठ निःशुल्क है?

हाँ — Firebase Auth और रीयल-टाइम database applications अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “परमाणु काउंटर और कतारें” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। Firebase Auth और रीयल-टाइम database applications पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“परमाणु काउंटर और कतारें” में मैं क्या सीखूँगा?

विश्वसनीय परमाणु काउंटर बनाएँ और मजबूत एप्लिकेशन तर्क के लिए Realtime Database का उपयोग करके संदेश कतारें लागू करें आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Firebase Auth और रीयल-टाइम database applications का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Firebase Auth और रीयल-टाइम database applications शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Firebase Auth और रीयल-टाइम database applications शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“परमाणु काउंटर और कतारें” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Firebase Auth और रीयल-टाइम database applications पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Firebase Auth और रीयल-टाइम database applications पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. फैन-आउट डेटा अद्यतन
  2. लेन-देनात्मक डेटा संक्रियाएँ
  3. परमाणु काउंटर और कतारें
  4. डेटा का असामान्यीकरण और प्रतिलिपिकरण रणनीतियाँ
← Firebase Auth और रीयल-टाइम database applications पर वापस जाएँ