Aplikasi Pengesahan Firebase dan Pangkalan Data Masa Nyata · Pelajaran

Pembilang Atom & Baris Gilir

Bina pembilang atom yang boleh dipercayai dan laksanakan baris gilir mesej menggunakan Realtime Database untuk logik aplikasi yang teguh

Pelajaran 3 daripada 412 langkah

Pembilang Atom & Baris Gilir ialah pelajaran Aplikasi Pengesahan Firebase dan Pangkalan Data Masa Nyata percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Aplikasi Pengesahan Firebase dan Pangkalan Data Masa Nyata, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Aplikasi Pengesahan Firebase dan Pangkalan Data Masa Nyata merangkumi sejumlah 4 pelajaran.

Mengapa Operasi Atomik Penting

Dalam aplikasi masa nyata, berbilang pengguna mungkin cuba mengemas kini cebisan data yang sama secara serentak. Hal ini boleh menyebabkan apa yang dipanggil keadaan perlumbaan.

  • Bayangkan dua pengguna menyukai siaran tepat pada masa yang sama.
  • Tanpa pengendalian yang betul, satu 'suka' mungkin menulis ganti suka yang lain.
  • Ini menghasilkan data yang tidak betul, seperti siaran yang menunjukkan 10 suka sedangkan sepatutnya 11.

Operasi atomik memastikan kemas kini data dilakukan sebagai satu unit yang tunggal dan tidak boleh dipecahkan, sekali gus menghalang masalah seperti ini.

Memahami Pembilang Atomik

Pembilang atomik ialah nilai berangka yang boleh ditambah atau dikurangkan dengan boleh dipercayai, walaupun berbilang klien cuba mengubahnya pada masa yang sama.

Ia penting untuk ciri seperti:

  • Mengira 'suka' atau 'undi sokong' pada kandungan.
  • Menjejak paparan halaman atau muat turun.
  • Mengurus paras inventori dalam aplikasi perdagangan elektronik.

Firebase Realtime Database menyediakan mekanisme berkuasa untuk melaksanakan fungsi ini dengan selamat.

Pelaksanaan dengan Transaksi

Kaedah transaction() Firebase penting untuk mencipta operasi atomik. Kaedah ini memastikan fungsi kemas kini dilaksanakan pada data yang paling semasa, walaupun penulisan lain berlaku secara serentak.

  • Fungsi kemas kini anda menerima data semasa.
  • Fungsi itu mengembalikan nilai baharu yang ingin anda tulis.
  • Firebase mencuba semula transaksi secara automatik jika data berubah semasa proses berlangsung.

Ini menjamin bahawa kemas kini pembilang anda sentiasa berdasarkan keadaan terkini.

Kod: Pembilang Atomik Mudah

Berikut ialah cara meningkatkan pembilang secara atomik menggunakan transaksi. Contoh ini mensimulasikan logik transaksi 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();

Penjelasan Logik Transaksi

Dalam kaedah transaction(), fungsi panggilan balik menerima currentCount. Jika pembilang tidak wujud (null), nilainya ditetapkan kepada 0 sebelum ditingkatkan.

  • Mengembalikan undefined daripada panggilan balik akan membatalkan transaksi.
  • Mengembalikan sebarang nilai lain (seperti kiraan yang telah ditingkatkan) akan melakukan transaksi.
  • Firebase mengendalikan percubaan semula secara automatik jika data berubah semasa transaksi berjalan.

Ini memastikan kiraan akhir sentiasa tepat, walaupun di bawah beban tinggi.

Pengenalan kepada Baris Gilir Mesej

Baris gilir mesej ialah cara bahagian berlainan dalam aplikasi (atau aplikasi berlainan) berkomunikasi secara tak segerak. Ia seperti senarai tugasan untuk tugas yang tidak perlu diproses dengan segera.

Manfaat utama termasuk:

  • Pemisahan gandingan: Penghantar tidak perlu menunggu penerima.
  • Kebolehpercayaan: Tugas disimpan sehingga diproses.
  • Kebolehskalaan: Anda boleh menambah pekerja dengan mudah untuk memproses tugas.

Firebase Realtime Database boleh berfungsi sebagai baris gilir mesej yang ringkas dan berkesan.

Membina Baris Gilir Ringkas

Untuk membina baris gilir dengan Realtime Database, anda biasanya mencipta senarai tugas. Tugas baharu ditambah pada senarai ini, kemudian proses pekerja mengambil dan memprosesnya.

  • Setiap tugas ialah objek dengan data yang berkaitan (contohnya, action, payload).
  • Menggunakan push() akan mencipta kunci unik yang disusun mengikut masa, sesuai untuk baris gilir.
  • Pekerja mendengar item baharu dan memproses item yang paling lama terlebih dahulu.

Struktur ini membolehkan pengurusan tugas latar belakang yang teguh.

Kod: Menambah pada Baris Gilir

Menambah tugas pada baris gilir adalah mudah dengan menggunakan kaedah push() Firebase. Setiap item baharu mendapat kunci unik.

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();

Kod: Memproses daripada Baris Gilir

Untuk memproses tugas dengan boleh dipercayai, anda perlu memastikan hanya seorang pekerja memproses tugas tertentu. Ini melibatkan pengambilan tugas yang paling lama, kemudian mengalih keluarnya secara atomik atau menandakannya sebagai 'diproses' menggunakan transaksi.

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();

Memilih antara Pembilang dan Baris Gilir

Walaupun kedua-dua pembilang atomik dan baris gilir menggunakan transaksi Firebase, kedua-duanya menyelesaikan masalah yang berbeza:

  • Pembilang Atomik: Untuk kemas kini berangka yang ringkas dan memerlukan konsistensi yang tinggi (contohnya, kiraan undi dan inventori).
  • Baris Gilir Mesej: Untuk memisahkan gandingan tugas, mengendalikan proses latar belakang, dan memastikan pelaksanaan kerja yang boleh dipercayai serta boleh diproses kemudian.

Memahami corak ini membolehkan anda membina aplikasi masa nyata yang lebih teguh dan boleh diskalakan.

Semakan Pantas: Operasi Atomik

Anda mahu menambah nilai 'score' pengguna dalam permainan dengan boleh dipercayai, sambil memastikan kemas kini serentak daripada peranti berlainan tidak menyebabkan penambahan hilang. Ciri Firebase Realtime Database yang manakah paling sesuai?

Imbas Kembali: Pembilang Atomik dan Baris Gilir

Kami telah meneroka cara Firebase Realtime Database membolehkan logik aplikasi yang teguh melalui operasi atomik.

  • Pembilang atomik menggunakan transaction() untuk menambah atau mengurangkan nilai berangka dengan boleh dipercayai, sekali gus mencegah keadaan perlumbaan.
  • Baris gilir mesej menggunakan push() untuk menambah tugas dan transaction() untuk memproses (menuntut atau mengalih keluar) tugas yang paling lama secara atomik, sekali gus membolehkan pemprosesan latar belakang yang tak segerak dan boleh diskalakan.

Menguasai corak ini penting untuk membina aplikasi masa nyata yang berprestasi tinggi, konsisten dan boleh diskalakan.

Percuma untuk bermula

Pelajari Aplikasi Pengesahan Firebase dan Pangkalan Data Masa Nyata dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
11
Pelajaran
44

Soalan Lazim

Adakah pelajaran “Pembilang Atom & Baris Gilir” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Aplikasi Pengesahan Firebase dan Pangkalan Data Masa Nyata, termasuk “Pembilang Atom & Baris Gilir”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Aplikasi Pengesahan Firebase dan Pangkalan Data Masa Nyata merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Pembilang Atom & Baris Gilir”?

Bina pembilang atom yang boleh dipercayai dan laksanakan baris gilir mesej menggunakan Realtime Database untuk logik aplikasi yang teguh Anda berlatih Aplikasi Pengesahan Firebase dan Pangkalan Data Masa Nyata menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Aplikasi Pengesahan Firebase dan Pangkalan Data Masa Nyata?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Aplikasi Pengesahan Firebase dan Pangkalan Data Masa Nyata di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Pembilang Atom & Baris Gilir” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Aplikasi Pengesahan Firebase dan Pangkalan Data Masa Nyata ini?

Ya. Setiap pelajaran Aplikasi Pengesahan Firebase dan Pangkalan Data Masa Nyata menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Kemas Kini Data Serentak
  2. Operasi Data Transaksi
  3. Pembilang Atom & Baris Gilir
  4. Strategi Denormalisasi dan Penduaan Data
← Kembali ke Aplikasi Pengesahan Firebase dan Pangkalan Data Masa Nyata