Maison >interface Web >js tutoriel >La puissance de l'AGRÉGATION dans les tâches Cron et la rentabilité

La puissance de l'AGRÉGATION dans les tâches Cron et la rentabilité

Patricia Arquette
Patricia Arquetteoriginal
2024-09-24 06:16:06804parcourir

The Power of AGGREGATION in Cron Jobs and Cost-Effectiveness

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn