@@ -15,6 +15,22 @@ import type { RunEngine } from "~/v3/runEngine.server";
1515import { env } from "~/env.server" ;
1616import { tryCatch } from "@trigger.dev/core/v3" ;
1717import { ServiceValidationError } from "~/v3/services/common.server" ;
18+ import { createCache , createLRUMemoryStore , DefaultStatefulContext , Namespace } from "@internal/cache" ;
19+ import { singleton } from "~/utils/singleton" ;
20+
21+ // LRU cache for environment queue sizes to reduce Redis calls
22+ const queueSizeCache = singleton ( "queueSizeCache" , ( ) => {
23+ const ctx = new DefaultStatefulContext ( ) ;
24+ const memory = createLRUMemoryStore ( env . QUEUE_SIZE_CACHE_MAX_SIZE , "queue-size-cache" ) ;
25+
26+ return createCache ( {
27+ queueSize : new Namespace < number > ( ctx , {
28+ stores : [ memory ] ,
29+ fresh : env . QUEUE_SIZE_CACHE_TTL_MS ,
30+ stale : env . QUEUE_SIZE_CACHE_TTL_MS + 1000 ,
31+ } ) ,
32+ } ) ;
33+ } ) ;
1834
1935/**
2036 * Extract the queue name from a queue option that may be:
@@ -49,7 +65,7 @@ export class DefaultQueueManager implements QueueManager {
4965 constructor (
5066 private readonly prisma : PrismaClientOrTransaction ,
5167 private readonly engine : RunEngine
52- ) { }
68+ ) { }
5369
5470 async resolveQueueProperties (
5571 request : TriggerTaskRequest ,
@@ -75,8 +91,7 @@ export class DefaultQueueManager implements QueueManager {
7591
7692 if ( ! specifiedQueue ) {
7793 throw new ServiceValidationError (
78- `Specified queue '${ specifiedQueueName } ' not found or not associated with locked version '${
79- lockedBackgroundWorker . version ?? "<unknown>"
94+ `Specified queue '${ specifiedQueueName } ' not found or not associated with locked version '${ lockedBackgroundWorker . version ?? "<unknown>"
8095 } '.`
8196 ) ;
8297 }
@@ -98,8 +113,7 @@ export class DefaultQueueManager implements QueueManager {
98113
99114 if ( ! lockedTask ) {
100115 throw new ServiceValidationError (
101- `Task '${ request . taskId } ' not found on locked version '${
102- lockedBackgroundWorker . version ?? "<unknown>"
116+ `Task '${ request . taskId } ' not found on locked version '${ lockedBackgroundWorker . version ?? "<unknown>"
103117 } '.`
104118 ) ;
105119 }
@@ -113,8 +127,7 @@ export class DefaultQueueManager implements QueueManager {
113127 version : lockedBackgroundWorker . version ,
114128 } ) ;
115129 throw new ServiceValidationError (
116- `Default queue configuration for task '${ request . taskId } ' missing on locked version '${
117- lockedBackgroundWorker . version ?? "<unknown>"
130+ `Default queue configuration for task '${ request . taskId } ' missing on locked version '${ lockedBackgroundWorker . version ?? "<unknown>"
118131 } '.`
119132 ) ;
120133 }
@@ -282,7 +295,7 @@ async function guardQueueSizeLimitsForEnv(
282295 return { isWithinLimits : true } ;
283296 }
284297
285- const queueSize = await engine . lengthOfEnvQueue ( environment ) ;
298+ const queueSize = await getCachedQueueSize ( engine , environment ) ;
286299 const projectedSize = queueSize + itemsToAdd ;
287300
288301 return {
@@ -291,3 +304,14 @@ async function guardQueueSizeLimitsForEnv(
291304 queueSize,
292305 } ;
293306}
307+
308+ async function getCachedQueueSize (
309+ engine : RunEngine ,
310+ environment : AuthenticatedEnvironment
311+ ) : Promise < number > {
312+ const result = await queueSizeCache . queueSize . swr ( environment . id , async ( ) => {
313+ return engine . lengthOfEnvQueue ( environment ) ;
314+ } ) ;
315+
316+ return result . val ?? 0 ;
317+ }
0 commit comments