22. Design a Job Scheduler
Design a Job Scheduler
Methods
1) void addMachine(String machineId, String capabilities[])
machineId will always be unique and non-blank.
capabilities list of unique and non blank tokens, e.g.
- pdf thumbnail creator
- plain text compression
- image compression
- video thumbnail generation
- save file as chunks to file storage
- find duplicate chunk
- audio extraction
- speech to text conversion
- capabilities are case insensitive . Treat both upper and lowercase characters as same.
2) String assignMachineToJob(String jobId, String capabilitiesRequired[], int criteria)
- Returns the selected
machineId, or an empty string "" if no compatible machine exists.
- If multiple machines exist then return machine with lexicographically smallest machineId among them.
- All values in
capabilitiesRequired are valid and non blank.
jobId is unique and non-blank.
criteria chooses the machine selection algorithm:
0: Find machine with Least number of unfinished jobs.
1: Find machine with Most number of finished jobs.
- Extensibility requirement: Your solution must make it easy to add new assignment criteria (algorithms).
3) void jobCompleted(String jobId)
jobId is always valid and correspond to a previously submitted and assigned job.
- Marks the job as finished and updates the associated machine’s counters.
Example 1 - Multi-Capability Match + Criteria 0 (Least Unfinished) + Deterministic Tie
addMachine("m-10", ["image compression", "audio extraction", "video thumbnail generation"])
addMachine("m-2", ["image compression", "audio extraction"])
assignMachineToJob("job-A", ["image compression", "audio extraction"], 0)
- Candidates:
m-2, m-10 (both are supersets of required capabilities)
- Both have
unfinishedCount = 0 → tie → choose lexicographically smaller m-10 vs m-2: “m-10” is lexicographically smaller than “m-2” because it compares character-by-character and '1' < '2'.
- Result: returns
"m-10"
- State:
m-10.unfinished = 1, m-10.finished = 0; job-A → ASSIGNED to m-10
Example 2 - Completion Updates → Criteria 1 (Most Finished)
jobCompleted("job-A") → m-10.unfinished: 1 → 0, m-10.finished: 0 → 1
assignMachineToJob("job-B", ["image compression"], 1)
- Candidates:
m-2, m-10 (both have “image compression”)
- Finished counts:
m-10 = 1, m-2 = 0 → choose m-10
- Result: returns
"m-10"
- State:
m-10.unfinished: 0 → 1
Example 3 - No Compatible Machine → Empty String
assignMachineToJob("job-C", ["speech to text conversion"], 0)
- Candidates: none (no machine provides “speech to text conversion”)
- Result: returns
"" (empty string); no job or counters updated
Constraints
- There will be at max 100 machines.
- There will be at max 100 different capabilities.