Rumah  >  Artikel  >  hujung hadapan web  >  Kuasa AGREGASI dalam Pekerjaan Cron dan Keberkesanan Kos

Kuasa AGREGASI dalam Pekerjaan Cron dan Keberkesanan Kos

Patricia Arquette
Patricia Arquetteasal
2024-09-24 06:16:06659semak imbas

The Power of AGGREGATION in Cron Jobs and Cost-Effectiveness

Semasa mengusahakan produk SaaS saya, saya dapati, Untuk 10k pengguna, anda memerlukan 10,001 pertanyaan setiap hari dengan pertanyaan DB biasa untuk menetapkan semula kredit atau gesaan percuma. Dengan pengagregatan pintar, anda hanya memerlukan 2 pertanyaan, tidak kira jika anda mempunyai 10k atau 100k pengguna!

Pertama sekali, izinkan saya memberi anda ULASAN KOS untuk pangkalan data pengeluaran MongoDB (10k & 1 tahun):

Cara biasa, Pertanyaan Harian: 10,001
Pertanyaan Tahunan: 10,001 x 365 = 3,650,365 pertanyaan
Kos Tahunan: 3,650,365 x $0.001 = 3,650.37 USD

Cara pengagregatan, Pertanyaan Harian: 2
Pertanyaan Tahunan: 2 x 365 = 730 pertanyaan
Kos Tahunan: 730 x $0.001 = 0.73 USD

Penjimatan: 3,650.37 - 0.73 = 3,649.64 USD (hampir 4 lakh bdt)

Hebat, kini lihat pendekatan tradisional pertanyaan (yang membuat satu pertanyaan untuk setiap pengguna )

const resetLimitsForUsers = async () => {
  const users = await User.find({ /* conditions to select users */ });

  for (const user of users) {
    if (user.plan.remaining_prompt_count < 3 || user.plan.remaining_page_count < 3) {
      user.plan.remaining_prompt_count = 3;
      user.plan.total_prompt_count = 3;
      // Save updated plan
      await user.plan.save();
    }
  }
};

Di sini jika anda mempunyai 10,000 pengguna, ini menghasilkan 10,001 pertanyaan (1 untuk setiap pengguna, ditambah dengan pertanyaan awal untuk mengambil pengguna) - itu sangat besar..

Kini entri wira, [ yang kelihatan agak sukar tetapi ia menjimatkan banyak wang anda ]

const resetPlanCounts = () => {
  cron.schedule('* * * * *', async () => {
    try {
      const twoMinutesAgo = new Date(Date.now() - 2 * 60 * 1000); // 2 minutes ago

      const usersWithRegisteredPlan = await User.aggregate([
        {
          $match: {
            createdAt: { $lte: twoMinutesAgo },
            plan: { $exists: true }
          }
        },
        {
          $lookup: {
            from: 'plans',
            localField: 'plan',
            foreignField: '_id',
            as: 'planDetails'
          }
        },
        {
          $unwind: '$planDetails'
        },
        {
          $match: {
            'planDetails.name': 'Registered',
            $or: [
              { 'planDetails.remaining_prompt_count': { $lt: 3 } },
              { 'planDetails.remaining_page_count': { $lt: 3 } }
            ]
          }
        },
        {
          $project: {
            planId: '$planDetails._id'
          }
        }
      ]);

      const planIds = usersWithRegisteredPlan.map(user => user.planId);

      if (planIds.length > 0) {
        const { modifiedCount } = await Plan.updateMany(
          { _id: { $in: planIds } },
          { $set: { remaining_prompt_count: 3, total_prompt_count: 3, remaining_page_count: 3, total_page_count: 3 } }
        );

        console.log(`${modifiedCount} plans reset for "Registered" users.`);
      } else {
        console.log('No plans to reset for today.');
      }
    } catch (error) {
      console.error('Error resetting plan counts:', error);
    }
  });
};

Begitulah anda boleh menjalankan tugas cron anda [ ia berjalan secara automatik dalam masa tertentu ] untuk mengemas kini semua 10k kredit atau had pengguna yang boleh menjimatkan lebih daripada 3600 USD dalam setahun.

PENULIS,
Nama: Mahinur Rahman
Hubungi: dev.mahinur.rahman@gmail.com

Atas ialah kandungan terperinci Kuasa AGREGASI dalam Pekerjaan Cron dan Keberkesanan Kos. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn