Maison > Article > interface Web > La puissance de l'AGRÉGATION dans les tâches Cron et la rentabilité
En travaillant sur mon produit SaaS, j'ai découvert que pour 10 000 utilisateurs, vous auriez besoin de 10 001 requêtes par jour avec des requêtes DB régulières pour réinitialiser les crédits ou une invite gratuite. Avec l'agrégation intelligente, vous n'avez besoin que de 2 requêtes, que vous ayez 10 000 ou 100 000 utilisateurs !
Tout d'abord, permettez-moi de vous donner une AVIS DES COÛTS pour la base de données de production MongoDB (10 000 et 1 an) :
Voie normale, requêtes quotidiennes : 10 001
Requêtes annuelles : 10 001 x 365 = 3 650 365 requêtes
Coût annuel : 3 650 365 x 0,001 $ = 3 650,37 USD
Mode d'agrégation, requêtes quotidiennes : 2
Requêtes annuelles : 2 x 365 = 730 requêtes
Coût annuel : 730 x 0,001 $ = 0,73 USD
Épargne : 3 650,37 - 0,73 = 3 649,64 USD (près de 4 lakh bdt)
Génial, regardez maintenant l'approche traditionnelle de requête (qui fait une requête pour chaque utilisateur)
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(); } } };
Ici, si vous avez 10 000 utilisateurs, cela génère 10 001 requêtes (1 pour chaque utilisateur, plus la requête initiale pour récupérer les utilisateurs) - c'était énorme..
Maintenant l'entrée des héros, [qui a l'air un peu difficile mais cela vous permet d'économiser des tonnes d'argent]
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); } }); };
C'est ainsi que vous pouvez exécuter votre tâche cron [elle s'exécute automatiquement à un moment précis] pour mettre à jour les crédits ou la limite des 10 000 utilisateurs, ce qui peut économiser plus de 3 600 USD en un an.
AUTEUR,
Nom : Mahinur Rahman
Contact : dev.mahinur.rahman@gmail.com
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!