Q18: Implement a Time and Size Batch Request Scheduler

Build a batcher that accumulates incoming items and flushes them to a processing handler whenever maximum batch size is reached OR maximum delay time elapses.

Batch Request Scheduler
class BatchScheduler {
  constructor(batchHandler, maxSize = 5, maxDelay = 100) {
    this.handler = batchHandler;
    this.maxSize = maxSize;
    this.maxDelay = maxDelay;
    this.batch = [];
    this.timer = null;
  }

  add(item) {
    this.batch.push(item);
    if (this.batch.length >= this.maxSize) {
      this.flush();
    } else if (!this.timer) {
      this.timer = setTimeout(() => this.flush(), this.maxDelay);
    }
  }

  flush() {
    if (this.timer) clearTimeout(this.timer);
    this.timer = null;
    if (this.batch.length > 0) {
      const itemsToProcess = [...this.batch];
      this.batch = [];
      this.handler(itemsToProcess);
    }
  }
}
💡 Reaching maxSize triggers an immediate flush; otherwise a timer schedules a flush after maxDelay.
Key Takeaways
  • Dual trigger batching: flushes immediately on max size or automatically on timer expiration.
  • Optimizes network requests by combining multiple individual calls into single batch payload calls.
Knowledge Check

Why is the timer cleared inside flush() during max size execution triggers?