---
# System prepended metadata

title: 'Acadia Studio Fun Exercise #2'

---

# Acadia Studio Fun Exercise #2 - Le

Imagine you are tasked with building a matchmaking engine for a cross platform 1v1 First Person shooter game that is played by billions of people. We want to ensure that people with the similar level of skill set via their player rating, defined by a player's win/loss record (ie. a 50-20 will have a player rating of 30) and a similar geographical country is matched (for good latency) with each other. 

> For example, if a user is requesting a match with another user and is from Canada with a record of (80-30), then the system should match another user from Canada with a player rating of 50.
> 
For a good user experience, we wouldn't want a user to wait much more than 30 seconds. Therefore, after 30 seconds, if there is no exact match for both skill set and geographical region, please match based on geographical region and the minimum of the difference between the player rating.

> For example, if a user is requesting a match with another user and is from Canada with a record of (80-30), then the system should wait up to 30 seconds to match the exact country and player rating. If there is nothing after 30s, then return a match with another user from Canada with a player rating that is the most similar to 50.

**Please design and architect a system where a caller into this engine with a user will match that user with another user based exactly on the 2 criteria above.**


- How should the overall architecture look like? What microservices (if any) would you build here?
- What datastores / frameworks would you use to achieve this?
- If we want to add in extra criteria (ie. match Android players with only Android players) and/or change which criteria we want to prioritize, would you change the design of the system?


```
