X Tutup
Skip to content

Latest commit

 

History

History
5011 lines (4597 loc) · 143 KB

File metadata and controls

5011 lines (4597 loc) · 143 KB

Batch Queue Stress Test Plan

This document outlines a systematic approach to testing the new Batch Queue with Deficit Round Robin (DRR) scheduling.

Test Environment

Setup:

  • Single local machine running one webapp instance (single BatchQueue consumer process)
  • 3 organizations, each with 3 projects = 9 tenants total
  • All tenants using the same task ID: stress-test-task

Note: In production, multiple webapp instances will run BatchQueue consumers in parallel. This single-instance testing focuses on algorithm behavior rather than horizontal scaling.

Configuration Options Under Test

Variable Default Description
BATCH_QUEUE_DRR_QUANTUM 5 Credits allocated per environment per scheduling round
BATCH_QUEUE_MAX_DEFICIT 50 Maximum accumulated deficit (prevents starvation)
BATCH_QUEUE_CONSUMER_COUNT 1 Number of concurrent consumer loops
BATCH_QUEUE_CONSUMER_INTERVAL_MS 100 Polling interval between consumer iterations
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY 10 Default concurrent batch items per environment
BATCH_QUEUE_GLOBAL_RATE_LIMIT none Optional global items/sec limit

Per-Org Settings (via database):

  • batchQueueConcurrencyConfig - Override concurrency per org
  • batchRateLimitConfig - Rate limit per org

Test Series Overview

Series Focus Objective
A Baseline Establish reference metrics with defaults
B DRR Quantum Understand how quantum affects fairness and throughput
C Max Deficit Understand starvation prevention and catch-up behavior
D Consumer Count Test parallelism within single process
E Consumer Interval Test polling frequency impact
F Concurrency Limits Test per-environment processing limits
G Global Rate Limiter Test global throughput caps
H Asymmetric Load Test fairness under uneven workloads
I Combined Tuning Test optimized configurations

Series A: Baseline (Default Configuration)

Objective: Establish baseline metrics with all default settings.

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
# BATCH_QUEUE_CONSUMER_COUNT not set (default: 1)
# BATCH_QUEUE_CONSUMER_INTERVAL_MS not set (default: 100)
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10
# BATCH_QUEUE_GLOBAL_RATE_LIMIT not set

Test A1: Fairness Baseline (All 9 Tenants)

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "Baseline fairness test"

Expected: All tenants should complete in roughly similar timeframes.

Results A1 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "Baseline fairness test",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 54.51792024230187,
    "overallDuration": 49525,
    "fairnessIndex": 0.9999098436641237,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 49323,
        "avgItemsPerSecond": 6.082355087890031,
        "avgBatchDuration": 49238,
        "minBatchDuration": 49196,
        "maxBatchDuration": 49322,
        "p50Duration": 49196,
        "p95Duration": 49322,
        "p99Duration": 49322
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 49460,
        "avgItemsPerSecond": 6.06550748079256,
        "avgBatchDuration": 49290.666666666664,
        "minBatchDuration": 49187,
        "maxBatchDuration": 49429,
        "p50Duration": 49256,
        "p95Duration": 49429,
        "p99Duration": 49429
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 49484,
        "avgItemsPerSecond": 6.062565677794843,
        "avgBatchDuration": 36861.666666666664,
        "minBatchDuration": 15041,
        "maxBatchDuration": 49472,
        "p50Duration": 46072,
        "p95Duration": 49472,
        "p99Duration": 49472
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 48442,
        "avgItemsPerSecond": 6.192973039924033,
        "avgBatchDuration": 48347,
        "minBatchDuration": 48223,
        "maxBatchDuration": 48442,
        "p50Duration": 48376,
        "p95Duration": 48442,
        "p99Duration": 48442
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 48446,
        "avgItemsPerSecond": 6.192461709945094,
        "avgBatchDuration": 48102.333333333336,
        "minBatchDuration": 47417,
        "maxBatchDuration": 48446,
        "p50Duration": 48444,
        "p95Duration": 48446,
        "p99Duration": 48446
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 48288,
        "avgItemsPerSecond": 6.21272365805169,
        "avgBatchDuration": 36139.333333333336,
        "minBatchDuration": 16087,
        "maxBatchDuration": 48218,
        "p50Duration": 44113,
        "p95Duration": 48218,
        "p99Duration": 48218
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 49148,
        "avgItemsPerSecond": 6.104012370798404,
        "avgBatchDuration": 49074.666666666664,
        "minBatchDuration": 49061,
        "maxBatchDuration": 49099,
        "p50Duration": 49064,
        "p95Duration": 49099,
        "p99Duration": 49099
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 49178,
        "avgItemsPerSecond": 6.1002887470006915,
        "avgBatchDuration": 48484.333333333336,
        "minBatchDuration": 47154,
        "maxBatchDuration": 49176,
        "p50Duration": 49123,
        "p95Duration": 49176,
        "p99Duration": 49176
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 49454,
        "avgItemsPerSecond": 6.066243377684312,
        "avgBatchDuration": 49372.666666666664,
        "minBatchDuration": 49251,
        "maxBatchDuration": 49454,
        "p50Duration": 49413,
        "p95Duration": 49454,
        "p99Duration": 49454
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T14:23:40.510Z",
    "end": "2025-12-15T14:24:30.035Z"
  }
}

Observations:

  • Overall throughput: 54.52 items/sec with 9 tenants competing
  • Fairness index: 0.9999 (nearly perfect fairness)
  • Notable patterns: All tenants completed within 1-2 seconds of each other (48-50s range). Per-tenant throughput ~6 items/sec each. DRR is working excellently for symmetric load.

Test A2: Throughput Baseline (Single Tenant)

Command:

pnpm stress throughput --batch-sizes 100,500,1000 --batch-count 3

Expected: Establish throughput ceiling for single tenant.

Results A2 (click to expand)
[
  {
    "scenario": "throughput-100",
    "config": {
      "tenantCount": 1,
      "batchSize": 100,
      "batchCount": 3
    },
    "results": {
      "totalItemsProcessed": 300,
      "totalBatches": 3,
      "overallThroughput": 82.57638315441784,
      "overallDuration": 3633,
      "fairnessIndex": 1,
      "perTenant": [
        {
          "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
          "totalItems": 300,
          "totalBatches": 3,
          "totalDuration": 3570,
          "avgItemsPerSecond": 84.03361344537815,
          "avgBatchDuration": 3558.6666666666665,
          "minBatchDuration": 3538,
          "maxBatchDuration": 3570,
          "p50Duration": 3568,
          "p95Duration": 3570,
          "p99Duration": 3570
        }
      ]
    },
    "timestamps": {
      "start": "2025-12-15T14:41:19.119Z",
      "end": "2025-12-15T14:41:22.752Z"
    }
  },
  {
    "scenario": "throughput-500",
    "config": {
      "tenantCount": 1,
      "batchSize": 500,
      "batchCount": 3
    },
    "results": {
      "totalItemsProcessed": 1500,
      "totalBatches": 3,
      "overallThroughput": 97.48488984207448,
      "overallDuration": 15387,
      "fairnessIndex": 1,
      "perTenant": [
        {
          "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
          "totalItems": 1500,
          "totalBatches": 3,
          "totalDuration": 15384,
          "avgItemsPerSecond": 97.50390015600624,
          "avgBatchDuration": 15369,
          "minBatchDuration": 15356,
          "maxBatchDuration": 15384,
          "p50Duration": 15367,
          "p95Duration": 15384,
          "p99Duration": 15384
        }
      ]
    },
    "timestamps": {
      "start": "2025-12-15T14:41:23.069Z",
      "end": "2025-12-15T14:41:38.456Z"
    }
  },
  {
    "scenario": "throughput-1000",
    "config": {
      "tenantCount": 1,
      "batchSize": 1000,
      "batchCount": 3
    },
    "results": {
      "totalItemsProcessed": 3000,
      "totalBatches": 3,
      "overallThroughput": 88.60796880999499,
      "overallDuration": 33857,
      "fairnessIndex": 1,
      "perTenant": [
        {
          "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
          "totalItems": 3000,
          "totalBatches": 3,
          "totalDuration": 33839,
          "avgItemsPerSecond": 88.65510210112592,
          "avgBatchDuration": 33109,
          "minBatchDuration": 32731,
          "maxBatchDuration": 33827,
          "p50Duration": 32769,
          "p95Duration": 33827,
          "p99Duration": 33827
        }
      ]
    },
    "timestamps": {
      "start": "2025-12-15T14:41:38.860Z",
      "end": "2025-12-15T14:42:12.717Z"
    }
  }
]

Observations:

  • Max throughput achieved: 97.48 items/sec (at batch size 500)
  • Scaling behavior: Non-linear. 100 items → 82.58/sec, 500 items → 97.48/sec (peak), 1000 items → 88.61/sec. Sweet spot around 500 items per batch. Larger batches may introduce overhead or hit concurrency limits.

Series B: DRR Quantum Variations

Objective: Understand how quantum size affects fairness vs. throughput tradeoff.

Theory:

  • Lower quantum = more frequent tenant switching = better fairness, possibly lower throughput
  • Higher quantum = longer bursts per tenant = potentially higher throughput, worse fairness

Test B1: Very Low Quantum (quantum=1)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=1
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "Low quantum=1"
Results B1 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "Low quantum=1",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 66.08899985313556,
    "overallDuration": 40854,
    "fairnessIndex": 0.9997008998554137,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 40769,
        "avgItemsPerSecond": 7.358532218106895,
        "avgBatchDuration": 36850.333333333336,
        "minBatchDuration": 29016,
        "maxBatchDuration": 40769,
        "p50Duration": 40766,
        "p95Duration": 40769,
        "p99Duration": 40769
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 40771,
        "avgItemsPerSecond": 7.358171249172206,
        "avgBatchDuration": 40408.333333333336,
        "minBatchDuration": 39684,
        "maxBatchDuration": 40771,
        "p50Duration": 40770,
        "p95Duration": 40771,
        "p99Duration": 40771
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 40754,
        "avgItemsPerSecond": 7.361240614418216,
        "avgBatchDuration": 40106,
        "minBatchDuration": 39076,
        "maxBatchDuration": 40753,
        "p50Duration": 40489,
        "p95Duration": 40753,
        "p99Duration": 40753
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 40770,
        "avgItemsPerSecond": 7.358351729212656,
        "avgBatchDuration": 40717.333333333336,
        "minBatchDuration": 40616,
        "maxBatchDuration": 40769,
        "p50Duration": 40767,
        "p95Duration": 40769,
        "p99Duration": 40769
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 40767,
        "avgItemsPerSecond": 7.358893222459342,
        "avgBatchDuration": 40610,
        "minBatchDuration": 40299,
        "maxBatchDuration": 40766,
        "p50Duration": 40765,
        "p95Duration": 40766,
        "p99Duration": 40766
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 40780,
        "avgItemsPerSecond": 7.356547327121138,
        "avgBatchDuration": 40681.666666666664,
        "minBatchDuration": 40497,
        "maxBatchDuration": 40778,
        "p50Duration": 40770,
        "p95Duration": 40778,
        "p99Duration": 40778
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 40771,
        "avgItemsPerSecond": 7.358171249172206,
        "avgBatchDuration": 40766.333333333336,
        "minBatchDuration": 40764,
        "maxBatchDuration": 40769,
        "p50Duration": 40766,
        "p95Duration": 40769,
        "p99Duration": 40769
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 38628,
        "avgItemsPerSecond": 7.766387076731904,
        "avgBatchDuration": 34753,
        "minBatchDuration": 28057,
        "maxBatchDuration": 38627,
        "p50Duration": 37575,
        "p95Duration": 38627,
        "p99Duration": 38627
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 40754,
        "avgItemsPerSecond": 7.361240614418216,
        "avgBatchDuration": 40018.333333333336,
        "minBatchDuration": 39630,
        "maxBatchDuration": 40754,
        "p50Duration": 39671,
        "p95Duration": 40754,
        "p99Duration": 40754
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T14:48:32.814Z",
    "end": "2025-12-15T14:49:13.668Z"
  }
}

Observations:

  • Fairness index: 0.9997 (vs baseline: 0.9999) - nearly identical
  • Throughput: 66.09 items/sec (vs baseline: 54.52) - +21% improvement!
  • Context switching overhead visible?: Not significantly. Despite switching tenants every 1 item, throughput actually improved. The tighter scheduling may have better utilized concurrency slots.

Test B2: Medium Quantum (quantum=10)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=10
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "Medium quantum=10"
Results B2 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "Medium quantum=10",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 64.68615237182559,
    "overallDuration": 41740,
    "fairnessIndex": 0.9998055065601579,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 40743,
        "avgItemsPerSecond": 7.363228039172373,
        "avgBatchDuration": 37656,
        "minBatchDuration": 31484,
        "maxBatchDuration": 40743,
        "p50Duration": 40741,
        "p95Duration": 40743,
        "p99Duration": 40743
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 40745,
        "avgItemsPerSecond": 7.362866609399926,
        "avgBatchDuration": 36601.666666666664,
        "minBatchDuration": 28318,
        "maxBatchDuration": 40745,
        "p50Duration": 40742,
        "p95Duration": 40745,
        "p99Duration": 40745
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 41664,
        "avgItemsPerSecond": 7.200460829493087,
        "avgBatchDuration": 38524.333333333336,
        "minBatchDuration": 32253,
        "maxBatchDuration": 41660,
        "p50Duration": 41660,
        "p95Duration": 41660,
        "p99Duration": 41660
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 41443,
        "avgItemsPerSecond": 7.238858190768043,
        "avgBatchDuration": 36661.333333333336,
        "minBatchDuration": 32251,
        "maxBatchDuration": 41443,
        "p50Duration": 36290,
        "p95Duration": 41443,
        "p99Duration": 41443
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 40436,
        "avgItemsPerSecond": 7.419131467009596,
        "avgBatchDuration": 40406,
        "minBatchDuration": 40349,
        "maxBatchDuration": 40436,
        "p50Duration": 40433,
        "p95Duration": 40436,
        "p99Duration": 40436
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 41044,
        "avgItemsPerSecond": 7.309229119968814,
        "avgBatchDuration": 39122,
        "minBatchDuration": 35972,
        "maxBatchDuration": 41040,
        "p50Duration": 40354,
        "p95Duration": 41040,
        "p99Duration": 41040
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 41683,
        "avgItemsPerSecond": 7.197178705947269,
        "avgBatchDuration": 41325,
        "minBatchDuration": 40636,
        "maxBatchDuration": 41683,
        "p50Duration": 41656,
        "p95Duration": 41683,
        "p99Duration": 41683
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 41412,
        "avgItemsPerSecond": 7.244277021153288,
        "avgBatchDuration": 40959.666666666664,
        "minBatchDuration": 40735,
        "maxBatchDuration": 41406,
        "p50Duration": 40738,
        "p95Duration": 41406,
        "p99Duration": 41406
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 39914,
        "avgItemsPerSecond": 7.516159743448415,
        "avgBatchDuration": 36645,
        "minBatchDuration": 32034,
        "maxBatchDuration": 39914,
        "p50Duration": 37987,
        "p95Duration": 39914,
        "p99Duration": 39914
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T14:51:13.796Z",
    "end": "2025-12-15T14:51:55.536Z"
  }
}

Observations:

  • Fairness index: 0.9998 (excellent)
  • Throughput: 64.69 items/sec (vs quantum=1: 66.09, slightly lower)
  • Comparison to baseline: +18% throughput vs baseline. Higher quantum didn't provide expected gains; the overhead theory is not supported by evidence.

Test B3: High Quantum (quantum=25)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=25
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "High quantum=25"
Results B3 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "High quantum=25",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 84.3644544431946,
    "overallDuration": 32004,
    "fairnessIndex": 0.9999195340273302,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 31137,
        "avgItemsPerSecond": 9.634839579920994,
        "avgBatchDuration": 31135.333333333332,
        "minBatchDuration": 31134,
        "maxBatchDuration": 31137,
        "p50Duration": 31135,
        "p95Duration": 31137,
        "p99Duration": 31137
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 31135,
        "avgItemsPerSecond": 9.635458487233016,
        "avgBatchDuration": 30287.333333333332,
        "minBatchDuration": 29792,
        "maxBatchDuration": 31133,
        "p50Duration": 29937,
        "p95Duration": 31133,
        "p99Duration": 31133
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 31197,
        "avgItemsPerSecond": 9.616309260505819,
        "avgBatchDuration": 24641,
        "minBatchDuration": 18973,
        "maxBatchDuration": 31197,
        "p50Duration": 23753,
        "p95Duration": 31197,
        "p99Duration": 31197
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 31105,
        "avgItemsPerSecond": 9.644751647645073,
        "avgBatchDuration": 29303,
        "minBatchDuration": 25964,
        "maxBatchDuration": 31105,
        "p50Duration": 30840,
        "p95Duration": 31105,
        "p99Duration": 31105
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 31120,
        "avgItemsPerSecond": 9.640102827763496,
        "avgBatchDuration": 31006.333333333332,
        "minBatchDuration": 30835,
        "maxBatchDuration": 31120,
        "p50Duration": 31064,
        "p95Duration": 31120,
        "p99Duration": 31120
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 31075,
        "avgItemsPerSecond": 9.654062751407883,
        "avgBatchDuration": 24953.333333333332,
        "minBatchDuration": 21079,
        "maxBatchDuration": 31073,
        "p50Duration": 22708,
        "p95Duration": 31073,
        "p99Duration": 31073
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 31965,
        "avgItemsPerSecond": 9.385265133740027,
        "avgBatchDuration": 25924.666666666668,
        "minBatchDuration": 22904,
        "maxBatchDuration": 31964,
        "p50Duration": 22906,
        "p95Duration": 31964,
        "p99Duration": 31964
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 31106,
        "avgItemsPerSecond": 9.644441586832123,
        "avgBatchDuration": 26298.333333333332,
        "minBatchDuration": 16867,
        "maxBatchDuration": 31106,
        "p50Duration": 30922,
        "p95Duration": 31106,
        "p99Duration": 31106
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 30886,
        "avgItemsPerSecond": 9.713138638865505,
        "avgBatchDuration": 30883,
        "minBatchDuration": 30881,
        "maxBatchDuration": 30884,
        "p50Duration": 30884,
        "p95Duration": 30884,
        "p99Duration": 30884
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T14:54:10.280Z",
    "end": "2025-12-15T14:54:42.284Z"
  }
}

Observations:

  • Fairness index: 0.9999 (best in B series!)
  • Throughput: 84.36 items/sec (BEST in B series, +55% vs baseline)
  • Evidence of tenant starvation?: None. All tenants completed in 30-32s range. Higher quantum=25 actually provided better throughput AND fairness!

Test B4: Very High Quantum (quantum=50)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=50
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "Very high quantum=50"
Results B4 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "Very high quantum=50",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 51.97605251506343,
    "overallDuration": 51947,
    "fairnessIndex": 0.9997441540697334,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 51416,
        "avgItemsPerSecond": 5.834759607904155,
        "avgBatchDuration": 51002,
        "minBatchDuration": 50774,
        "maxBatchDuration": 51416,
        "p50Duration": 50816,
        "p95Duration": 51416,
        "p99Duration": 51416
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 51847,
        "avgItemsPerSecond": 5.786255713927518,
        "avgBatchDuration": 51840.666666666664,
        "minBatchDuration": 51838,
        "maxBatchDuration": 51843,
        "p50Duration": 51841,
        "p95Duration": 51843,
        "p99Duration": 51843
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 51252,
        "avgItemsPerSecond": 5.853430110044486,
        "avgBatchDuration": 51034.333333333336,
        "minBatchDuration": 50778,
        "maxBatchDuration": 51250,
        "p50Duration": 51075,
        "p95Duration": 51250,
        "p99Duration": 51250
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 50778,
        "avgItemsPerSecond": 5.908070424199456,
        "avgBatchDuration": 50768.666666666664,
        "minBatchDuration": 50765,
        "maxBatchDuration": 50776,
        "p50Duration": 50765,
        "p95Duration": 50776,
        "p99Duration": 50776
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 49692,
        "avgItemsPerSecond": 6.037189084762135,
        "avgBatchDuration": 49689.666666666664,
        "minBatchDuration": 49687,
        "maxBatchDuration": 49692,
        "p50Duration": 49690,
        "p95Duration": 49692,
        "p99Duration": 49692
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 51843,
        "avgItemsPerSecond": 5.786702158439905,
        "avgBatchDuration": 51842,
        "minBatchDuration": 51841,
        "maxBatchDuration": 51843,
        "p50Duration": 51842,
        "p95Duration": 51843,
        "p99Duration": 51843
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 50821,
        "avgItemsPerSecond": 5.9030715649042715,
        "avgBatchDuration": 50794.666666666664,
        "minBatchDuration": 50779,
        "maxBatchDuration": 50821,
        "p50Duration": 50784,
        "p95Duration": 50821,
        "p99Duration": 50821
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 49689,
        "avgItemsPerSecond": 6.037553583288052,
        "avgBatchDuration": 49682,
        "minBatchDuration": 49678,
        "maxBatchDuration": 49689,
        "p50Duration": 49679,
        "p95Duration": 49689,
        "p99Duration": 49689
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 51838,
        "avgItemsPerSecond": 5.787260310968787,
        "avgBatchDuration": 51483.333333333336,
        "minBatchDuration": 50775,
        "maxBatchDuration": 51838,
        "p50Duration": 51837,
        "p95Duration": 51838,
        "p99Duration": 51838
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T14:58:47.844Z",
    "end": "2025-12-15T14:59:39.791Z"
  }
}

Observations:

  • Fairness index: 0.9997 (still excellent)
  • Throughput: 51.98 items/sec (WORST in B series, -5% vs baseline)
  • Notable patterns: Diminishing returns / counterproductive. Very high quantum=50 actually hurt throughput. With 9 tenants each getting 50-item bursts, tenants wait too long for their turn. Sweet spot appears to be quantum=25.

Series C: Max Deficit Variations

Objective: Understand how max deficit cap affects catch-up behavior for starved tenants.

Theory:

  • Lower max deficit = limits how much a starved tenant can "catch up"
  • Higher max deficit = allows more aggressive catch-up, but could starve other tenants

Test C1: Low Max Deficit (maxDeficit=10)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=10
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "Low maxDeficit=10"
Results C1 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "Low maxDeficit=10",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 52.51385782359234,
    "overallDuration": 51415,
    "fairnessIndex": 0.9997739979483051,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 49624,
        "avgItemsPerSecond": 6.0454618732871195,
        "avgBatchDuration": 49357.333333333336,
        "minBatchDuration": 48832,
        "maxBatchDuration": 49624,
        "p50Duration": 49616,
        "p95Duration": 49624,
        "p99Duration": 49624
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 51230,
        "avgItemsPerSecond": 5.8559437829396845,
        "avgBatchDuration": 50431,
        "minBatchDuration": 49201,
        "maxBatchDuration": 51230,
        "p50Duration": 50862,
        "p95Duration": 51230,
        "p99Duration": 51230
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 51410,
        "avgItemsPerSecond": 5.83544057576347,
        "avgBatchDuration": 49448.333333333336,
        "minBatchDuration": 45734,
        "maxBatchDuration": 51410,
        "p50Duration": 51201,
        "p95Duration": 51410,
        "p99Duration": 51410
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 49206,
        "avgItemsPerSecond": 6.096817461285209,
        "avgBatchDuration": 46922.333333333336,
        "minBatchDuration": 42366,
        "maxBatchDuration": 49201,
        "p50Duration": 49200,
        "p95Duration": 49201,
        "p99Duration": 49201
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 50661,
        "avgItemsPerSecond": 5.921714928643334,
        "avgBatchDuration": 48617.666666666664,
        "minBatchDuration": 46575,
        "maxBatchDuration": 50661,
        "p50Duration": 48617,
        "p95Duration": 50661,
        "p99Duration": 50661
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 50189,
        "avgItemsPerSecond": 5.977405407559425,
        "avgBatchDuration": 49945.666666666664,
        "minBatchDuration": 49823,
        "maxBatchDuration": 50189,
        "p50Duration": 49825,
        "p95Duration": 50189,
        "p99Duration": 50189
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 51232,
        "avgItemsPerSecond": 5.8557151780137415,
        "avgBatchDuration": 50892.333333333336,
        "minBatchDuration": 50636,
        "maxBatchDuration": 51229,
        "p50Duration": 50812,
        "p95Duration": 51229,
        "p99Duration": 51229
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 49639,
        "avgItemsPerSecond": 6.0436350450250815,
        "avgBatchDuration": 44099,
        "minBatchDuration": 41326,
        "maxBatchDuration": 49638,
        "p50Duration": 41333,
        "p95Duration": 49638,
        "p99Duration": 49638
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 50193,
        "avgItemsPerSecond": 5.976929053852131,
        "avgBatchDuration": 49979.666666666664,
        "minBatchDuration": 49623,
        "maxBatchDuration": 50193,
        "p50Duration": 50123,
        "p95Duration": 50193,
        "p99Duration": 50193
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:01:17.027Z",
    "end": "2025-12-15T15:02:08.442Z"
  }
}

Observations:

  • Fairness index: 0.9998 (excellent)
  • Throughput: 52.51 items/sec (similar to baseline)
  • Recovery behavior: Constrained. Low max deficit limits catch-up ability. Total duration 51.4s, consistent with limited burst capacity.

Test C2: Medium Max Deficit (maxDeficit=25)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=25
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "Medium maxDeficit=25"
Results C2 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "Medium maxDeficit=25",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 66.32928806564142,
    "overallDuration": 40706,
    "fairnessIndex": 0.9992454865624668,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 39801,
        "avgItemsPerSecond": 7.537499057812618,
        "avgBatchDuration": 35339.333333333336,
        "minBatchDuration": 28824,
        "maxBatchDuration": 39800,
        "p50Duration": 37394,
        "p95Duration": 39800,
        "p99Duration": 39800
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 39487,
        "avgItemsPerSecond": 7.597437131207739,
        "avgBatchDuration": 36988.666666666664,
        "minBatchDuration": 34055,
        "maxBatchDuration": 39486,
        "p50Duration": 37425,
        "p95Duration": 39486,
        "p99Duration": 39486
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 37449,
        "avgItemsPerSecond": 8.010894816951053,
        "avgBatchDuration": 36409.333333333336,
        "minBatchDuration": 34337,
        "maxBatchDuration": 37447,
        "p50Duration": 37444,
        "p95Duration": 37447,
        "p99Duration": 37447
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 40648,
        "avgItemsPerSecond": 7.380436921865774,
        "avgBatchDuration": 39841.666666666664,
        "minBatchDuration": 39419,
        "maxBatchDuration": 40647,
        "p50Duration": 39459,
        "p95Duration": 40647,
        "p99Duration": 40647
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 38760,
        "avgItemsPerSecond": 7.739938080495356,
        "avgBatchDuration": 36378.333333333336,
        "minBatchDuration": 33012,
        "maxBatchDuration": 38750,
        "p50Duration": 37373,
        "p95Duration": 38750,
        "p99Duration": 38750
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 37706,
        "avgItemsPerSecond": 7.956293428101628,
        "avgBatchDuration": 37609.333333333336,
        "minBatchDuration": 37424,
        "maxBatchDuration": 37706,
        "p50Duration": 37698,
        "p95Duration": 37706,
        "p99Duration": 37706
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 40621,
        "avgItemsPerSecond": 7.385342556805593,
        "avgBatchDuration": 38921,
        "minBatchDuration": 36642,
        "maxBatchDuration": 40621,
        "p50Duration": 39500,
        "p95Duration": 40621,
        "p99Duration": 40621
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 38757,
        "avgItemsPerSecond": 7.740537193281214,
        "avgBatchDuration": 38744,
        "minBatchDuration": 38730,
        "maxBatchDuration": 38757,
        "p50Duration": 38745,
        "p95Duration": 38757,
        "p99Duration": 38757
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 38751,
        "avgItemsPerSecond": 7.741735697143299,
        "avgBatchDuration": 37674.666666666664,
        "minBatchDuration": 35558,
        "maxBatchDuration": 38740,
        "p50Duration": 38726,
        "p95Duration": 38740,
        "p99Duration": 38740
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:03:24.382Z",
    "end": "2025-12-15T15:04:05.088Z"
  }
}

Observations:

  • Fairness index: 0.9992 (slightly lower but still very good)
  • Throughput: 66.33 items/sec (+22% vs baseline)
  • Recovery behavior: Better. More headroom for catch-up. Duration dropped from 51.4s (C1) to 40.7s.

Test C3: High Max Deficit (maxDeficit=100)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=100
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "High maxDeficit=100"
Results C3 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "High maxDeficit=100",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 73.73624272878718,
    "overallDuration": 36617,
    "fairnessIndex": 0.9988716605255289,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 32809,
        "avgItemsPerSecond": 9.143832484988875,
        "avgBatchDuration": 30391.666666666668,
        "minBatchDuration": 28722,
        "maxBatchDuration": 32751,
        "p50Duration": 29702,
        "p95Duration": 32751,
        "p99Duration": 32751
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 36540,
        "avgItemsPerSecond": 8.210180623973727,
        "avgBatchDuration": 28375.666666666668,
        "minBatchDuration": 13115,
        "maxBatchDuration": 36537,
        "p50Duration": 35475,
        "p95Duration": 36537,
        "p99Duration": 36537
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 36337,
        "avgItemsPerSecond": 8.256047554833916,
        "avgBatchDuration": 28524.666666666668,
        "minBatchDuration": 13114,
        "maxBatchDuration": 36322,
        "p50Duration": 36138,
        "p95Duration": 36322,
        "p99Duration": 36322
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 35478,
        "avgItemsPerSecond": 8.45594452900389,
        "avgBatchDuration": 27529.333333333332,
        "minBatchDuration": 23556,
        "maxBatchDuration": 35475,
        "p50Duration": 23557,
        "p95Duration": 35475,
        "p99Duration": 35475
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 35453,
        "avgItemsPerSecond": 8.461907313908554,
        "avgBatchDuration": 35291,
        "minBatchDuration": 35039,
        "maxBatchDuration": 35438,
        "p50Duration": 35396,
        "p95Duration": 35438,
        "p99Duration": 35438
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 36430,
        "avgItemsPerSecond": 8.23497117760088,
        "avgBatchDuration": 34851.333333333336,
        "minBatchDuration": 31705,
        "maxBatchDuration": 36425,
        "p50Duration": 36424,
        "p95Duration": 36425,
        "p99Duration": 36425
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 36500,
        "avgItemsPerSecond": 8.21917808219178,
        "avgBatchDuration": 31197,
        "minBatchDuration": 27638,
        "maxBatchDuration": 36495,
        "p50Duration": 29458,
        "p95Duration": 36495,
        "p99Duration": 36495
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 36573,
        "avgItemsPerSecond": 8.202772537117545,
        "avgBatchDuration": 27671.666666666668,
        "minBatchDuration": 23222,
        "maxBatchDuration": 36570,
        "p50Duration": 23223,
        "p95Duration": 36570,
        "p99Duration": 36570
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 35514,
        "avgItemsPerSecond": 8.44737286703835,
        "avgBatchDuration": 35127.666666666664,
        "minBatchDuration": 34370,
        "maxBatchDuration": 35511,
        "p50Duration": 35502,
        "p95Duration": 35511,
        "p99Duration": 35511
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:06:48.615Z",
    "end": "2025-12-15T15:07:25.232Z"
  }
}

Observations:

  • Fairness index: 0.9989 (slightly lower due to more aggressive catch-up)
  • Throughput: 73.74 items/sec (+35% vs baseline, best in C series)
  • Any evidence of new tenant starvation during catch-up?: Minor variance. Some tenants took 13-37s for batches (wider spread) but all finished within reasonable bounds. Higher max deficit = better throughput but slightly more variance.

Series D: Consumer Count Variations

Objective: Test parallelism within a single process.

Theory:

  • More consumers = higher potential throughput (limited by concurrency limits)
  • Diminishing returns expected as consumers contend for the same work

Test D1: Single Consumer (baseline)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=1
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "Single consumer"
Results D1 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "Single consumer",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 41.326108917255944,
    "overallDuration": 65334,
    "fairnessIndex": 0.9996736075271871,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 62086,
        "avgItemsPerSecond": 4.832007215797443,
        "avgBatchDuration": 60490.333333333336,
        "minBatchDuration": 59021,
        "maxBatchDuration": 62084,
        "p50Duration": 60366,
        "p95Duration": 62084,
        "p99Duration": 62084
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 65000,
        "avgItemsPerSecond": 4.615384615384616,
        "avgBatchDuration": 63631.333333333336,
        "minBatchDuration": 61952,
        "maxBatchDuration": 64991,
        "p50Duration": 63951,
        "p95Duration": 64991,
        "p99Duration": 64991
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 62539,
        "avgItemsPerSecond": 4.797006667839269,
        "avgBatchDuration": 60631,
        "minBatchDuration": 58991,
        "maxBatchDuration": 62536,
        "p50Duration": 60366,
        "p95Duration": 62536,
        "p99Duration": 62536
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 64125,
        "avgItemsPerSecond": 4.678362573099415,
        "avgBatchDuration": 61768.666666666664,
        "minBatchDuration": 58220,
        "maxBatchDuration": 64118,
        "p50Duration": 62968,
        "p95Duration": 64118,
        "p99Duration": 64118
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 62536,
        "avgItemsPerSecond": 4.797236791608034,
        "avgBatchDuration": 55644,
        "minBatchDuration": 48107,
        "maxBatchDuration": 62516,
        "p50Duration": 56309,
        "p95Duration": 62516,
        "p99Duration": 62516
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 65257,
        "avgItemsPerSecond": 4.597207962364191,
        "avgBatchDuration": 62698.666666666664,
        "minBatchDuration": 60933,
        "maxBatchDuration": 65257,
        "p50Duration": 61906,
        "p95Duration": 65257,
        "p99Duration": 65257
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 62654,
        "avgItemsPerSecond": 4.788201870590864,
        "avgBatchDuration": 60963.666666666664,
        "minBatchDuration": 59342,
        "maxBatchDuration": 62654,
        "p50Duration": 60895,
        "p95Duration": 62654,
        "p99Duration": 62654
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 62966,
        "avgItemsPerSecond": 4.76447606644856,
        "avgBatchDuration": 61417.333333333336,
        "minBatchDuration": 60031,
        "maxBatchDuration": 62961,
        "p50Duration": 61260,
        "p95Duration": 62961,
        "p99Duration": 62961
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 64690,
        "avgItemsPerSecond": 4.637501932292472,
        "avgBatchDuration": 59325,
        "minBatchDuration": 51023,
        "maxBatchDuration": 64686,
        "p50Duration": 62266,
        "p95Duration": 64686,
        "p99Duration": 64686
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:09:10.445Z",
    "end": "2025-12-15T15:10:15.779Z"
  }
}

Observations:

  • Throughput: 41.33 items/sec (lowest in D series, -24% vs baseline)
  • Fairness: 0.9997 (excellent)
  • Single consumer is a bottleneck. Total duration 65.3s. Each tenant averaging only ~4.6 items/sec.

Test D2: Multiple Consumers (count=3)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=3
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "3 consumers"
Results D2 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "3 consumers",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 57.55211663895639,
    "overallDuration": 46914,
    "fairnessIndex": 0.9992021047885379,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 46746,
        "avgItemsPerSecond": 6.417661404184315,
        "avgBatchDuration": 46353,
        "minBatchDuration": 45585,
        "maxBatchDuration": 46746,
        "p50Duration": 46728,
        "p95Duration": 46746,
        "p99Duration": 46746
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 46812,
        "avgItemsPerSecond": 6.40861317610869,
        "avgBatchDuration": 46805,
        "minBatchDuration": 46794,
        "maxBatchDuration": 46812,
        "p50Duration": 46809,
        "p95Duration": 46812,
        "p99Duration": 46812
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 46606,
        "avgItemsPerSecond": 6.436939449856242,
        "avgBatchDuration": 38880,
        "minBatchDuration": 33105,
        "maxBatchDuration": 46604,
        "p50Duration": 36931,
        "p95Duration": 46604,
        "p99Duration": 46604
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 46821,
        "avgItemsPerSecond": 6.407381303261357,
        "avgBatchDuration": 46059,
        "minBatchDuration": 45679,
        "maxBatchDuration": 46810,
        "p50Duration": 45688,
        "p95Duration": 46810,
        "p99Duration": 46810
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 43729,
        "avgItemsPerSecond": 6.860435866358709,
        "avgBatchDuration": 42251,
        "minBatchDuration": 39304,
        "maxBatchDuration": 43729,
        "p50Duration": 43720,
        "p95Duration": 43729,
        "p99Duration": 43729
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 46597,
        "avgItemsPerSecond": 6.438182715625469,
        "avgBatchDuration": 45484.333333333336,
        "minBatchDuration": 44415,
        "maxBatchDuration": 46567,
        "p50Duration": 45471,
        "p95Duration": 46567,
        "p99Duration": 46567
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 46808,
        "avgItemsPerSecond": 6.409160827209024,
        "avgBatchDuration": 45405,
        "minBatchDuration": 43679,
        "maxBatchDuration": 46761,
        "p50Duration": 45775,
        "p95Duration": 46761,
        "p99Duration": 46761
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 46811,
        "avgItemsPerSecond": 6.408750080109376,
        "avgBatchDuration": 45293,
        "minBatchDuration": 44526,
        "maxBatchDuration": 46784,
        "p50Duration": 44569,
        "p95Duration": 46784,
        "p99Duration": 46784
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 43732,
        "avgItemsPerSecond": 6.859965242842769,
        "avgBatchDuration": 41508,
        "minBatchDuration": 39455,
        "maxBatchDuration": 43581,
        "p50Duration": 41488,
        "p95Duration": 43581,
        "p99Duration": 43581
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:11:42.929Z",
    "end": "2025-12-15T15:12:29.843Z"
  }
}

Observations:

  • Throughput: 57.55 items/sec (vs single: 1.39x improvement)
  • Fairness impact: 0.9992 (very minor degradation)
  • Duration dropped from 65.3s to 46.9s. 3 consumers is a good balance.

Test D3: Many Consumers (count=5)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=5
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "5 consumers"
Results D3 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "5 consumers",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 63.80263717566993,
    "overallDuration": 42318,
    "fairnessIndex": 0.9999000645903268,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 41203,
        "avgItemsPerSecond": 7.281023226464092,
        "avgBatchDuration": 40931,
        "minBatchDuration": 40810,
        "maxBatchDuration": 41167,
        "p50Duration": 40816,
        "p95Duration": 41167,
        "p99Duration": 41167
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 41814,
        "avgItemsPerSecond": 7.1746305065289135,
        "avgBatchDuration": 37657.333333333336,
        "minBatchDuration": 35575,
        "maxBatchDuration": 41814,
        "p50Duration": 35583,
        "p95Duration": 41814,
        "p99Duration": 41814
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 41795,
        "avgItemsPerSecond": 7.177892092355545,
        "avgBatchDuration": 37201.666666666664,
        "minBatchDuration": 34298,
        "maxBatchDuration": 41795,
        "p50Duration": 35512,
        "p95Duration": 41795,
        "p99Duration": 41795
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 41837,
        "avgItemsPerSecond": 7.170686234672658,
        "avgBatchDuration": 40580.333333333336,
        "minBatchDuration": 38694,
        "maxBatchDuration": 41833,
        "p50Duration": 41214,
        "p95Duration": 41833,
        "p99Duration": 41833
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 41829,
        "avgItemsPerSecond": 7.1720576633436135,
        "avgBatchDuration": 39891.666666666664,
        "minBatchDuration": 37128,
        "maxBatchDuration": 41786,
        "p50Duration": 40761,
        "p95Duration": 41786,
        "p99Duration": 41786
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 42246,
        "avgItemsPerSecond": 7.10126402499645,
        "avgBatchDuration": 34807.333333333336,
        "minBatchDuration": 28353,
        "maxBatchDuration": 42154,
        "p50Duration": 33915,
        "p95Duration": 42154,
        "p99Duration": 42154
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 41654,
        "avgItemsPerSecond": 7.202189465597542,
        "avgBatchDuration": 40819.333333333336,
        "minBatchDuration": 40181,
        "maxBatchDuration": 41653,
        "p50Duration": 40624,
        "p95Duration": 41653,
        "p99Duration": 41653
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 41210,
        "avgItemsPerSecond": 7.279786459597185,
        "avgBatchDuration": 40886.333333333336,
        "minBatchDuration": 40630,
        "maxBatchDuration": 41210,
        "p50Duration": 40819,
        "p95Duration": 41210,
        "p99Duration": 41210
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 40813,
        "avgItemsPerSecond": 7.350599073824517,
        "avgBatchDuration": 37843.666666666664,
        "minBatchDuration": 31921,
        "maxBatchDuration": 40810,
        "p50Duration": 40800,
        "p95Duration": 40810,
        "p99Duration": 40810
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:13:47.964Z",
    "end": "2025-12-15T15:14:30.282Z"
  }
}

Observations:

  • Throughput: 63.80 items/sec (vs 3 consumers: 1.11x improvement)
  • Fairness: 0.9999 (nearly perfect!)
  • Diminishing returns?: Yes, starting to see it. Going from 3→5 consumers added ~11% throughput. Still beneficial but less dramatic.

Test D4: High Consumer Count (count=10)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=10
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "10 consumers"
Results D4 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "10 consumers",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 114.94252873563218,
    "overallDuration": 23490,
    "fairnessIndex": 0.9887990604258773,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 23004,
        "avgItemsPerSecond": 13.041210224308816,
        "avgBatchDuration": 21971,
        "minBatchDuration": 19947,
        "maxBatchDuration": 23004,
        "p50Duration": 22962,
        "p95Duration": 23004,
        "p99Duration": 23004
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 22777,
        "avgItemsPerSecond": 13.171181454976512,
        "avgBatchDuration": 21004.666666666668,
        "minBatchDuration": 18477,
        "maxBatchDuration": 22775,
        "p50Duration": 21762,
        "p95Duration": 22775,
        "p99Duration": 22775
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 21772,
        "avgItemsPerSecond": 13.77916590115745,
        "avgBatchDuration": 21014.666666666668,
        "minBatchDuration": 19505,
        "maxBatchDuration": 21772,
        "p50Duration": 21767,
        "p95Duration": 21772,
        "p99Duration": 21772
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 22339,
        "avgItemsPerSecond": 13.42942835399973,
        "avgBatchDuration": 21297.333333333332,
        "minBatchDuration": 20240,
        "maxBatchDuration": 22339,
        "p50Duration": 21313,
        "p95Duration": 22339,
        "p99Duration": 22339
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 22597,
        "avgItemsPerSecond": 13.276098597158914,
        "avgBatchDuration": 20592.333333333332,
        "minBatchDuration": 17413,
        "maxBatchDuration": 22597,
        "p50Duration": 21767,
        "p95Duration": 22597,
        "p99Duration": 22597
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 21762,
        "avgItemsPerSecond": 13.785497656465399,
        "avgBatchDuration": 21700,
        "minBatchDuration": 21578,
        "maxBatchDuration": 21762,
        "p50Duration": 21760,
        "p95Duration": 21762,
        "p99Duration": 21762
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 22275,
        "avgItemsPerSecond": 13.468013468013467,
        "avgBatchDuration": 22239.333333333332,
        "minBatchDuration": 22218,
        "maxBatchDuration": 22275,
        "p50Duration": 22225,
        "p95Duration": 22275,
        "p99Duration": 22275
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 16719,
        "avgItemsPerSecond": 17.94365691727974,
        "avgBatchDuration": 15697,
        "minBatchDuration": 13656,
        "maxBatchDuration": 16719,
        "p50Duration": 16716,
        "p95Duration": 16719,
        "p99Duration": 16719
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 23387,
        "avgItemsPerSecond": 12.827639286783254,
        "avgBatchDuration": 23160.333333333332,
        "minBatchDuration": 22770,
        "maxBatchDuration": 23387,
        "p50Duration": 23324,
        "p95Duration": 23387,
        "p99Duration": 23387
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:16:28.939Z",
    "end": "2025-12-15T15:16:52.429Z"
  }
}

Observations:

  • Throughput: 114.94 items/sec (BEST IN ALL TESTS SO FAR! 2.78x vs single consumer)
  • Fairness: 0.9888 (noticeably lower - some tenants got 17s while others got 23s)
  • CPU impact: Not measured, but likely higher.
  • Contention visible?: Yes, fairness degradation suggests some contention/scheduling variance. One tenant (org-3:efaelbvnogkhjnrdfsmi) finished in 16.7s while others took 21-23s. 10 consumers is great for throughput but comes at fairness cost.

Series E: Consumer Interval Variations

Objective: Test polling frequency impact on throughput and latency.

Theory:

  • Lower interval = more responsive, higher CPU usage
  • Higher interval = lower CPU, higher latency for new work

Test E1: Fast Polling (interval=20ms)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=3
BATCH_QUEUE_CONSUMER_INTERVAL_MS=20
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "Fast polling 20ms"
Results E1 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "Fast polling 20ms",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 70.23019898556379,
    "overallDuration": 38445,
    "fairnessIndex": 0.9979118686098942,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 38383,
        "avgItemsPerSecond": 7.815960190709429,
        "avgBatchDuration": 32665.333333333332,
        "minBatchDuration": 28219,
        "maxBatchDuration": 38381,
        "p50Duration": 31396,
        "p95Duration": 38381,
        "p99Duration": 38381
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 37376,
        "avgItemsPerSecond": 8.026541095890412,
        "avgBatchDuration": 37178.333333333336,
        "minBatchDuration": 36801,
        "maxBatchDuration": 37376,
        "p50Duration": 37358,
        "p95Duration": 37376,
        "p99Duration": 37376
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 37361,
        "avgItemsPerSecond": 8.029763657289687,
        "avgBatchDuration": 29490.666666666668,
        "minBatchDuration": 23952,
        "maxBatchDuration": 37361,
        "p50Duration": 27159,
        "p95Duration": 37361,
        "p99Duration": 37361
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 37997,
        "avgItemsPerSecond": 7.895360160012633,
        "avgBatchDuration": 36532,
        "minBatchDuration": 34226,
        "maxBatchDuration": 37994,
        "p50Duration": 37376,
        "p95Duration": 37994,
        "p99Duration": 37994
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 37889,
        "avgItemsPerSecond": 7.917865343503392,
        "avgBatchDuration": 36989,
        "minBatchDuration": 35364,
        "maxBatchDuration": 37867,
        "p50Duration": 37736,
        "p95Duration": 37867,
        "p99Duration": 37867
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 37359,
        "avgItemsPerSecond": 8.030193527664016,
        "avgBatchDuration": 36533.666666666664,
        "minBatchDuration": 35927,
        "maxBatchDuration": 37357,
        "p50Duration": 36317,
        "p95Duration": 37357,
        "p99Duration": 37357
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 38245,
        "avgItemsPerSecond": 7.844162635638646,
        "avgBatchDuration": 34851.333333333336,
        "minBatchDuration": 28081,
        "maxBatchDuration": 38237,
        "p50Duration": 38236,
        "p95Duration": 38237,
        "p99Duration": 38237
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 38090,
        "avgItemsPerSecond": 7.876082961407193,
        "avgBatchDuration": 36777.666666666664,
        "minBatchDuration": 34984,
        "maxBatchDuration": 38019,
        "p50Duration": 37330,
        "p95Duration": 38019,
        "p99Duration": 38019
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 33054,
        "avgItemsPerSecond": 9.076057360682519,
        "avgBatchDuration": 24749.666666666668,
        "minBatchDuration": 17350,
        "maxBatchDuration": 33048,
        "p50Duration": 23851,
        "p95Duration": 33048,
        "p99Duration": 33048
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:18:51.094Z",
    "end": "2025-12-15T15:19:29.539Z"
  }
}

Observations:

  • Throughput: 70.23 items/sec (good improvement over baseline)
  • Fairness: 0.9979 (slightly lower)
  • CPU usage (if observed): Expected higher due to more frequent polling. Faster polling didn't dramatically improve throughput - suggests bottleneck is elsewhere (processing time, not poll latency).

Test E2: Medium Polling (interval=50ms)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=3
BATCH_QUEUE_CONSUMER_INTERVAL_MS=50
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "Medium polling 50ms"
Results E2 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "Medium polling 50ms",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 93.56806210146937,
    "overallDuration": 28856,
    "fairnessIndex": 0.9994094367115308,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 28584,
        "avgItemsPerSecond": 10.495382031905962,
        "avgBatchDuration": 26949,
        "minBatchDuration": 25606,
        "maxBatchDuration": 28582,
        "p50Duration": 26659,
        "p95Duration": 28582,
        "p99Duration": 28582
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 28733,
        "avgItemsPerSecond": 10.440956391605472,
        "avgBatchDuration": 28390,
        "minBatchDuration": 27709,
        "maxBatchDuration": 28732,
        "p50Duration": 28729,
        "p95Duration": 28732,
        "p99Duration": 28732
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 26660,
        "avgItemsPerSecond": 11.252813203300825,
        "avgBatchDuration": 24539,
        "minBatchDuration": 20303,
        "maxBatchDuration": 26660,
        "p50Duration": 26654,
        "p95Duration": 26660,
        "p99Duration": 26660
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 28729,
        "avgItemsPerSecond": 10.442410108252986,
        "avgBatchDuration": 28355.333333333332,
        "minBatchDuration": 27708,
        "maxBatchDuration": 28727,
        "p50Duration": 28631,
        "p95Duration": 28727,
        "p99Duration": 28727
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 28732,
        "avgItemsPerSecond": 10.44131978282055,
        "avgBatchDuration": 23195.666666666668,
        "minBatchDuration": 13149,
        "maxBatchDuration": 28729,
        "p50Duration": 27709,
        "p95Duration": 28729,
        "p99Duration": 28729
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 28683,
        "avgItemsPerSecond": 10.459156991946449,
        "avgBatchDuration": 28325,
        "minBatchDuration": 27667,
        "maxBatchDuration": 28680,
        "p50Duration": 28628,
        "p95Duration": 28680,
        "p99Duration": 28680
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 28728,
        "avgItemsPerSecond": 10.442773600668337,
        "avgBatchDuration": 28049,
        "minBatchDuration": 26791,
        "maxBatchDuration": 28728,
        "p50Duration": 28628,
        "p95Duration": 28728,
        "p99Duration": 28728
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 28829,
        "avgItemsPerSecond": 10.406188213257483,
        "avgBatchDuration": 28452.666666666668,
        "minBatchDuration": 27805,
        "maxBatchDuration": 28829,
        "p50Duration": 28724,
        "p95Duration": 28829,
        "p99Duration": 28829
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 28824,
        "avgItemsPerSecond": 10.407993338884264,
        "avgBatchDuration": 28786.666666666668,
        "minBatchDuration": 28727,
        "maxBatchDuration": 28817,
        "p50Duration": 28816,
        "p95Duration": 28817,
        "p99Duration": 28817
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:20:41.913Z",
    "end": "2025-12-15T15:21:10.769Z"
  }
}

Observations:

  • Throughput: 93.57 items/sec (BEST in E series! +72% vs baseline)
  • Fairness: 0.9994 (excellent)
  • 50ms polling with 3 consumers is a sweet spot. Much better than 20ms (70.23) - suggests 20ms introduced contention overhead.

Test E3: Default Polling (interval=100ms)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=3
BATCH_QUEUE_CONSUMER_INTERVAL_MS=100
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "Default polling 100ms"
Results E3 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "Default polling 100ms",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 86.52182272639877,
    "overallDuration": 31206,
    "fairnessIndex": 0.9996560386487722,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 31119,
        "avgItemsPerSecond": 9.640412609659693,
        "avgBatchDuration": 24846,
        "minBatchDuration": 12442,
        "maxBatchDuration": 31116,
        "p50Duration": 30980,
        "p95Duration": 31116,
        "p99Duration": 31116
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 30083,
        "avgItemsPerSecond": 9.972409666589103,
        "avgBatchDuration": 28193.666666666668,
        "minBatchDuration": 24794,
        "maxBatchDuration": 30082,
        "p50Duration": 29705,
        "p95Duration": 30082,
        "p99Duration": 30082
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 30774,
        "avgItemsPerSecond": 9.748488984207448,
        "avgBatchDuration": 28711.333333333332,
        "minBatchDuration": 26655,
        "maxBatchDuration": 30774,
        "p50Duration": 28705,
        "p95Duration": 30774,
        "p99Duration": 30774
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 29722,
        "avgItemsPerSecond": 10.093533409595585,
        "avgBatchDuration": 29380.666666666668,
        "minBatchDuration": 28699,
        "maxBatchDuration": 29722,
        "p50Duration": 29721,
        "p95Duration": 29722,
        "p99Duration": 29722
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 30761,
        "avgItemsPerSecond": 9.752608822860115,
        "avgBatchDuration": 28703,
        "minBatchDuration": 27637,
        "maxBatchDuration": 30759,
        "p50Duration": 27713,
        "p95Duration": 30759,
        "p99Duration": 30759
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 29721,
        "avgItemsPerSecond": 10.093873019077419,
        "avgBatchDuration": 29032.333333333332,
        "minBatchDuration": 27674,
        "maxBatchDuration": 29719,
        "p50Duration": 29704,
        "p95Duration": 29719,
        "p99Duration": 29719
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 30089,
        "avgItemsPerSecond": 9.97042108411712,
        "avgBatchDuration": 23863.666666666668,
        "minBatchDuration": 12440,
        "maxBatchDuration": 30087,
        "p50Duration": 29064,
        "p95Duration": 30087,
        "p99Duration": 30087
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 29704,
        "avgItemsPerSecond": 10.099649878804202,
        "avgBatchDuration": 23475,
        "minBatchDuration": 20361,
        "maxBatchDuration": 29701,
        "p50Duration": 20363,
        "p95Duration": 29701,
        "p99Duration": 29701
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 31114,
        "avgItemsPerSecond": 9.641961817831202,
        "avgBatchDuration": 30969.333333333332,
        "minBatchDuration": 30943,
        "maxBatchDuration": 30984,
        "p50Duration": 30981,
        "p95Duration": 30984,
        "p99Duration": 30984
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:22:27.627Z",
    "end": "2025-12-15T15:22:58.833Z"
  }
}

Observations:

  • Throughput: 86.52 items/sec (+59% vs baseline)
  • Fairness: 0.9997 (excellent)
  • 100ms default is solid but slightly lower than 50ms (93.57). 100ms is a good default for balance.

Test E4: Slow Polling (interval=250ms)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=3
BATCH_QUEUE_CONSUMER_INTERVAL_MS=250
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "Slow polling 250ms"
Results E4 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "Slow polling 250ms",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 47.45583970471922,
    "overallDuration": 56895,
    "fairnessIndex": 0.9993684226112225,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 56835,
        "avgItemsPerSecond": 5.278437582475587,
        "avgBatchDuration": 56487.666666666664,
        "minBatchDuration": 56107,
        "maxBatchDuration": 56835,
        "p50Duration": 56521,
        "p95Duration": 56835,
        "p99Duration": 56835
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 56711,
        "avgItemsPerSecond": 5.289979016416568,
        "avgBatchDuration": 48760.666666666664,
        "minBatchDuration": 34046,
        "maxBatchDuration": 56710,
        "p50Duration": 55526,
        "p95Duration": 56710,
        "p99Duration": 56710
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 55715,
        "avgItemsPerSecond": 5.384546351969847,
        "avgBatchDuration": 55026.666666666664,
        "minBatchDuration": 54680,
        "maxBatchDuration": 55715,
        "p50Duration": 54685,
        "p95Duration": 55715,
        "p99Duration": 55715
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 56114,
        "avgItemsPerSecond": 5.346259400506113,
        "avgBatchDuration": 47434,
        "minBatchDuration": 42815,
        "maxBatchDuration": 56109,
        "p50Duration": 43378,
        "p95Duration": 56109,
        "p99Duration": 56109
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 52049,
        "avgItemsPerSecond": 5.763799496628177,
        "avgBatchDuration": 51173,
        "minBatchDuration": 49551,
        "maxBatchDuration": 52046,
        "p50Duration": 51922,
        "p95Duration": 52046,
        "p99Duration": 52046
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 55787,
        "avgItemsPerSecond": 5.377596931184685,
        "avgBatchDuration": 55069.666666666664,
        "minBatchDuration": 53713,
        "maxBatchDuration": 55787,
        "p50Duration": 55709,
        "p95Duration": 55787,
        "p99Duration": 55787
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 55790,
        "avgItemsPerSecond": 5.377307761247535,
        "avgBatchDuration": 47576,
        "minBatchDuration": 31153,
        "maxBatchDuration": 55788,
        "p50Duration": 55787,
        "p95Duration": 55788,
        "p99Duration": 55788
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 56010,
        "avgItemsPerSecond": 5.356186395286556,
        "avgBatchDuration": 47534.333333333336,
        "minBatchDuration": 30885,
        "maxBatchDuration": 56010,
        "p50Duration": 55708,
        "p95Duration": 56010,
        "p99Duration": 56010
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 55784,
        "avgItemsPerSecond": 5.377886132224293,
        "avgBatchDuration": 55374.333333333336,
        "minBatchDuration": 54732,
        "maxBatchDuration": 55784,
        "p50Duration": 55607,
        "p95Duration": 55784,
        "p99Duration": 55784
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:24:13.441Z",
    "end": "2025-12-15T15:25:10.336Z"
  }
}

Observations:

  • Throughput: 47.46 items/sec (-13% vs baseline, worst in E series)
  • Fairness: 0.9994 (good)
  • Latency impact: Significant. Duration 56.9s vs 28.9s for 50ms. 250ms is too slow - introduces unnecessary latency between scheduling rounds.

Series F: Concurrency Limit Variations

Objective: Test per-environment processing concurrency limits.

Theory:

  • Lower concurrency = throttled processing per env, better resource control
  • Higher concurrency = faster per-env processing, potentially starving smaller tenants

Test F1: Low Concurrency (concurrency=2)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=3
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=2

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "Low concurrency=2"
Results F1 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "Low concurrency=2",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 90.7288551362613,
    "overallDuration": 29759,
    "fairnessIndex": 0.9931064638844554,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 28794,
        "avgItemsPerSecond": 10.418837257762034,
        "avgBatchDuration": 27016,
        "minBatchDuration": 23890,
        "maxBatchDuration": 28794,
        "p50Duration": 28364,
        "p95Duration": 28794,
        "p99Duration": 28794
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 29532,
        "avgItemsPerSecond": 10.158472165786264,
        "avgBatchDuration": 27720,
        "minBatchDuration": 26284,
        "maxBatchDuration": 29529,
        "p50Duration": 27347,
        "p95Duration": 29529,
        "p99Duration": 29529
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 29439,
        "avgItemsPerSecond": 10.19056353816366,
        "avgBatchDuration": 22083.333333333332,
        "minBatchDuration": 10765,
        "maxBatchDuration": 29423,
        "p50Duration": 26062,
        "p95Duration": 29423,
        "p99Duration": 29423
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 29529,
        "avgItemsPerSecond": 10.15950421619425,
        "avgBatchDuration": 22252.666666666668,
        "minBatchDuration": 17683,
        "maxBatchDuration": 29396,
        "p50Duration": 19679,
        "p95Duration": 29396,
        "p99Duration": 29396
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 28474,
        "avgItemsPerSecond": 10.535927512818711,
        "avgBatchDuration": 26113.666666666668,
        "minBatchDuration": 24815,
        "maxBatchDuration": 28474,
        "p50Duration": 25052,
        "p95Duration": 28474,
        "p99Duration": 28474
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 22890,
        "avgItemsPerSecond": 13.10615989515072,
        "avgBatchDuration": 22201.666666666668,
        "minBatchDuration": 20834,
        "maxBatchDuration": 22887,
        "p50Duration": 22884,
        "p95Duration": 22887,
        "p99Duration": 22887
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 27952,
        "avgItemsPerSecond": 10.732684602175159,
        "avgBatchDuration": 21568.333333333332,
        "minBatchDuration": 18289,
        "maxBatchDuration": 27826,
        "p50Duration": 18590,
        "p95Duration": 27826,
        "p99Duration": 27826
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 28473,
        "avgItemsPerSecond": 10.536297545042672,
        "avgBatchDuration": 26193.333333333332,
        "minBatchDuration": 25054,
        "maxBatchDuration": 28470,
        "p50Duration": 25056,
        "p95Duration": 28470,
        "p99Duration": 28470
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 29668,
        "avgItemsPerSecond": 10.111905082917621,
        "avgBatchDuration": 28195.666666666668,
        "minBatchDuration": 25936,
        "maxBatchDuration": 29562,
        "p50Duration": 29089,
        "p95Duration": 29562,
        "p99Duration": 29562
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:27:02.038Z",
    "end": "2025-12-15T15:27:31.797Z"
  }
}

Observations:

  • Throughput: 90.73 items/sec (+66% vs baseline)
  • Fairness index: 0.9931 (slightly degraded)
  • Processing time variance: Higher. One tenant (org-2:giomqjmqmqbcngusxqfo) finished in 22.9s while others took 28-30s. Low concurrency=2 paradoxically gave high throughput but with fairness cost. The system may be "batching up" work more efficiently but creating uneven distribution.

Test F2: Medium Concurrency (concurrency=5)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=3
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=5

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "Medium concurrency=5"
Results F2 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "Medium concurrency=5",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 58.25368400612742,
    "overallDuration": 46349,
    "fairnessIndex": 0.9998661349420435,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 46278,
        "avgItemsPerSecond": 6.482561908466226,
        "avgBatchDuration": 45090,
        "minBatchDuration": 43007,
        "maxBatchDuration": 46275,
        "p50Duration": 45988,
        "p95Duration": 46275,
        "p99Duration": 46275
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 45205,
        "avgItemsPerSecond": 6.63643402278509,
        "avgBatchDuration": 44818,
        "minBatchDuration": 44147,
        "maxBatchDuration": 45164,
        "p50Duration": 45143,
        "p95Duration": 45164,
        "p99Duration": 45164
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 45206,
        "avgItemsPerSecond": 6.636287218510818,
        "avgBatchDuration": 44442,
        "minBatchDuration": 43086,
        "maxBatchDuration": 45206,
        "p50Duration": 45034,
        "p95Duration": 45206,
        "p99Duration": 45206
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 45210,
        "avgItemsPerSecond": 6.635700066357001,
        "avgBatchDuration": 44481.666666666664,
        "minBatchDuration": 43090,
        "maxBatchDuration": 45210,
        "p50Duration": 45145,
        "p95Duration": 45210,
        "p99Duration": 45210
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 45209,
        "avgItemsPerSecond": 6.635846844654825,
        "avgBatchDuration": 45130.333333333336,
        "minBatchDuration": 44982,
        "maxBatchDuration": 45207,
        "p50Duration": 45202,
        "p95Duration": 45207,
        "p99Duration": 45207
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 46279,
        "avgItemsPerSecond": 6.482421832796733,
        "avgBatchDuration": 45474,
        "minBatchDuration": 44160,
        "maxBatchDuration": 46277,
        "p50Duration": 45985,
        "p95Duration": 46277,
        "p99Duration": 46277
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 45209,
        "avgItemsPerSecond": 6.635846844654825,
        "avgBatchDuration": 44499.333333333336,
        "minBatchDuration": 43086,
        "maxBatchDuration": 45206,
        "p50Duration": 45206,
        "p95Duration": 45206,
        "p99Duration": 45206
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 46278,
        "avgItemsPerSecond": 6.482561908466226,
        "avgBatchDuration": 45212,
        "minBatchDuration": 44153,
        "maxBatchDuration": 46276,
        "p50Duration": 45207,
        "p95Duration": 46276,
        "p99Duration": 46276
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 46262,
        "avgItemsPerSecond": 6.484803942760797,
        "avgBatchDuration": 44808,
        "minBatchDuration": 42006,
        "maxBatchDuration": 46209,
        "p50Duration": 46209,
        "p95Duration": 46209,
        "p99Duration": 46209
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:28:48.965Z",
    "end": "2025-12-15T15:29:35.314Z"
  }
}

Observations:

  • Throughput: 58.25 items/sec (+7% vs baseline)
  • Fairness index: 0.9999 (nearly perfect!)
  • Concurrency=5 gives best fairness but modest throughput. All tenants completed in 45-46s range (very tight clustering).

Test F3: Default Concurrency (concurrency=10)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=3
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "Default concurrency=10"
Results F3 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "Default concurrency=10",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 88.71073728479432,
    "overallDuration": 30436,
    "fairnessIndex": 0.9986319639223729,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 29265,
        "avgItemsPerSecond": 10.251153254741158,
        "avgBatchDuration": 22707.666666666668,
        "minBatchDuration": 12771,
        "maxBatchDuration": 29256,
        "p50Duration": 26096,
        "p95Duration": 29256,
        "p99Duration": 29256
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 30322,
        "avgItemsPerSecond": 9.893806477145308,
        "avgBatchDuration": 23069,
        "minBatchDuration": 12719,
        "maxBatchDuration": 30322,
        "p50Duration": 26166,
        "p95Duration": 30322,
        "p99Duration": 30322
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 29049,
        "avgItemsPerSecond": 10.327377878756584,
        "avgBatchDuration": 26282.333333333332,
        "minBatchDuration": 21766,
        "maxBatchDuration": 29041,
        "p50Duration": 28040,
        "p95Duration": 29041,
        "p99Duration": 29041
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 29051,
        "avgItemsPerSecond": 10.326666896148154,
        "avgBatchDuration": 22590.333333333332,
        "minBatchDuration": 11757,
        "maxBatchDuration": 29043,
        "p50Duration": 26971,
        "p95Duration": 29043,
        "p99Duration": 29043
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 30247,
        "avgItemsPerSecond": 9.918339008827322,
        "avgBatchDuration": 22704.333333333332,
        "minBatchDuration": 12811,
        "maxBatchDuration": 30217,
        "p50Duration": 25085,
        "p95Duration": 30217,
        "p99Duration": 30217
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 30216,
        "avgItemsPerSecond": 9.928514694201748,
        "avgBatchDuration": 23965.333333333332,
        "minBatchDuration": 12747,
        "maxBatchDuration": 30216,
        "p50Duration": 28933,
        "p95Duration": 30216,
        "p99Duration": 30216
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 29163,
        "avgItemsPerSecond": 10.287007509515483,
        "avgBatchDuration": 29106,
        "minBatchDuration": 29005,
        "maxBatchDuration": 29163,
        "p50Duration": 29150,
        "p95Duration": 29163,
        "p99Duration": 29163
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 26728,
        "avgItemsPerSecond": 11.224184375935348,
        "avgBatchDuration": 24337.666666666668,
        "minBatchDuration": 21607,
        "maxBatchDuration": 26726,
        "p50Duration": 24680,
        "p95Duration": 26726,
        "p99Duration": 26726
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 29268,
        "avgItemsPerSecond": 10.25010250102501,
        "avgBatchDuration": 28511.333333333332,
        "minBatchDuration": 27111,
        "maxBatchDuration": 29268,
        "p50Duration": 29155,
        "p95Duration": 29268,
        "p99Duration": 29268
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:31:05.764Z",
    "end": "2025-12-15T15:31:36.200Z"
  }
}

Observations:

  • Throughput: 88.71 items/sec (+63% vs baseline)
  • Fairness index: 0.9986 (very good)
  • Default concurrency=10 is solid. Good balance of throughput and fairness. Duration 30.4s.

Test F4: High Concurrency (concurrency=25)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=3
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=25

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "High concurrency=25"
Results F4 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "High concurrency=25",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 92.11873080859776,
    "overallDuration": 29310,
    "fairnessIndex": 0.9985800387045317,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 28196,
        "avgItemsPerSecond": 10.63980706483189,
        "avgBatchDuration": 21146.333333333332,
        "minBatchDuration": 9134,
        "maxBatchDuration": 28193,
        "p50Duration": 26112,
        "p95Duration": 28193,
        "p99Duration": 28193
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 26122,
        "avgItemsPerSecond": 11.484572391087971,
        "avgBatchDuration": 24917.333333333332,
        "minBatchDuration": 22512,
        "maxBatchDuration": 26122,
        "p50Duration": 26118,
        "p95Duration": 26122,
        "p99Duration": 26122
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 27157,
        "avgItemsPerSecond": 11.046875575358102,
        "avgBatchDuration": 20760.333333333332,
        "minBatchDuration": 17529,
        "maxBatchDuration": 27154,
        "p50Duration": 17598,
        "p95Duration": 27154,
        "p99Duration": 27154
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 29234,
        "avgItemsPerSecond": 10.262023671067935,
        "avgBatchDuration": 27852.666666666668,
        "minBatchDuration": 27155,
        "maxBatchDuration": 29232,
        "p50Duration": 27171,
        "p95Duration": 29232,
        "p99Duration": 29232
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 29230,
        "avgItemsPerSecond": 10.263427984946972,
        "avgBatchDuration": 28536,
        "minBatchDuration": 27154,
        "maxBatchDuration": 29230,
        "p50Duration": 29224,
        "p95Duration": 29230,
        "p99Duration": 29230
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 28199,
        "avgItemsPerSecond": 10.63867513032377,
        "avgBatchDuration": 28189.666666666668,
        "minBatchDuration": 28179,
        "maxBatchDuration": 28195,
        "p50Duration": 28195,
        "p95Duration": 28195,
        "p99Duration": 28195
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 29231,
        "avgItemsPerSecond": 10.26307687044576,
        "avgBatchDuration": 27848.333333333332,
        "minBatchDuration": 27149,
        "maxBatchDuration": 29231,
        "p50Duration": 27165,
        "p95Duration": 29231,
        "p99Duration": 29231
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 28194,
        "avgItemsPerSecond": 10.640561821664184,
        "avgBatchDuration": 27132.666666666668,
        "minBatchDuration": 26095,
        "maxBatchDuration": 28190,
        "p50Duration": 27113,
        "p95Duration": 28190,
        "p99Duration": 28190
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 29234,
        "avgItemsPerSecond": 10.262023671067935,
        "avgBatchDuration": 28871,
        "minBatchDuration": 28201,
        "maxBatchDuration": 29232,
        "p50Duration": 29180,
        "p95Duration": 29232,
        "p99Duration": 29232
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:32:57.803Z",
    "end": "2025-12-15T15:33:27.113Z"
  }
}

Observations:

  • Throughput: 92.12 items/sec (+69% vs baseline, best in F series)
  • Fairness index: 0.9986 (very good)
  • Resource contention?: Minimal. Duration 29.3s, only marginally better than concurrency=10 (30.4s). Diminishing returns above concurrency=10. Higher concurrency helps but gains are flattening.

Series G: Global Rate Limiter

Objective: Test global throughput caps across all consumers.

Theory:

  • Rate limiting provides predictable resource consumption
  • Should not affect fairness, only overall throughput

Test G1: Moderate Rate Limit (50 items/sec)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=3
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10
BATCH_QUEUE_GLOBAL_RATE_LIMIT=50

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "Rate limit 50/sec"
Results G1 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "Rate limit 50/sec",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 45.432364670447086,
    "overallDuration": 59429,
    "fairnessIndex": 0.9985621839167762,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 54093,
        "avgItemsPerSecond": 5.546004104043037,
        "avgBatchDuration": 54091,
        "minBatchDuration": 54089,
        "maxBatchDuration": 54093,
        "p50Duration": 54091,
        "p95Duration": 54093,
        "p99Duration": 54093
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 54109,
        "avgItemsPerSecond": 5.544364153837624,
        "avgBatchDuration": 53601,
        "minBatchDuration": 52695,
        "maxBatchDuration": 54109,
        "p50Duration": 53999,
        "p95Duration": 54109,
        "p99Duration": 54109
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 59343,
        "avgItemsPerSecond": 5.055356149840756,
        "avgBatchDuration": 57304.333333333336,
        "minBatchDuration": 55866,
        "maxBatchDuration": 59029,
        "p50Duration": 57018,
        "p95Duration": 59029,
        "p99Duration": 59029
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 58371,
        "avgItemsPerSecond": 5.139538469445443,
        "avgBatchDuration": 57164.333333333336,
        "minBatchDuration": 56262,
        "maxBatchDuration": 58093,
        "p50Duration": 57138,
        "p95Duration": 58093,
        "p99Duration": 58093
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 58285,
        "avgItemsPerSecond": 5.147121901003689,
        "avgBatchDuration": 55634.333333333336,
        "minBatchDuration": 50470,
        "maxBatchDuration": 58284,
        "p50Duration": 58149,
        "p95Duration": 58284,
        "p99Duration": 58284
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 55174,
        "avgItemsPerSecond": 5.437343676369304,
        "avgBatchDuration": 41686.333333333336,
        "minBatchDuration": 28166,
        "maxBatchDuration": 55157,
        "p50Duration": 41736,
        "p95Duration": 55157,
        "p99Duration": 55157
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 58284,
        "avgItemsPerSecond": 5.147210212065061,
        "avgBatchDuration": 57015.666666666664,
        "minBatchDuration": 54788,
        "maxBatchDuration": 58246,
        "p50Duration": 58013,
        "p95Duration": 58246,
        "p99Duration": 58246
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 59296,
        "avgItemsPerSecond": 5.059363194819212,
        "avgBatchDuration": 58258.666666666664,
        "minBatchDuration": 57226,
        "maxBatchDuration": 59291,
        "p50Duration": 58259,
        "p95Duration": 59291,
        "p99Duration": 59291
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 59408,
        "avgItemsPerSecond": 5.049824939402101,
        "avgBatchDuration": 58836.333333333336,
        "minBatchDuration": 58371,
        "maxBatchDuration": 59107,
        "p50Duration": 59031,
        "p95Duration": 59107,
        "p99Duration": 59107
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:35:48.593Z",
    "end": "2025-12-15T15:36:48.022Z"
  }
}

Observations:

  • Actual throughput: 45.43 items/sec (target: 50) - ~91% of limit
  • Fairness preserved?: Yes, 0.9986 (excellent)
  • Rate limiter is working correctly. Duration 59.4s shows throttling is effective. Some overhead explains why we don't hit exactly 50/sec.

Test G2: Higher Rate Limit (100 items/sec)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=3
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10
BATCH_QUEUE_GLOBAL_RATE_LIMIT=100

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "Rate limit 100/sec"
Results G2 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "Rate limit 100/sec",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 81.93487694595333,
    "overallDuration": 32953,
    "fairnessIndex": 0.9994851661042276,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 31984,
        "avgItemsPerSecond": 9.379689844922462,
        "avgBatchDuration": 30240.333333333332,
        "minBatchDuration": 28799,
        "maxBatchDuration": 31980,
        "p50Duration": 29942,
        "p95Duration": 31980,
        "p99Duration": 31980
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 31947,
        "avgItemsPerSecond": 9.3905531035778,
        "avgBatchDuration": 26446,
        "minBatchDuration": 23696,
        "maxBatchDuration": 31945,
        "p50Duration": 23697,
        "p95Duration": 31945,
        "p99Duration": 31945
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 32914,
        "avgItemsPerSecond": 9.114662453667133,
        "avgBatchDuration": 31870.666666666668,
        "minBatchDuration": 29821,
        "maxBatchDuration": 32912,
        "p50Duration": 32879,
        "p95Duration": 32912,
        "p99Duration": 32912
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 30770,
        "avgItemsPerSecond": 9.749756256093598,
        "avgBatchDuration": 26862,
        "minBatchDuration": 22381,
        "maxBatchDuration": 30768,
        "p50Duration": 27437,
        "p95Duration": 30768,
        "p99Duration": 30768
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 30770,
        "avgItemsPerSecond": 9.749756256093598,
        "avgBatchDuration": 29516.666666666668,
        "minBatchDuration": 27853,
        "maxBatchDuration": 30769,
        "p50Duration": 29928,
        "p95Duration": 30769,
        "p99Duration": 30769
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 30771,
        "avgItemsPerSecond": 9.749439407234084,
        "avgBatchDuration": 28237.333333333332,
        "minBatchDuration": 25781,
        "maxBatchDuration": 30769,
        "p50Duration": 28162,
        "p95Duration": 30769,
        "p99Duration": 30769
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 31890,
        "avgItemsPerSecond": 9.40733772342427,
        "avgBatchDuration": 23515.666666666668,
        "minBatchDuration": 18184,
        "maxBatchDuration": 31888,
        "p50Duration": 20475,
        "p95Duration": 31888,
        "p99Duration": 31888
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 30956,
        "avgItemsPerSecond": 9.691174570357928,
        "avgBatchDuration": 28886,
        "minBatchDuration": 25781,
        "maxBatchDuration": 30947,
        "p50Duration": 29930,
        "p95Duration": 30947,
        "p99Duration": 30947
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 31976,
        "avgItemsPerSecond": 9.382036527395547,
        "avgBatchDuration": 29608.666666666668,
        "minBatchDuration": 26943,
        "maxBatchDuration": 31974,
        "p50Duration": 29909,
        "p95Duration": 31974,
        "p99Duration": 31974
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:37:49.150Z",
    "end": "2025-12-15T15:38:22.103Z"
  }
}

Observations:

  • Actual throughput: 81.93 items/sec (limit was 100)
  • Is this limit binding or above natural throughput?: Above natural throughput. Without rate limiting (E2 with same settings), throughput was 93.57/sec. The 100/sec limit is barely constraining. Use rate limits below ~90/sec to have meaningful impact.

Test G3: Low Rate Limit (20 items/sec)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=3
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10
BATCH_QUEUE_GLOBAL_RATE_LIMIT=20

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "Rate limit 20/sec"
Results G3 (click to expand)
{
  "scenario": "fairness-9t",
  "description": "Rate limit 20/sec",
  "config": {
    "tenantCount": 9,
    "batchSize": 100,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 2700,
    "totalBatches": 27,
    "overallThroughput": 21.692671090900326,
    "overallDuration": 124466,
    "fairnessIndex": 0.997793763355806,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 108861,
        "avgItemsPerSecond": 2.755807865075647,
        "avgBatchDuration": 99844,
        "minBatchDuration": 93281,
        "maxBatchDuration": 108850,
        "p50Duration": 97401,
        "p95Duration": 108850,
        "p99Duration": 108850
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 111633,
        "avgItemsPerSecond": 2.687377388406654,
        "avgBatchDuration": 85438,
        "minBatchDuration": 71861,
        "maxBatchDuration": 111516,
        "p50Duration": 72937,
        "p95Duration": 111516,
        "p99Duration": 111516
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 123298,
        "avgItemsPerSecond": 2.433129491151519,
        "avgBatchDuration": 96355,
        "minBatchDuration": 43494,
        "maxBatchDuration": 123297,
        "p50Duration": 122274,
        "p95Duration": 123297,
        "p99Duration": 123297
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 121568,
        "avgItemsPerSecond": 2.4677546722821795,
        "avgBatchDuration": 92002,
        "minBatchDuration": 53253,
        "maxBatchDuration": 121568,
        "p50Duration": 101185,
        "p95Duration": 121568,
        "p99Duration": 121568
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 123851,
        "avgItemsPerSecond": 2.422265464146434,
        "avgBatchDuration": 118623.66666666667,
        "minBatchDuration": 111599,
        "maxBatchDuration": 123784,
        "p50Duration": 120488,
        "p95Duration": 123784,
        "p99Duration": 123784
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 120270,
        "avgItemsPerSecond": 2.4943876278373662,
        "avgBatchDuration": 113171.33333333333,
        "minBatchDuration": 109360,
        "maxBatchDuration": 120269,
        "p50Duration": 109885,
        "p95Duration": 120269,
        "p99Duration": 120269
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 123169,
        "avgItemsPerSecond": 2.4356778085394866,
        "avgBatchDuration": 118514,
        "minBatchDuration": 113405,
        "maxBatchDuration": 123164,
        "p50Duration": 118973,
        "p95Duration": 123164,
        "p99Duration": 123164
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 124246,
        "avgItemsPerSecond": 2.414564653992885,
        "avgBatchDuration": 119631.33333333333,
        "minBatchDuration": 114504,
        "maxBatchDuration": 124241,
        "p50Duration": 120149,
        "p95Duration": 124241,
        "p99Duration": 124241
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 300,
        "totalBatches": 3,
        "totalDuration": 122197,
        "avgItemsPerSecond": 2.4550520880218007,
        "avgBatchDuration": 120645.33333333333,
        "minBatchDuration": 118022,
        "maxBatchDuration": 122197,
        "p50Duration": 121717,
        "p95Duration": 122197,
        "p99Duration": 122197
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:39:42.414Z",
    "end": "2025-12-15T15:41:46.880Z"
  }
}

Observations:

  • Actual throughput: 21.69 items/sec (target: 20) - slightly above limit
  • Fairness index: 0.9978 (good but slight variance)
  • Duration 124.5s (2+ minutes) - shows throttling working hard. Strict rate limiting works but creates fairness variance - some tenants saw 72-124s batch durations (wide spread).

Series H: Asymmetric Load Testing

Objective: Test fairness when tenants have dramatically different workloads.

Test H1: Asymmetric with Default Config

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=3
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress asymmetric --small-size 50 --large-size 800 --batch-count 3 -d "Asymmetric baseline"
Results H1 (click to expand)
{
  "scenario": "asymmetric-combined",
  "config": {
    "tenantCount": 9,
    "batchSize": 0,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 10350,
    "totalBatches": 27,
    "overallThroughput": 67.60816590394816,
    "overallDuration": 107281,
    "fairnessIndex": 0.9978993490004432,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 150,
        "totalBatches": 3,
        "totalDuration": 16361,
        "avgItemsPerSecond": 9.168143756494102,
        "avgBatchDuration": 14312.666666666666,
        "minBatchDuration": 12271,
        "maxBatchDuration": 16360,
        "p50Duration": 14307,
        "p95Duration": 16360,
        "p99Duration": 16360
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 150,
        "totalBatches": 3,
        "totalDuration": 16361,
        "avgItemsPerSecond": 9.168143756494102,
        "avgBatchDuration": 13968.333333333334,
        "minBatchDuration": 11240,
        "maxBatchDuration": 16358,
        "p50Duration": 14307,
        "p95Duration": 16358,
        "p99Duration": 16358
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 150,
        "totalBatches": 3,
        "totalDuration": 16361,
        "avgItemsPerSecond": 9.168143756494102,
        "avgBatchDuration": 12117.333333333334,
        "minBatchDuration": 8977,
        "maxBatchDuration": 16359,
        "p50Duration": 11016,
        "p95Duration": 16359,
        "p99Duration": 16359
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 150,
        "totalBatches": 3,
        "totalDuration": 13966,
        "avgItemsPerSecond": 10.740369468709723,
        "avgBatchDuration": 13624.333333333334,
        "minBatchDuration": 12945,
        "maxBatchDuration": 13964,
        "p50Duration": 13964,
        "p95Duration": 13964,
        "p99Duration": 13964
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 150,
        "totalBatches": 3,
        "totalDuration": 16116,
        "avgItemsPerSecond": 9.307520476545047,
        "avgBatchDuration": 14416.666666666666,
        "minBatchDuration": 11021,
        "maxBatchDuration": 16116,
        "p50Duration": 16113,
        "p95Duration": 16116,
        "p99Duration": 16116
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 2400,
        "totalBatches": 3,
        "totalDuration": 107273,
        "avgItemsPerSecond": 22.37282447586998,
        "avgBatchDuration": 106213,
        "minBatchDuration": 105126,
        "maxBatchDuration": 107273,
        "p50Duration": 106240,
        "p95Duration": 107273,
        "p99Duration": 107273
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 2400,
        "totalBatches": 3,
        "totalDuration": 106584,
        "avgItemsPerSecond": 22.51745102454402,
        "avgBatchDuration": 105934,
        "minBatchDuration": 105097,
        "maxBatchDuration": 106574,
        "p50Duration": 106131,
        "p95Duration": 106574,
        "p99Duration": 106574
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 2400,
        "totalBatches": 3,
        "totalDuration": 107116,
        "avgItemsPerSecond": 22.40561634116285,
        "avgBatchDuration": 106374.33333333333,
        "minBatchDuration": 105308,
        "maxBatchDuration": 107100,
        "p50Duration": 106715,
        "p95Duration": 107100,
        "p99Duration": 107100
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 2400,
        "totalBatches": 3,
        "totalDuration": 107046,
        "avgItemsPerSecond": 22.42026792220167,
        "avgBatchDuration": 104503.66666666667,
        "minBatchDuration": 102401,
        "maxBatchDuration": 106989,
        "p50Duration": 104121,
        "p95Duration": 106989,
        "p99Duration": 106989
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:44:50.480Z",
    "end": "2025-12-15T15:46:37.770Z"
  }
}

Observations:

  • Small batch completion times: 14-17s (150 items × 5 tenants)
  • Large batch completion times: 105-107s (2400 items × 4 tenants)
  • Were small batches starved?: NO! Small batches finished ~6x faster than large batches, exactly as expected. DRR correctly prioritizes smaller workloads and doesn't let large batches monopolize. Fairness index 0.9979 is excellent given asymmetric load.

Test H2: Asymmetric with Low Quantum (better fairness?)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=2
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=3
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress asymmetric --small-size 50 --large-size 800 --batch-count 3 -d "Asymmetric low quantum"
Results H2 (click to expand)
{
  "scenario": "asymmetric-combined",
  "config": {
    "tenantCount": 9,
    "batchSize": 0,
    "batchCount": 3
  },
  "results": {
    "totalItemsProcessed": 10350,
    "totalBatches": 27,
    "overallThroughput": 58.418499446364066,
    "overallDuration": 127189,
    "fairnessIndex": 0.9991864215649569,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 150,
        "totalBatches": 3,
        "totalDuration": 16648,
        "avgItemsPerSecond": 9.01009130225853,
        "avgBatchDuration": 15360,
        "minBatchDuration": 14080,
        "maxBatchDuration": 16647,
        "p50Duration": 15353,
        "p95Duration": 16647,
        "p99Duration": 16647
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 150,
        "totalBatches": 3,
        "totalDuration": 18118,
        "avgItemsPerSecond": 8.279059498840931,
        "avgBatchDuration": 16403.333333333332,
        "minBatchDuration": 15020,
        "maxBatchDuration": 18115,
        "p50Duration": 16075,
        "p95Duration": 18115,
        "p99Duration": 18115
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 150,
        "totalBatches": 3,
        "totalDuration": 16307,
        "avgItemsPerSecond": 9.198503710063163,
        "avgBatchDuration": 15531.333333333334,
        "minBatchDuration": 14206,
        "maxBatchDuration": 16305,
        "p50Duration": 16083,
        "p95Duration": 16305,
        "p99Duration": 16305
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 150,
        "totalBatches": 3,
        "totalDuration": 16646,
        "avgItemsPerSecond": 9.011173855580921,
        "avgBatchDuration": 14090,
        "minBatchDuration": 11256,
        "maxBatchDuration": 16645,
        "p50Duration": 14369,
        "p95Duration": 16645,
        "p99Duration": 16645
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 150,
        "totalBatches": 3,
        "totalDuration": 17696,
        "avgItemsPerSecond": 8.476491862567812,
        "avgBatchDuration": 16322,
        "minBatchDuration": 14600,
        "maxBatchDuration": 17694,
        "p50Duration": 16672,
        "p95Duration": 17694,
        "p99Duration": 17694
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 2400,
        "totalBatches": 3,
        "totalDuration": 125841,
        "avgItemsPerSecond": 19.07168569861969,
        "avgBatchDuration": 125238.66666666667,
        "minBatchDuration": 124354,
        "maxBatchDuration": 125800,
        "p50Duration": 125562,
        "p95Duration": 125800,
        "p99Duration": 125800
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 2400,
        "totalBatches": 3,
        "totalDuration": 127140,
        "avgItemsPerSecond": 18.876828692779615,
        "avgBatchDuration": 126407.66666666667,
        "minBatchDuration": 125398,
        "maxBatchDuration": 127140,
        "p50Duration": 126685,
        "p95Duration": 127140,
        "p99Duration": 127140
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 2400,
        "totalBatches": 3,
        "totalDuration": 125854,
        "avgItemsPerSecond": 19.069715702321737,
        "avgBatchDuration": 125322.66666666667,
        "minBatchDuration": 124426,
        "maxBatchDuration": 125849,
        "p50Duration": 125693,
        "p95Duration": 125849,
        "p99Duration": 125849
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 2400,
        "totalBatches": 3,
        "totalDuration": 126467,
        "avgItemsPerSecond": 18.977282611274088,
        "avgBatchDuration": 124552.33333333333,
        "minBatchDuration": 123402,
        "maxBatchDuration": 126202,
        "p50Duration": 124053,
        "p95Duration": 126202,
        "p99Duration": 126202
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:50:21.351Z",
    "end": "2025-12-15T15:52:28.745Z"
  }
}

Observations:

  • Small batch completion times: 14-18s (slightly slower than H1's 14-17s)
  • Large batch completion times: 123-127s (slower than H1's 105-107s)
  • Improvement over H1?: Mixed. Fairness improved (0.9992 vs 0.9979) but overall throughput dropped (58.42 vs 67.61 items/sec). Low quantum=2 improves fairness but at throughput cost. For asymmetric loads, default quantum=5 is better balance.

Test H3: Burst Test (All Tenants Simultaneous)

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=3
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress burst --batch-size 500 -d "Burst test baseline"
Results H3 (click to expand)
{
  "scenario": "burst-9t-500i",
  "config": {
    "tenantCount": 9,
    "batchSize": 500,
    "batchCount": 1
  },
  "results": {
    "totalItemsProcessed": 4500,
    "totalBatches": 9,
    "overallThroughput": 68.83786388459714,
    "overallDuration": 65371,
    "fairnessIndex": 0.9999479889573228,
    "perTenant": [
      {
        "tenantId": "org-1:proj_czimyjnqtbskjmvimpwh",
        "totalItems": 500,
        "totalBatches": 1,
        "totalDuration": 64508,
        "avgItemsPerSecond": 7.750976623054505,
        "avgBatchDuration": 64508,
        "minBatchDuration": 64508,
        "maxBatchDuration": 64508,
        "p50Duration": 64508,
        "p95Duration": 64508,
        "p99Duration": 64508
      },
      {
        "tenantId": "org-1:proj_lvfvbfatttkmiocyaojf",
        "totalItems": 500,
        "totalBatches": 1,
        "totalDuration": 64504,
        "avgItemsPerSecond": 7.751457273967506,
        "avgBatchDuration": 64504,
        "minBatchDuration": 64504,
        "maxBatchDuration": 64504,
        "p50Duration": 64504,
        "p95Duration": 64504,
        "p99Duration": 64504
      },
      {
        "tenantId": "org-1:proj_pogdfmagzpxpjggpwrlj",
        "totalItems": 500,
        "totalBatches": 1,
        "totalDuration": 64404,
        "avgItemsPerSecond": 7.7634929507484,
        "avgBatchDuration": 64404,
        "minBatchDuration": 64404,
        "maxBatchDuration": 64404,
        "p50Duration": 64404,
        "p95Duration": 64404,
        "p99Duration": 64404
      },
      {
        "tenantId": "org-2:proj_prxnkqpzdapktltqmxhb",
        "totalItems": 500,
        "totalBatches": 1,
        "totalDuration": 64504,
        "avgItemsPerSecond": 7.751457273967506,
        "avgBatchDuration": 64504,
        "minBatchDuration": 64504,
        "maxBatchDuration": 64504,
        "p50Duration": 64504,
        "p95Duration": 64504,
        "p99Duration": 64504
      },
      {
        "tenantId": "org-2:proj_zgysghtkiezoakvjscin",
        "totalItems": 500,
        "totalBatches": 1,
        "totalDuration": 64507,
        "avgItemsPerSecond": 7.7510967801943975,
        "avgBatchDuration": 64507,
        "minBatchDuration": 64507,
        "maxBatchDuration": 64507,
        "p50Duration": 64507,
        "p95Duration": 64507,
        "p99Duration": 64507
      },
      {
        "tenantId": "org-2:proj_giomqjmqmqbcngusxqfo",
        "totalItems": 500,
        "totalBatches": 1,
        "totalDuration": 64391,
        "avgItemsPerSecond": 7.7650603345187985,
        "avgBatchDuration": 64391,
        "minBatchDuration": 64391,
        "maxBatchDuration": 64391,
        "p50Duration": 64391,
        "p95Duration": 64391,
        "p99Duration": 64391
      },
      {
        "tenantId": "org-3:proj_qopvqsgghjbtrrfcwlqs",
        "totalItems": 500,
        "totalBatches": 1,
        "totalDuration": 63375,
        "avgItemsPerSecond": 7.889546351084813,
        "avgBatchDuration": 63375,
        "minBatchDuration": 63375,
        "maxBatchDuration": 63375,
        "p50Duration": 63375,
        "p95Duration": 63375,
        "p99Duration": 63375
      },
      {
        "tenantId": "org-3:proj_efaelbvnogkhjnrdfsmi",
        "totalItems": 500,
        "totalBatches": 1,
        "totalDuration": 64497,
        "avgItemsPerSecond": 7.752298556522009,
        "avgBatchDuration": 64497,
        "minBatchDuration": 64497,
        "maxBatchDuration": 64497,
        "p50Duration": 64497,
        "p95Duration": 64497,
        "p99Duration": 64497
      },
      {
        "tenantId": "org-3:proj_ytivyoceocenyxuprmga",
        "totalItems": 500,
        "totalBatches": 1,
        "totalDuration": 65316,
        "avgItemsPerSecond": 7.655092167309695,
        "avgBatchDuration": 65316,
        "minBatchDuration": 65316,
        "maxBatchDuration": 65316,
        "p50Duration": 65316,
        "p95Duration": 65316,
        "p99Duration": 65316
      }
    ]
  },
  "timestamps": {
    "start": "2025-12-15T15:53:49.834Z",
    "end": "2025-12-15T15:54:55.205Z"
  }
}

Observations:

  • Fairness under burst: 0.9999 (nearly perfect!)
  • Throughput: 68.84 items/sec
  • Any tenant significantly slower?: All tenants finished within 2s of each other (63-65s range). Excellent burst handling! Even under simultaneous 4500-item burst from 9 tenants, DRR maintained perfect fairness. This is the ideal scenario for DRR.

Series I: Combined/Optimized Configurations

Objective: Test promising combinations based on earlier results.

Test I1: Throughput-Optimized

Based on Series B-F results, configure for maximum throughput.

Configuration (adjust based on findings):

BATCH_QUEUE_DRR_QUANTUM=10
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=5
BATCH_QUEUE_CONSUMER_INTERVAL_MS=50
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=25

Command:

pnpm stress fairness --batch-size 100 --batch-count 5 --tenants all -d "Throughput optimized"
Results I1 (click to expand)
// Paste results here

Observations:

  • Throughput: _ items/sec
  • Fairness tradeoff: _

Test I2: Fairness-Optimized

Based on Series B-F results, configure for best fairness.

Configuration (adjust based on findings):

BATCH_QUEUE_DRR_QUANTUM=2
BATCH_QUEUE_MAX_DEFICIT=25
BATCH_QUEUE_CONSUMER_COUNT=3
BATCH_QUEUE_CONSUMER_INTERVAL_MS=50
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=5

Command:

pnpm stress fairness --batch-size 100 --batch-count 5 --tenants all -d "Fairness optimized"
Results I2 (click to expand)
// Paste results here

Observations:

  • Fairness index: _
  • Throughput cost: _

Test I3: Balanced Configuration

Best balance of throughput and fairness.

Configuration (adjust based on findings):

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=3
BATCH_QUEUE_CONSUMER_INTERVAL_MS=50
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10

Command:

pnpm stress fairness --batch-size 100 --batch-count 5 --tenants all -d "Balanced configuration"
Results I3 (click to expand)
// Paste results here

Observations:

  • Throughput: _ items/sec
  • Fairness index: _
  • Recommended for production?: _

Per-Org Concurrency Testing (Optional Series J)

If time permits, test different concurrency limits per organization by updating the database.

Setting Per-Org Concurrency

-- Set org-1 to high concurrency (50)
UPDATE "Organization"
SET "batchQueueConcurrencyConfig" = '{"default": 50}'
WHERE slug = 'org-1';

-- Set org-2 to medium concurrency (10)
UPDATE "Organization"
SET "batchQueueConcurrencyConfig" = '{"default": 10}'
WHERE slug = 'org-2';

-- Set org-3 to low concurrency (2)
UPDATE "Organization"
SET "batchQueueConcurrencyConfig" = '{"default": 2}'
WHERE slug = 'org-3';

Test J1: Mixed Org Concurrency Limits

Configuration:

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=50
BATCH_QUEUE_CONSUMER_COUNT=3
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10  # fallback

Command:

pnpm stress fairness --batch-size 100 --batch-count 3 --tenants all -d "Mixed org concurrency"
Results J1 (click to expand)
// Paste results here

Observations:

  • Org-1 (high concurrency) throughput: _
  • Org-2 (medium concurrency) throughput: _
  • Org-3 (low concurrency) throughput: _
  • Does DRR still maintain fairness?: _

Results Summary Table

Test Config Summary Throughput (items/sec) Fairness Index Notes
A1 Baseline 54.52 0.9999 Reference point
A2 Throughput baseline 97.48 (peak @ 500) 1.0000 Single tenant max
B1 quantum=1 66.09 0.9997 +21% vs baseline
B2 quantum=10 64.69 0.9998 +18%
B3 quantum=25 84.36 0.9999 Best B series
B4 quantum=50 51.98 0.9997 Too high, hurts perf
C1 maxDeficit=10 52.51 0.9998 Limited catch-up
C2 maxDeficit=25 66.33 0.9992 +22%
C3 maxDeficit=100 73.74 0.9989 Best C, slight fairness cost
D1 consumers=1 41.33 0.9997 Bottleneck
D2 consumers=3 57.55 0.9992 1.39x vs D1
D3 consumers=5 63.80 0.9999 Good balance
D4 consumers=10 114.94 0.9888 Best throughput, fairness cost
E1 interval=20ms 70.23 0.9979 Contention overhead
E2 interval=50ms 93.57 0.9994 Best E series
E3 interval=100ms 86.52 0.9997 Good default
E4 interval=250ms 47.46 0.9994 Too slow
F1 concurrency=2 90.73 0.9931 High but unfair
F2 concurrency=5 58.25 0.9999 Best fairness
F3 concurrency=10 88.71 0.9986 Good balance
F4 concurrency=25 92.12 0.9986 Best F series
F5 concurrency=50 not tested not tested
G1 rateLimit=50 45.43 0.9986 Effective throttle
G2 rateLimit=100 81.93 0.9995 Not binding
G3 rateLimit=20 21.69 0.9978 Strict throttle
H1 asymmetric baseline 67.61 0.9979 Small batches not starved
H2 asymmetric low quantum 58.42 0.9992 Better fairness, lower throughput
H3 burst test 68.84 0.9999 Perfect burst fairness
I1 throughput optimized pending pending
I2 fairness optimized pending pending
I3 balanced pending pending

Recommended Execution Order

  1. Series A (Baseline) - Establish reference point
  2. Series B (DRR Quantum) - Understand core fairness mechanism
  3. Series C (Max Deficit) - Understand starvation prevention
  4. Series D (Consumer Count) - Find optimal parallelism
  5. Series E (Consumer Interval) - Find optimal polling frequency
  6. Series F (Concurrency) - Find optimal per-env limits
  7. Series G (Global Rate Limit) - Test throttling mechanism
  8. Series H (Asymmetric) - Validate fairness under realistic conditions
  9. Series I (Combined) - Test optimized configurations

Between Tests

After each configuration change:

  1. Restart the webapp to pick up new env vars
  2. Wait ~5 seconds for BatchQueue to initialize
  3. Consider clearing Redis state between tests if needed: redis-cli FLUSHDB

Key Metrics to Watch

  1. Throughput (overallThroughput) - Higher is better, all else equal
  2. Fairness Index (fairnessIndex) - Closer to 1.0 is better
  3. Per-Tenant Variance - Look at min/max batch durations across tenants
  4. P95/P99 Latencies - Watch for tail latencies indicating starvation

Notes and Observations

Key Findings from Series A-H

1. DRR Fairness is Excellent

  • Fairness Index consistently 0.99+ across all tests
  • Burst scenario (H3) achieved 0.9999 fairness with 9 tenants competing simultaneously
  • Asymmetric load (H1) showed small batches complete quickly without being starved by large batches

2. Throughput vs Fairness Tradeoffs

Configuration Effect on Throughput Effect on Fairness
Higher quantum (25) ↑ Significant → Neutral
Higher quantum (50) ↓ Hurts → Neutral
Higher maxDeficit ↑ Moderate ↓ Slight
More consumers ↑↑ Major ↓ Moderate (at 10)
Faster polling (50ms) ↑ Best → Neutral
Higher concurrency ↑ Moderate → Neutral

3. Recommended Default Configuration

Based on test results, the optimal balanced configuration is:

BATCH_QUEUE_DRR_QUANTUM=25          # Sweet spot from B series
BATCH_QUEUE_MAX_DEFICIT=50          # Default is fine (100 gains throughput but costs fairness)
BATCH_QUEUE_CONSUMER_COUNT=3        # Good balance (10 is faster but less fair)
BATCH_QUEUE_CONSUMER_INTERVAL_MS=50 # Best from E series
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=10  # Good balance from F series

Expected performance: ~90-100 items/sec with 0.999+ fairness

4. Configuration Recommendations by Use Case

High-throughput priority (fairness acceptable at 0.98+):

BATCH_QUEUE_DRR_QUANTUM=25
BATCH_QUEUE_MAX_DEFICIT=100
BATCH_QUEUE_CONSUMER_COUNT=10
BATCH_QUEUE_CONSUMER_INTERVAL_MS=50
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=25

Strict fairness priority (throughput can be lower):

BATCH_QUEUE_DRR_QUANTUM=5
BATCH_QUEUE_MAX_DEFICIT=25
BATCH_QUEUE_CONSUMER_COUNT=3
BATCH_QUEUE_CONSUMER_INTERVAL_MS=100
BATCH_CONCURRENCY_DEFAULT_CONCURRENCY=5

5. Surprising Results

  1. quantum=1 outperformed quantum=10: Lower quantum didn't add expected overhead. May be due to better slot utilization.

  2. quantum=50 was worst: Too much time between tenant switches caused overall slowdown.

  3. concurrency=2 had high throughput but poor fairness: Some tenants finished much faster than others.

  4. 20ms polling was worse than 50ms: Too-fast polling created contention.

6. Rate Limiter Behavior

  • Rate limiter effectively caps throughput
  • At 50/sec limit, achieved ~45/sec (91% efficiency)
  • At 20/sec limit, achieved ~22/sec (108% - slight overshoot)
  • Rate limiting preserved fairness well (0.997-0.999)

7. Asymmetric Load Handling

  • Excellent! Small batches (150 items) completed in 14-17s
  • Large batches (2400 items) completed in 105-127s
  • DRR prevented large batches from starving small ones
  • Lower quantum (2) improved fairness but hurt overall throughput by ~13%

Scaling Observations

  • Single consumer: ~41 items/sec
  • 3 consumers: ~58 items/sec (1.4x)
  • 5 consumers: ~64 items/sec (1.5x)
  • 10 consumers: ~115 items/sec (2.8x)

Diminishing returns start around 5 consumers, with fairness degradation at 10.

Production Recommendations

  1. Start with defaults - They're well-tuned for most cases
  2. Consider quantum=25 for throughput boost without fairness cost
  3. Use 3-5 consumers for good parallelism without contention
  4. 50ms polling is optimal for most workloads
  5. Monitor fairness index in production metrics
  6. Use global rate limiter if you need to cap resource usage

Document created: $(date) Last updated:

X Tutup