Skip to content

Design a News Feed (Twitter Timeline), stage 6 of 9: break it

The post that wouldn't die

Find every line that contributes to either problem, or would fall over on a large account.

System so far· 9 parts
123456789CLIENTAuthorsSERVICEWrite APIDATABASEPost storeQUEUEFan-out queueWORKERFan-out workersSERVICESocial graphCACHETimeline cacheSERVICETimeline serviceCLIENTReaders

Select a component to see what it is responsible for and which state it owns.

  1. 1Authors → Write API: Post
  2. 2Write API → Post store: Store post
  3. 3Write API → Fan-out queue: Fan-out job
  4. 4Fan-out workers → Fan-out queue: Take jobs
  5. 5Fan-out workers → Social graph: Active followers
  6. 6Fan-out workers → Timeline cache: Push ID, trim to 800
  7. 7Readers → Timeline service: GET home timeline
  8. 8Timeline service → Timeline cache: Page of IDs
  9. 9Timeline service → Post store: Hydrate; large accounts' recent posts
  • Request / response
  • Asynchronous

What you need to know

0 of 2 checks done
  1. A Redis list used as a capped timeline needs two operations per insert: LPUSH adds the newest entry at the front, and LTRIM key 0 799 drops everything past 800. Without the trim, lists grow forever.

    Sending both in one pipeline (many commands in one round trip) keeps it cheap.

  2. Work it out

    A worker awaits each insert separately, at about 1 ms per round trip. How many minutes for an account with 1 million followers?
    minutes