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!