ホームページ >ウェブフロントエンド >jsチュートリアル >Cron ジョブにおける集約の力と費用対効果

Cron ジョブにおける集約の力と費用対効果

Patricia Arquette
Patricia Arquetteオリジナル
2024-09-24 06:16:06805ブラウズ

The Power of AGGREGATION in Cron Jobs and Cost-Effectiveness

SaaS 製品の作業中に、10,000 人のユーザーの場合、クレジットをリセットしたり無料のプロンプトを表示するには、通常の DB クエリで毎日 10,001 クエリが必要になることがわかりました。スマート集約を使用すると、ユーザーが 10,000 人であっても 100,000 人であっても、必要なクエリは 2 つだけです!

まず、MongoDB 運用データベース (10,000 および 1 年) のコストの概要を説明します。

通常の方法、毎日のクエリ: 10,001
年間クエリ数: 10,001 x 365 = 3,650,365 クエリ
年間コスト: 3,650,365 x 0.001 ドル = 3,650.37 ドル

集計方法、毎日のクエリ: 2
年間クエリ: 2 x 365 = 730 クエリ
年間コスト: 730 x 0.001 ドル = 0.73 ドル

節約: ​​3,650.37 - 0.73 = 3,649.64 USD (約 40 万 bdt)

素晴らしいですね、従来のクエリのアプローチ (ユーザーごとに 1 つのクエリを作成する) を見てみましょう

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

ここで、ユーザーが 10,000 人いる場合、結果として 10,001 個のクエリ (ユーザーごとに 1 個と、ユーザーを取得するための最初のクエリ) が発生します。これは膨大な量です。

さあ、ヒーローエントリーです。[少し大変そうに見えますが、お金を大量に節約できます]

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

これで、cron ジョブを実行して [特定の時間に自動的に実行されます] 10,000 人のユーザーのクレジットまたは制限をすべて更新することができ、年間 3,600 ドル以上を節約できます。

著者、
名前: マヒヌル・ラーマン
連絡先: dev.mahinur.rahman@gmail.com

以上がCron ジョブにおける集約の力と費用対効果の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。