9x

more concurrent test-takers held without errors

EdTech case study

Rebuilding an assessment engine that buckled at exam time

An online assessment platform that crashed under exam-day load got a queue-backed rebuild and a replayable audit trail.

Client
Brightpath LMS
Vertical
EdTech
Role
Full rebuild of the assessment service, plus reporting
Year
2024

How it ran

From brief to outcome.

  1. 01

    Brief

    Exams were the one time the platform had to hold, and the one time it didn't. Fix load, stop losing answers, and make scores defensible.

  2. 02

    Approach

    Load-test against real exam traffic first. Split submission from reporting. Make every answer change an event we can replay.

  3. 03

    Build

    Queue-backed submissions, an event log for answers, and a worker pool for grading, shipped behind a flag and rolled out to one school at a time.

  4. 04

    Launch

    Cut over during a quiet week, watched two full exam windows closely, then opened it to every cohort.

  5. 05

    Outcome

    Exam windows stopped generating incidents, grading finished in minutes, and disputed scores could finally be explained from the record.

What changed

Before, and after.

Concurrent test-takers before errors
Before~1,200
After~11,000
Grading turnaround
BeforeOvernight
AfterUnder 5 min
Lost or timed-out submissions per exam window
BeforeDozens
AfterZero recorded

The work

The problem, and how we took it on.

The challenge

Brightpath ran fine on a normal teaching day and fell over the moment a whole cohort sat an exam at once. Submissions timed out, a few answers were lost, and support spent every exam window fielding angry emails. The grading job ran overnight and nobody could explain a disputed score after the fact.

Our approach

  • Reproduced the exam-day spike on a copy of production before touching code, so we were fixing the real bottleneck and not a guess.
  • Moved submissions onto a durable queue, so a slow database write could never drop a student's answer again.
  • Separated the read-heavy reporting path from the write-heavy submission path, so dashboards stopped competing with live exams.
  • Wrote an append-only event log for every answer change, which became the audit trail teachers needed for disputes.

What we built

  • A queue-backed submission service that accepts answers fast and processes them in order.
  • An event-sourced record of every answer, attempt and score change, replayable for any dispute.
  • A grading worker pool that scales with the queue instead of running one big nightly job.
  • Live capacity dashboards so staff can see headroom before an exam, not after it fails.

The outcome

Exam day went from the team's worst day to an ordinary one. The platform now holds a full institution sitting at once, grading lands in minutes instead of the next morning, and when a parent questions a mark, the school can replay exactly what happened. None of the firefighting that used to define exam weeks is left.

Built with

The stack on this project.

TypeScriptNode.jsPostgreSQLRedisKubernetesAWS

Where this fits

The services and industry behind it.

Straight answers

Questions about this build.

Did students lose work during the migration?

No. We ran the new submission path alongside the old one behind a flag and rolled it out one school at a time, so there was always a working fallback. The cutover happened in a quiet week with no scheduled exams.

What made the audit trail possible?

Every answer change is now stored as an event rather than overwriting a single row. That lets the school replay an attempt step by step, which is what they needed to resolve disputed scores.

Have a problem like Brightpath LMS’s?

Tell us what's slowing your product down. We reply to every serious enquiry within one business day.