Amazon Interview Question
SDE-2sCountry: India
There are following independent services:
Authentication and authorization service- which will manage the session by using AccessToken
GameInitialization service- This service will identify the competitors and initialize the game instance
GameExecutionService - Which will manage the turn in between players
There should be an API gateway to control request pipeline to the system.
System should have following classes:
1. Grid
---------------------
cells[][]
2. Game
---------------------
Grid* grid
players[2]
status
AccessToken
3. Player
---------------------
Id
placedPieces
balancePieces
Game id
CompetetorId
AccessToken
RefreshToken
----------------------
move()
4.piece
--------------------
id
type
int: x
int: y
player id
Game id
5. cell
---------------------
bool occupied
int x
int y
playerId
typeOfPiece
@steephen 's answer explains about game implementation.
- Kunal Saxena January 25, 2018There are other things to consider in this problem (Related to Design and Scalability)
Read -- github.com/tim-hr/stuff/wiki/System-design:-How-would-you-design-a-two-player-online-chess-game%3F
It is better to use Redis for auth tokens and sessions. Gameplay data can be stored in RDBMS or NoSQL if you want resume feature.
Coming to notification point, Let's have a scenario where you are waiting for an opponent. Cases will be
-> apps can easily have push notification.
-> for web-based games there are web-notifications
-> if any of above doesn't fit then we can create a game and same time create 1 topic ("nextGamePair") using JMS or RabbitMQ.
Every user waiting for the opponent will subscribe to this topic. When there are 2 players subscribe, we will start a game with those 2 players and unsubscribe them from the topic.
With 1 Topic we will handle this for all users.
All these things will cover aspects of this problem.