Skip to solution
mediumSystem Design

What is a message queue and why use one?

276 views
01

Understand the problem

Explain message queues.

message-queue
02

Attempt it yourself

Sketch your approach before reading the solution — that's what interviews test.

Nudge consolestandby

Stuck? Beam a request up — the console returns a conceptual nudge that guides your logic without spoiling the implementation.

03

Study the solution

What Is a Message Queue, and Why Use One?

Target Audience: Junior & Senior Software Engineers preparing for System Design Interviews — no prior system design knowledge assumed. Difficulty: Easy to Medium

How to read this doc: Every concept is explained in plain language first. Right after, you'll see

Solution ready — 2 min read

Classified // press E to declassify

04

Read the code

Message queue with visibility timeout (at-least-once redelivery)
Run Playground
class MessageQueue {
  constructor() {
    this.messages = [];
  }

  enqueue(id, body, now) {
    this.messages.push({ id, body, visibleAt: now });
  }

  dequeue(now, visibilityTimeout) {
    for (const msg of this.messages) {
      if (msg.visibleAt <= now) {
        msg.visibleAt = now + visibilityTimeout;
        return [msg.id, msg.body];
      }
    }
    return null;
  }

  ack(id) {
    this.messages = this.messages.filter((m) => m.id !== id);
  }
}

function printResult(result) {
  if (result === null) {
    console.log('None');
  } else {
    console.log(`('${result[0]}', '${result[1]}')`);
  }
}

const queue = new MessageQueue();
queue.enqueue('msg1', 'process order #1', 0);
queue.enqueue('msg2', 'process order #2', 0);

process.stdout.write('dequeue at t=1: ');
printResult(queue.dequeue(1, 10));

process.stdout.write('dequeue at t=2: ');
printResult(queue.dequeue(2, 10));
queue.ack('msg2');

process.stdout.write('dequeue at t=8 (msg1 still hidden): ');
printResult(queue.dequeue(8, 10));

process.stdout.write('dequeue at t=15 (msg1 visibility expired, redelivered): ');
printResult(queue.dequeue(15, 10));
queue.ack('msg1');

process.stdout.write('dequeue at t=20 (queue empty): ');
printResult(queue.dequeue(20, 10));
05

Join the discussion

Discussion (0)

Sign in to join the discussion.

No responses yet. Be the first to share what you think.

Transmission complete // awaiting log

KEEP THE
STREAK ALIVE.

Dossier 38 of 99 decoded in the System Design track. One more won't hurt.

Back to track