Shun Miyazawa 1 год назад
Родитель
Сommit
23c062d898

+ 7 - 0
apps/app/src/features/openai/server/services/thread-deletion-cron.ts

@@ -2,6 +2,7 @@ import nodeCron from 'node-cron';
 
 import { configManager } from '~/server/service/config-manager';
 import loggerFactory from '~/utils/logger';
+import { getRandomIntInRange } from '~/utils/rand';
 
 import { getOpenaiService, type IOpenaiService } from './openai';
 
@@ -19,6 +20,8 @@ class ThreadDeletionCronService {
 
   threadDeletionApiCallInterval: number;
 
+  sleep = (msec: number): Promise<void> => new Promise(resolve => setTimeout(resolve, msec));
+
   startCron(): void {
     const isAiEnabled = configManager.getConfig('crowi', 'app:aiEnabled');
     if (!isAiEnabled) {
@@ -48,6 +51,10 @@ class ThreadDeletionCronService {
   private generateCronJob() {
     return nodeCron.schedule(this.threadDeletionCronExpression, async() => {
       try {
+        // Sleep for a random number of minutes between 0 and 60 to distribute request load
+        const randomMilliseconds = getRandomIntInRange(0, 60) * 60 * 1000;
+        this.sleep(randomMilliseconds);
+
         await this.executeJob();
       }
       catch (e) {

+ 7 - 0
apps/app/src/features/openai/server/services/vector-store-file-deletion-cron.ts

@@ -2,6 +2,7 @@ import nodeCron from 'node-cron';
 
 import { configManager } from '~/server/service/config-manager';
 import loggerFactory from '~/utils/logger';
+import { getRandomIntInRange } from '~/utils/rand';
 
 import { getOpenaiService, type IOpenaiService } from './openai';
 
@@ -19,6 +20,8 @@ class VectorStoreFileDeletionCronService {
 
   vectorStoreFileDeletionApiCallInterval: number;
 
+  sleep = (msec: number): Promise<void> => new Promise(resolve => setTimeout(resolve, msec));
+
   startCron(): void {
     const isAiEnabled = configManager.getConfig('crowi', 'app:aiEnabled');
     if (!isAiEnabled) {
@@ -48,6 +51,10 @@ class VectorStoreFileDeletionCronService {
   private generateCronJob() {
     return nodeCron.schedule(this.vectorStoreFileDeletionCronExpression, async() => {
       try {
+        // Sleep for a random number of minutes between 0 and 60 to distribute request load
+        const randomMilliseconds = getRandomIntInRange(0, 60) * 60 * 1000;
+        this.sleep(randomMilliseconds);
+
         await this.executeJob();
       }
       catch (e) {