# Design Twitter. start: 9:55 Twitter is an online social networking service where users post and read short 140-character messages called "tweets." Registered users can post and read tweets - communication de hieu nen focus on cai gi - Lead cau chuyen, noi ve nen co nhung chuc nang gi, API nao => input, output => DB - DB: noi ve table truoc, sau do moi chon loai DB nao => ly do - ve Diagram, noi ra duoc nhung component chinh => ly do tai sao lai chon => communication giua cac service - interviewer se pick 1 service va focus on. **Thieu <- order cua tweets: Nen dan dat theo user-case: List up function: <- Tao con thieu gi khong, may co bo sung gi khong. Scale cua he thong: User?** Chuc nang chinh: 2 chuc nang chinh: - Luu tweet vao DB - Doc tweet tu DB Cau hoi: - Co the doc dc tweets cua nhung ai => Doc dc twt tu nguoi minh da follow => co them chuc nang la - Follow - List up nhung nguoi follow - Dang ki nguoi dung => ko quan tam phan nay tweeting: - API tweet: cho phep nguoi dung tao tweet toi da 140 characters va luu vao DB voi userId, tamstamp, contents - API read tweet: list up followers => get followers id => list ra all tweets dc viet boi followers & myseflt => order by timestamp - API Follow luu userId cua minh va following vao table (follow ) - API list up followers doc tu bang follow ra voi userid la your id ** API: input / output** Thiet ke DB: **DB nay thi read nhieu, hay write nhieu? consistency cua no? ** - users: userId - tweet: userId, content, timestamp - follow: userId, followingId - tweet_for_user <- cached SQL: Cache: Redis zset(List[]) key: <- block_memory key int : +1 List: append(elements) Tweets? select followingId from follow where userId = $1 // your id program => get array following ids array.push(yourId) select * from tweet where userId in ({array}) **Chon DB:** PostgresSQL - truy xuat nguoc dc voi list follow - toc do doc nhanh (not sure) - familiar 1M users follow: - danh index - setup master slave => tang server slave # high level design: Diagram: Microservice: function, comnication : sync/async/ (Rest_api , Message_queue) Main Service: Insert Tweet into DB Event: Insert tweet to MQ : user_id, tweet_id, timestamp 1 : timestamp1 2: > timestamp2 MQ: Async Kafka: TimelineSevice: Event(user_id, tweet_id, timestamp) Get Follower of user: GRPC(user_id) > list of follower Insert Redis: New Tweet: 1M key insert Follower service: List follower of user? - front end: - consumer => auto load lai tweet moi - 140 characters limit - backend: - store tweet - read tweet - follow user ca 3 functions vao 1 serve? LB => n nodes van de ton tai nguyen do nhu cau cua moi modules khac nhau + he thong la stateless => chon cach chia tung modules ra cac server khac nhau Q: multi AZ A: => cloudfront => cau hoi order Q: loat 100 newest tweet pure query: select * from tweet where userId in (array) order by timestamp desc limit 100 problem: - where in => ko indexing? - scan all records => huong giai quyet: - tweet_for_user - moi lan tweet: luu lai userId, tweetId, timestamp => ko kha thi voi viec write