@@ -44,6 +44,7 @@ export type FairDequeuingStrategyOptions = {
44
44
* If not provided, no biasing will be applied (completely random shuffling)
45
45
*/
46
46
biases ?: FairDequeuingStrategyBiases ;
47
+ reuseSnapshotCount ?: number ;
47
48
} ;
48
49
49
50
type FairQueueConcurrency = {
@@ -90,6 +91,10 @@ export class FairDequeuingStrategy implements MarQSFairDequeueStrategy {
90
91
} > ;
91
92
92
93
private _rng : seedrandom . PRNG ;
94
+ private _reusedSnapshotForConsumer : Map <
95
+ string ,
96
+ { snapshot : FairQueueSnapshot ; reuseCount : number }
97
+ > = new Map ( ) ;
93
98
94
99
constructor ( private options : FairDequeuingStrategyOptions ) {
95
100
const ctx = new DefaultStatefulContext ( ) ;
@@ -310,6 +315,31 @@ export class FairDequeuingStrategy implements MarQSFairDequeueStrategy {
310
315
span . setAttribute ( "consumer_id" , consumerId ) ;
311
316
span . setAttribute ( "parent_queue" , parentQueue ) ;
312
317
318
+ if (
319
+ typeof this . options . reuseSnapshotCount === "number" &&
320
+ this . options . reuseSnapshotCount > 0
321
+ ) {
322
+ const key = `${ parentQueue } :${ consumerId } ` ;
323
+ const reusedSnapshot = this . _reusedSnapshotForConsumer . get ( key ) ;
324
+
325
+ if ( reusedSnapshot ) {
326
+ if ( reusedSnapshot . reuseCount < this . options . reuseSnapshotCount ) {
327
+ span . setAttribute ( "reused_snapshot" , true ) ;
328
+
329
+ this . _reusedSnapshotForConsumer . set ( key , {
330
+ snapshot : reusedSnapshot . snapshot ,
331
+ reuseCount : reusedSnapshot . reuseCount + 1 ,
332
+ } ) ;
333
+
334
+ return reusedSnapshot . snapshot ;
335
+ } else {
336
+ this . _reusedSnapshotForConsumer . delete ( key ) ;
337
+ }
338
+ }
339
+ }
340
+
341
+ span . setAttribute ( "reused_snapshot" , false ) ;
342
+
313
343
const now = Date . now ( ) ;
314
344
315
345
const queues = await this . #allChildQueuesByScore( parentQueue , consumerId , now ) ;
@@ -341,10 +371,6 @@ export class FairDequeuingStrategy implements MarQSFairDequeueStrategy {
341
371
( org ) => org . concurrency . current >= org . concurrency . limit
342
372
) ;
343
373
344
- span . setAttributes ( {
345
- ...flattenAttributes ( orgsAtFullConcurrency , "orgs_at_full_concurrency" ) ,
346
- } ) ;
347
-
348
374
const orgIdsAtFullConcurrency = new Set ( orgsAtFullConcurrency . map ( ( org ) => org . id ) ) ;
349
375
350
376
const orgsSnapshot = orgs . reduce ( ( acc , org ) => {
@@ -355,6 +381,12 @@ export class FairDequeuingStrategy implements MarQSFairDequeueStrategy {
355
381
return acc ;
356
382
} , { } as Record < string , { concurrency : FairQueueConcurrency } > ) ;
357
383
384
+ span . setAttributes ( {
385
+ org_count : orgs . length ,
386
+ orgs_at_full_concurrency_count : orgsAtFullConcurrency . length ,
387
+ orgs_snapshot_count : Object . keys ( orgsSnapshot ) . length ,
388
+ } ) ;
389
+
358
390
if ( Object . keys ( orgsSnapshot ) . length === 0 ) {
359
391
return emptyFairQueueSnapshot ;
360
392
}
@@ -376,10 +408,6 @@ export class FairDequeuingStrategy implements MarQSFairDequeueStrategy {
376
408
( env ) => env . concurrency . current >= env . concurrency . limit
377
409
) ;
378
410
379
- span . setAttributes ( {
380
- ...flattenAttributes ( envsAtFullConcurrency , "envs_at_full_concurrency" ) ,
381
- } ) ;
382
-
383
411
const envIdsAtFullConcurrency = new Set ( envsAtFullConcurrency . map ( ( env ) => env . id ) ) ;
384
412
385
413
const envsSnapshot = envs . reduce ( ( acc , env ) => {
@@ -390,6 +418,11 @@ export class FairDequeuingStrategy implements MarQSFairDequeueStrategy {
390
418
return acc ;
391
419
} , { } as Record < string , { concurrency : FairQueueConcurrency } > ) ;
392
420
421
+ span . setAttributes ( {
422
+ env_count : envs . length ,
423
+ envs_at_full_concurrency_count : envsAtFullConcurrency . length ,
424
+ } ) ;
425
+
393
426
const queuesSnapshot = queues . filter (
394
427
( queue ) =>
395
428
! orgIdsAtFullConcurrency . has ( queue . org ) && ! envIdsAtFullConcurrency . has ( queue . env )
@@ -402,6 +435,16 @@ export class FairDequeuingStrategy implements MarQSFairDequeueStrategy {
402
435
queues : queuesSnapshot ,
403
436
} ;
404
437
438
+ if (
439
+ typeof this . options . reuseSnapshotCount === "number" &&
440
+ this . options . reuseSnapshotCount > 0
441
+ ) {
442
+ this . _reusedSnapshotForConsumer . set ( `${ parentQueue } :${ consumerId } ` , {
443
+ snapshot,
444
+ reuseCount : 0 ,
445
+ } ) ;
446
+ }
447
+
405
448
return snapshot ;
406
449
} ) ;
407
450
}
0 commit comments