System requirements


Functional:

-create account

-upload plaintext

  • link to said text
  • ability to set read/write access
  • expiration
  • timestamp
  • created
  • updated

-view text



Non-Functional:

-highly available

-eventual consistency

-significantly more reads than writes




Capacity estimation

Estimate the scale of the system you are going to design...






API design

-POST createAccount(email, user, password)

-POST createText(user, text, permissions, expiration) -> returns link to the text

-PUT updateText(user, link, new_text, new_permissions, new_expiration) -> returns link to the text

-GET text(user, link) -> returns text if valid permissions and not expired




Database design

due to the nature of pastebin, sharing large amounts of text, a nosql database would be ideal for sharing the unstructured type of data. Also, having a nosql approach would be better to scale and shard.


-Users

  • username
  • email
  • password (hashed)
  • texts
  • text_1 link
  • ...
  • text_n link

-Texts

  • metadata
  • owner

-expiration

  • permissions
  • timestamp
  • created
  • modified
  • data
  • text




High-level design

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...








Request flows

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...






Detailed component design

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...






Trade offs/Tech choices

Explain any trade offs you have made and why you made certain tech choices...






Failure scenarios/bottlenecks

Try to discuss as many failure scenarios/bottlenecks as possible.






Future improvements

What are some future improvements you would make? How would you mitigate the failure scenario(s) you described above?