List functional requirements for the system (Ask the chat bot for hints if stuck.)...
Users should be able to caste votes
Votes need to be tabulated and recorded
Result should be returned at the end of voting
__________________________________
users should only be allowed to vote once
List non-functional requirements for the system...
Availability - Systems should be online throughout the voting
Eventual Consistency
Low latency writes and read < 200ms
Scalable to handle 300 mn votes
Security
Reliability - No vote should be duplicated
Durable - No votes Lost
Idempotent - Each voter must be unique
Estimate the scale of the system you are going to design...
1.4bn
800mn are eligible to vote
500mn voters
5tb of data 1 day
2kb per vote
500mn voters / 100k sec = 5000 wps
Define what APIs are expected from the system...
POST /vote/
{
voter_id
for
}
=> ballot_number
GET /vote/?voter_id
GET /total_vote/?party_id
DELETE /vote/?voter_id
Defining the system data model early on will clarify how data will flow among different components of the system. Also you could draw an ER diagram using the diagramming tool to enhance your design...
PartyTable
name
region
contesting_for
VoterTable
name
uuid
region
ElectionTable
Party_id
votes_received
You should identify enough components that are needed to solve the actual problem from end to end. Also remember to draw a block diagram using the diagramming tool to augment your design. If you are unfamiliar with the tool, you can simply describe your design to the chat bot and ask it to generate a starter diagram for you to modify...
Explain how the request flows from end to end in your high level design. Also you could draw a sequence diagram using the diagramming tool to enhance your explanation...
Dig deeper into 2-3 components and explain in detail how they work. For example, how well does each component scale? Any relevant algorithm or data structure you like to use for a component? Also you could draw a diagram using the diagramming tool to enhance your design...
Explain any trade offs you have made and why you made certain tech choices...
Kafka can make sure no votes are dropped but can introduce lag
Reconciliation worker can make sure everything lines up but introduces lag and complexity
Try to discuss as many failure scenarios/bottlenecks as possible.
REDIS crashing before flushing to Database
Authentication DB getting high number of reads
What are some future improvements you would make? How would you mitigate the failure scenario(s) you described above?