# Arshpreet | 4 years
- Good with DB design. Gave proper schema structure to tables and datatype and queries.
- Event System Design. Gave basic solution.
- Can be compared with blessy
# Question 1: Facebook Post
- Post, like, comments(nested), share(as post).
Clarifications:
- Post - Text + Media?
Tables:
1. User:
a. user_id: int
b. user_name: varchar
c. last_active: timestamp
d. email: varchar
2. PostCommentMapping (PostCommentID + Post_id)
a. Post_id: FK
b. Comment_id: FK
3. Post: # Post -> Comment 1 : many, Comment -> 1 : many
a. post_id: int
b. user_id: int (user_id FK)
c. text: varchar
d. media: varchar(link to s3)
f: created_at: timestamp
g: share_post_id: int (link to the original post)
h: like_counter: int
4. Comments:
a. comment_id: int (PK)
b. user_id: int(FK)
c. text: varchar
d. like_counter: int
e. parent_counter_id: int (FK to comment_id)
f: created_at
# Get Post, Like, Comment of a user in paginated manner.
1. Get Post, like counter for a user:
a. Select * from Post where user_id = 10;
2. Get Post, Comments for a user:
a. Select * from Post p inner join PostCommentMapping m on p.post_id = m.post_id where p.post_id = 123;
3. Insert comment for a post
4. Insert nested comment for a comment on a post
5. Like the post/comment
# Question 2: Event Driven System
(kafka)
- Queue
- publish - Producers
- subscribe - Consumers
# Steps and things to take care of / Prototype to build kafka
# Flow:
Producers => Queue => Consumers
Producers publish into topics (topic name should be unique)
Consumers subscribe into topics
Two methods:
1. Push
2. Pull / Polling
1. Queue will be fixed size (list) - Thread safe shared resource
Producers:
Map<topic_name, topic_id> topicMap
createTopic(topic_name){
uniq topic_id is generated
topicMap[topic_name] = topic_id
}
publish(data, topic_name){
1. Writing the data into particular topic_id
2. Call the set() to set the data into Queue
3. Wake up the consumer worker threads
}
Queue:
Arr[] objects:
set()
get()
offset
Consumers:
Map<consumer_id, topic_id> consumerMap;
addConsumer(topic_name){
1. Create a new consumer
2. Add the relation into map
}
subscribe(){
1. Fetch all consumers for that particular topic_id
2. Consume from the Queue - Monitor Locks
}