{"id":"real-world-architectures","title":"Real-world architectures","sections":[{"id":"overview","title":"Overview","html":"<p>The rest of this handbook teaches ideas one at a time: caching, replication, sharding, queues, consensus. Real systems use many of them at once, and the interesting part is how they fit together and what each team gave up to get what it needed. Reading how real systems were built is the best follow-up to the handbook, for three reasons:</p>\n<ul>\n<li><strong>You see the trade-offs being made for real.</strong> A chapter can tell you that a store can favor availability over consistency. A paper shows you a team that did it, why, and what broke afterwards.</li>\n<li><strong>You collect patterns.</strong> After a few papers you notice the same small set of techniques again and again: a ring of hashed keys, a single master that holds metadata, a log that everything writes to, a cache in front of the database.</li>\n<li><strong>Interview questions often come from the same domain.</strong> If you are interviewing at a company, its engineering blog shows the problems its engineers care about and the words they use for them.</li>\n</ul>\n<p>This chapter is a reading list with notes. It has three parts: the papers and talks behind well-known systems, write-ups of how particular companies built their products, and the engineering blogs where companies still publish this kind of material.</p>\n<p>Details such as version numbers, machine counts and product names go out of date quickly, so there is no point memorizing them. Read for the shape of the design, with four questions in mind:</p>\n<ul>\n<li>What problem were they solving, and for whom?</li>\n<li>What constraints shaped the design: the size of the data, the read-to-write ratio, the latency target, the size of the team?</li>\n<li>Which trade-offs did they make, and what did they give up?</li>\n<li>What would they change, or what did they change later?</li>\n</ul>\n<h4 id=\"a-worked-example-reading-the-dynamo-paper\">A worked example: reading the Dynamo paper</h4>\n<p>Here is what that looks like on one paper. <a href=\"https://www.read.seas.harvard.edu/~kohler/class/cs239-w08/decandia07dynamo.pdf\" target=\"_blank\" rel=\"noopener noreferrer\">Dynamo: Amazon's Highly Available Key-value Store</a> was presented at SOSP in October 2007. It describes the store that some of Amazon's core services used to keep data such as shopping carts.</p>\n<p><strong>The problem.</strong> The paper opens with the shopping cart. Customers \"should be able to view and add items to their shopping cart even if disks are failing, network routes are flapping, or data centers are being destroyed by tornados.\" At Amazon's size, the authors write, small and large components fail continuously. So the store must keep accepting writes while parts of it are broken.</p>\n<p><strong>The constraints.</strong> Many Amazon services, such as shopping carts, best seller lists, session management, sales rank and the product catalog, only need to look data up by its primary key. The paper says that storing their data in a relational database \"would lead to inefficiencies and limit scale and availability,\" so Dynamo offers only a primary-key interface. Amazon also measured its service-level agreements at the 99.9th percentile of latency, so that the slowest 0.1% of requests counted. The paper reports that its 99.9th-percentile latencies were around 200 ms, an order of magnitude higher than the averages.</p>\n<p><strong>The trade-offs.</strong> To stay writable during failures, \"Dynamo sacrifices consistency under certain failure scenarios.\" Two copies of the same cart can be updated separately and drift apart. Dynamo keeps both versions and lets the application merge them when it next reads the data. The design pushes \"the complexity of conflict resolution to the reads in order to ensure that writes are never rejected.\" The cost shows up in the cart: an \"add to cart\" operation is never lost, \"however, deleted items can resurface.\"</p>\n<p><strong>The techniques.</strong> The paper's Table 1 maps each problem to the technique it used. Every one of them has a section in this handbook:</p>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<div class=\"table-wrap\"><table><thead><tr><th>Problem</th><th>Dynamo's technique</th><th>Where the handbook covers it</th></tr></thead><tbody><tr><td>Spreading keys over machines</td><td>Consistent hashing, with virtual nodes</td><td><a href=\"/learn/consistent-hashing#virtual-nodes\">Consistent hashing</a></td></tr><tr><td>Staying writable when copies disagree</td><td>Vector clocks, with the conflict resolved when the data is read</td><td><a href=\"/learn/design-key-value-store#versioning-last-writer-wins-or-vector-clocks\">Versioning</a></td></tr><tr><td>Machines that are down for a short time</td><td>Sloppy quorum and hinted handoff</td><td><a href=\"/learn/design-key-value-store#sloppy-quorum-and-hinted-handoff\">Sloppy quorum and hinted handoff</a></td></tr><tr><td>Machines that are gone for good</td><td>Anti-entropy using Merkle trees</td><td><a href=\"/learn/design-key-value-store#anti-entropy-with-merkle-trees\">Anti-entropy with Merkle trees</a></td></tr><tr><td>Knowing which machines are alive</td><td>A gossip-based membership protocol</td><td><a href=\"/learn/design-key-value-store#failure-detection-with-gossip\">Failure detection with gossip</a></td></tr></tbody></table></div>\n<p>The paper also shows the tuning knobs from <a href=\"/learn/cap-and-consistency#quorums-n-r-and-w\">quorums</a>: each key is stored on N machines, a read waits for R of them and a write waits for W. \"The common (N,R,W) configuration used by several instances of Dynamo is (3,2,2).\" Because R + W = 4 is greater than N = 3, a read and a write that both succeed normally overlap on at least one machine.</p>\n<p><strong>What you take away.</strong> You don't need to remember any of Dynamo's numbers. The lesson is the pattern: when losing a write costs more than showing slightly stale data, accept every write and merge conflicts later. The <a href=\"/learn/cap-and-consistency#amazons-shopping-cart-stay-writable-merge-later\">CAP chapter</a> tells the same story from the theory side.</p>\n<p><strong>What changed later.</strong> Amazon's managed database service, DynamoDB, has a similar name but is a different system. Its own paper, <a href=\"https://www.usenix.org/system/files/atc22-elhemali.pdf\" target=\"_blank\" rel=\"noopener noreferrer\">Amazon DynamoDB: A Scalable, Predictably Performant, and Fully Managed NoSQL Database Service</a>, appeared at USENIX ATC in July 2022. Reading the two papers side by side is a good exercise in how a design changes when it becomes a service that outside customers pay for.</p>","headings":[{"id":"a-worked-example-reading-the-dynamo-paper","title":"A worked example: reading the Dynamo paper","depth":4}]},{"id":"how-to-read-an-architecture-write-up","title":"How to read an architecture write-up","html":"<h3 id=\"how-to-read-an-architecture-write-up\">How to read an architecture write-up</h3>\n<p>Use this checklist on any paper, talk or blog post in this chapter.</p>\n<ol>\n<li><strong>Find the problem first.</strong> Read the abstract and the introduction, then stop and write one sentence: who needed what, and why the existing tools weren't good enough.</li>\n<li><strong>Write down the numbers that drove the design.</strong> Requests per second, reads versus writes, data size, latency targets, team size. These explain most of the choices.</li>\n<li><strong>Sketch the architecture.</strong> Draw the boxes and arrows yourself before you look at the paper's figure. Mark where the data lives and which parts can fail on their own.</li>\n<li><strong>For each component, ask what it solves.</strong> Then ask where it works, where it doesn't, and what would break first if traffic grew ten times.</li>\n<li><strong>Name the trade-offs.</strong> Look for what they gave up: consistency for availability, flexibility for speed, generality for simplicity. Most papers say this outright in one or two sentences.</li>\n<li><strong>Look for shared patterns and technologies.</strong> Compare it with other systems you have read about. Most designs reuse a small set of ideas, and spotting them is the real skill.</li>\n<li><strong>Read the lessons learned.</strong> The \"experience\" or \"lessons\" section near the end is often the most useful part, because it is where the authors say what surprised them.</li>\n<li><strong>Check the date.</strong> A 2008 post about a site running on a few dozen servers describes a different world from today's managed cloud services. The reasoning can still hold even when the products have changed.</li>\n<li><strong>Skip the nitty-gritty on a first pass.</strong> Proofs, benchmark setups and configuration details can wait until you need them.</li>\n</ol>","headings":[{"id":"how-to-read-an-architecture-write-up","title":"How to read an architecture write-up","depth":3}]},{"id":"systems-and-papers","title":"Systems and papers","html":"<h3 id=\"systems-and-papers\">Systems and papers</h3>\n<p>These are the systems most often cited in system design discussions. Where the original paper is freely available, it's linked. For open source projects, the link is an introductory slide deck, with the project's own site or original paper alongside it. The one-sentence descriptions come from the paper or project page.</p>\n<p>A worked example of the kind of diagram these write-ups contain: in a 2013 talk, <a href=\"https://www.infoq.com/presentations/Twitter-Timeline-Scalability/\" target=\"_blank\" rel=\"noopener noreferrer\">Timelines at Scale</a>, Twitter's Raffi Krikorian walked through how a tweet reaches people. <a href=\"https://highscalability.com/the-architecture-twitter-uses-to-deal-with-150m-active-users/\" target=\"_blank\" rel=\"noopener noreferrer\">High Scalability's summary</a> of the talk reports 300,000 read requests a second against 6,000 writes, so Twitter did the work when a tweet was written. A \"fanout\" step copied each new tweet's ID into every follower's home timeline, kept in a Redis cluster with up to 800 entries per timeline and three copies of each. A separate path fed the tweet to an \"Ingester\", which indexed it in Earlybird, Twitter's search index, and a service called Blender built search results from it. The tweet also triggered push notifications.</p>\n<figure class=\"diagram\" data-text=\"New tweet -> Write API; Write API -> Ingester; Write API -> Fanout; Write API -> Push notifications; Ingester -> Earlybird search index; Fanout -> Redis timeline cache (tweet IDs); Earlybird search index -> Blender; Redis timeline cache -> Timeline service; Blender -> Search results; Timeline service -> Home timeline\"><div class=\"diagram-scroll\"><svg class=\"dg\" viewBox=\"0 0 480 678\" width=\"480\" role=\"img\" aria-label=\"How a tweet reached readers in 2013, after Twitter&#x27;s &#x22;Timelines at Scale&#x22; talk\"><defs><marker id=\"dg-arrow\" viewBox=\"0 0 10 10\" refX=\"9\" refY=\"5\" markerWidth=\"7\" markerHeight=\"7\" orient=\"auto-start-reverse\"><path class=\"dg-arrowhead\" d=\"M0,1 L9,5 L0,9 z\"></path></marker></defs><line class=\"dg-edge\" x1=\"240\" y1=\"69\" x2=\"240\" y2=\"133\" marker-end=\"url(#dg-arrow)\"></line><line class=\"dg-edge\" x1=\"204\" y1=\"189\" x2=\"118.7\" y2=\"253\" marker-end=\"url(#dg-arrow)\"></line><line class=\"dg-edge\" x1=\"240\" y1=\"189\" x2=\"240\" y2=\"253\" marker-end=\"url(#dg-arrow)\"></line><line class=\"dg-edge\" x1=\"276\" y1=\"189\" x2=\"358.7\" y2=\"251\" marker-end=\"url(#dg-arrow)\"></line><line class=\"dg-edge\" x1=\"80\" y1=\"309\" x2=\"80\" y2=\"366\" marker-end=\"url(#dg-arrow)\"></line><line class=\"dg-edge\" x1=\"240\" y1=\"309\" x2=\"240\" y2=\"366\" marker-end=\"url(#dg-arrow)\"></line><line class=\"dg-edge\" x1=\"80\" y1=\"436\" x2=\"80\" y2=\"493\" marker-end=\"url(#dg-arrow)\"></line><line class=\"dg-edge\" x1=\"240\" y1=\"436\" x2=\"240\" y2=\"491\" marker-end=\"url(#dg-arrow)\"></line><line class=\"dg-edge\" x1=\"80\" y1=\"549\" x2=\"80\" y2=\"613\" marker-end=\"url(#dg-arrow)\"></line><line class=\"dg-edge\" x1=\"240\" y1=\"551\" x2=\"240\" y2=\"613\" marker-end=\"url(#dg-arrow)\"></line><rect class=\"dg-node dg-client\" x=\"172\" y=\"18\" width=\"136\" height=\"48\" rx=\"24\"></rect><text class=\"dg-label\" text-anchor=\"middle\"><tspan x=\"240\" y=\"46.5\">New tweet</tspan></text><rect class=\"dg-node dg-box\" x=\"172\" y=\"138\" width=\"136\" height=\"48\" rx=\"8\"></rect><text class=\"dg-label\" text-anchor=\"middle\"><tspan x=\"240\" y=\"166.5\">Write API</tspan></text><rect class=\"dg-node dg-box\" x=\"12\" y=\"258\" width=\"136\" height=\"48\" rx=\"8\"></rect><text class=\"dg-label\" text-anchor=\"middle\"><tspan x=\"80\" y=\"286.5\">Ingester</tspan></text><rect class=\"dg-node dg-box\" x=\"172\" y=\"258\" width=\"136\" height=\"48\" rx=\"8\"></rect><text class=\"dg-label\" text-anchor=\"middle\"><tspan x=\"240\" y=\"286.5\">Fanout</tspan></text><rect class=\"dg-node dg-box\" x=\"332\" y=\"256\" width=\"136\" height=\"52\" rx=\"8\"></rect><text class=\"dg-label\" text-anchor=\"middle\"><tspan x=\"400\" y=\"278.5\">Push</tspan><tspan x=\"400\" y=\"294.5\">notifications</tspan></text><path class=\"dg-node dg-store\" d=\"M12,378 a68,7 0 0,1 136,0 v48 a68,7 0 0,1 -136,0 z\"></path><path class=\"dg-line\" d=\"M12,378 a68,7 0 0,0 136,0\"></path><text class=\"dg-label\" text-anchor=\"middle\"><tspan x=\"80\" y=\"401.5\">Earlybird</tspan><tspan x=\"80\" y=\"417.5\">search index</tspan></text><path class=\"dg-node dg-store\" d=\"M172,378 a68,7 0 0,1 136,0 v48 a68,7 0 0,1 -136,0 z\"></path><path class=\"dg-line\" d=\"M172,378 a68,7 0 0,0 136,0\"></path><text class=\"dg-label\" text-anchor=\"middle\"><tspan x=\"240\" y=\"401.5\">Redis</tspan><tspan x=\"240\" y=\"417.5\">timeline cache</tspan></text><rect class=\"dg-node dg-box\" x=\"12\" y=\"498\" width=\"136\" height=\"48\" rx=\"8\"></rect><text class=\"dg-label\" text-anchor=\"middle\"><tspan x=\"80\" y=\"526.5\">Blender</tspan></text><rect class=\"dg-node dg-box\" x=\"172\" y=\"496\" width=\"136\" height=\"52\" rx=\"8\"></rect><text class=\"dg-label\" text-anchor=\"middle\"><tspan x=\"240\" y=\"518.5\">Timeline</tspan><tspan x=\"240\" y=\"534.5\">service</tspan></text><rect class=\"dg-node dg-client\" x=\"12\" y=\"618\" width=\"136\" height=\"48\" rx=\"24\"></rect><text class=\"dg-label\" text-anchor=\"middle\"><tspan x=\"80\" y=\"646.5\">Search results</tspan></text><rect class=\"dg-node dg-client\" x=\"172\" y=\"618\" width=\"136\" height=\"48\" rx=\"24\"></rect><text class=\"dg-label\" text-anchor=\"middle\"><tspan x=\"240\" y=\"646.5\">Home timeline</tspan></text><rect class=\"dg-edge-bg\" x=\"207.1\" y=\"328.5\" width=\"65.8\" height=\"18\" rx=\"4\"></rect><text class=\"dg-edge-label\" x=\"240\" y=\"341.5\" text-anchor=\"middle\">tweet IDs</text></svg></div><figcaption>How a tweet reached readers in 2013, after Twitter's \"Timelines at Scale\" talk</figcaption></figure>\n<p>Fan-out on write has a weak spot: accounts with tens of millions of followers. The summary reports that a tweet could take up to five minutes to reach all 31 million of Lady Gaga's followers, against a goal of five seconds. For accounts like that, Twitter was moving to skip the fan-out and merge their tweets into each reader's timeline at read time. <a href=\"/learn/design-twitter\">Design the Twitter timeline and search</a> builds the same design step by step.</p>\n<h4 id=\"data-processing\">Data processing</h4>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<div class=\"table-wrap\"><table><thead><tr><th>System</th><th>What it is</th><th>Read</th><th>Handbook chapters</th></tr></thead><tbody><tr><td><strong>MapReduce</strong> (Google)</td><td>A programming model for processing large data sets: you write a map function and a reduce function, and the system runs them in parallel on thousands of machines and handles machine failures for you.</td><td><a href=\"http://static.googleusercontent.com/media/research.google.com/zh-CN/us/archive/mapreduce-osdi04.pdf\">Paper, OSDI 2004</a></td><td><a href=\"/learn/batch-processing#mapreduce-the-foundational-model\">Batch processing</a></td></tr><tr><td><strong>Spark</strong></td><td>A multi-language engine for data engineering, data science and machine learning on one machine or a cluster. It started as a research project at UC Berkeley's AMPLab in 2009 and is now an Apache project. Its core idea is keeping data in memory across steps.</td><td><a href=\"https://www.slideshare.net/AGrishchenko/apache-spark-architecture\">Slides: Apache Spark Architecture</a> · <a href=\"https://www.usenix.org/system/files/conference/nsdi12/nsdi12-final138.pdf\">RDD paper, NSDI 2012</a> · <a href=\"https://spark.apache.org/\">spark.apache.org</a></td><td><a href=\"/learn/batch-processing#apache-spark-multi-stage-jobs-and-in-memory-reuse\">Batch processing</a></td></tr><tr><td><strong>Storm</strong></td><td>A distributed realtime computation system that processes unbounded streams of data, \"doing for realtime processing what Hadoop did for batch processing.\" It was built at BackType, which Twitter bought in July 2011, and Twitter open sourced it that September.</td><td><a href=\"https://www.slideshare.net/previa/storm-16094009\">Slides: Introduction to Storm</a> · <a href=\"https://storm.apache.org/\">storm.apache.org</a></td><td><a href=\"/learn/batch-processing#combining-batch-and-streaming-lambda-vs-kappa\">Batch processing</a>, <a href=\"/learn/event-streaming\">Event streaming</a></td></tr></tbody></table></div>\n<h4 id=\"data-stores\">Data stores</h4>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<div class=\"table-wrap\"><table><thead><tr><th>System</th><th>What it is</th><th>Read</th><th>Handbook chapters</th></tr></thead><tbody><tr><td><strong>Bigtable</strong> (Google)</td><td>A distributed storage system for structured data, built to scale to petabytes across thousands of commodity servers. The paper says more than sixty Google products used it, including web indexing, Google Earth and Google Finance.</td><td><a href=\"https://www.read.seas.harvard.edu/~kohler/class/cs239-w08/chang06bigtable.pdf\">Paper, OSDI 2006</a></td><td><a href=\"/learn/nosql-databases#wide-column-stores\">Wide column stores</a></td></tr><tr><td><strong>HBase</strong></td><td>The Hadoop database: an open source store modeled after Bigtable, running on top of Hadoop and HDFS, with random, realtime reads and writes.</td><td><a href=\"https://www.slideshare.net/alexbaranau/intro-to-hbase\">Slides: Intro to HBase</a> · <a href=\"https://hbase.apache.org/\">hbase.apache.org</a></td><td><a href=\"/learn/nosql-databases#wide-column-stores\">Wide column stores</a></td></tr><tr><td><strong>Cassandra</strong></td><td>A distributed NoSQL database with a partitioned wide-column model and eventual consistency. It was first designed at Facebook, combining Dynamo's distribution and replication techniques with Bigtable's data and storage model.</td><td><a href=\"https://www.slideshare.net/planetcassandra/cassandra-introduction-features-30103666\">Slides: Cassandra Introduction &#x26; Features</a> · <a href=\"https://www.cs.cornell.edu/projects/ladis2009/papers/lakshman-ladis2009.pdf\">Paper, LADIS 2009</a></td><td><a href=\"/learn/nosql-databases#wide-column-stores\">Wide column stores</a>, <a href=\"/learn/consistent-hashing\">Consistent hashing</a></td></tr><tr><td><strong>Dynamo</strong> (Amazon)</td><td>A highly available key-value store that gives up consistency in some failure cases so that writes are never rejected. (DynamoDB, Amazon's later managed database, is a separate system with its own 2022 paper.)</td><td><a href=\"https://www.read.seas.harvard.edu/~kohler/class/cs239-w08/decandia07dynamo.pdf\">Dynamo paper, SOSP 2007</a> · <a href=\"https://www.usenix.org/system/files/atc22-elhemali.pdf\">DynamoDB paper, USENIX ATC 2022</a></td><td><a href=\"/learn/design-key-value-store\">Design a key-value store</a>, <a href=\"/learn/cap-and-consistency\">CAP and consistency</a></td></tr><tr><td><strong>MongoDB</strong></td><td>A document database: each record is a document of field and value pairs, similar to a JSON object, and fields can hold other documents and arrays.</td><td><a href=\"https://www.slideshare.net/mdirolf/introduction-to-mongodb\">Slides: Introduction to MongoDB</a> · <a href=\"https://www.mongodb.com/docs/manual/introduction/\">What is MongoDB?</a></td><td><a href=\"/learn/nosql-databases#document-stores\">Document stores</a></td></tr><tr><td><strong>Spanner</strong> (Google)</td><td>Google's \"scalable, multi-version, globally-distributed, and synchronously-replicated database,\" the first to support consistent distributed transactions at global scale. It relies on a time API that exposes how uncertain the clock is.</td><td><a href=\"https://static.googleusercontent.com/media/research.google.com/en//archive/spanner-osdi2012.pdf\">Paper, OSDI 2012</a></td><td><a href=\"/learn/cap-and-consistency#google-spanner-consistent-and-available-enough\">CAP and consistency</a>, <a href=\"/learn/distributed-transactions\">Distributed transactions</a></td></tr><tr><td><strong>Memcached</strong></td><td>A free, open source, distributed in-memory key-value cache for small chunks of data, such as the results of database calls, API calls or page rendering. It speeds up web applications by taking load off the database.</td><td><a href=\"https://www.slideshare.net/oemebamo/introduction-to-memcached\">Slides: Introduction to memcached</a> · <a href=\"https://memcached.org/\">memcached.org</a></td><td><a href=\"/learn/cache#redis-vs-memcached\">Caching</a></td></tr><tr><td><strong>Redis</strong></td><td>An in-memory \"data structure server\" with native types such as strings, hashes, lists, sets and sorted sets. Unlike Memcached it can persist data to disk, either as point-in-time snapshots (RDB) or as a log of every write (AOF).</td><td><a href=\"https://www.slideshare.net/dvirsky/introduction-to-redis\">Slides: Introduction to Redis</a> · <a href=\"https://redis.io/docs/latest/develop/data-types/\">Redis data types</a> · <a href=\"https://redis.io/docs/latest/operate/oss_and_stack/management/persistence/\">Persistence</a></td><td><a href=\"/learn/cache#redis-internals-and-memcached\">Caching</a>, <a href=\"/learn/nosql-databases#key-value-stores\">Key-value stores</a></td></tr></tbody></table></div>\n<h4 id=\"file-systems\">File systems</h4>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<div class=\"table-wrap\"><table><thead><tr><th>System</th><th>What it is</th><th>Read</th><th>Handbook chapters</th></tr></thead><tbody><tr><td><strong>Google File System (GFS)</strong></td><td>A scalable distributed file system for large, data-intensive applications, built to tolerate faults on cheap commodity hardware. A single master holds the metadata while many chunkservers hold the data.</td><td><a href=\"http://static.googleusercontent.com/media/research.google.com/zh-CN/us/archive/gfs-sosp2003.pdf\">Paper, SOSP 2003</a></td><td><a href=\"/learn/batch-processing\">Batch processing</a>, <a href=\"/learn/availability\">Availability</a></td></tr><tr><td><strong>Hadoop Distributed File System (HDFS)</strong></td><td>The open source counterpart to GFS. A single NameNode manages the file system's namespace, and DataNodes store the blocks that files are split into. It was originally built for the Apache Nutch web search engine.</td><td><a href=\"https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html\">HDFS Architecture</a></td><td><a href=\"/learn/batch-processing\">Batch processing</a></td></tr></tbody></table></div>\n<h4 id=\"coordination-and-other-infrastructure\">Coordination and other infrastructure</h4>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<div class=\"table-wrap\"><table><thead><tr><th>System</th><th>What it is</th><th>Read</th><th>Handbook chapters</th></tr></thead><tbody><tr><td><strong>Chubby</strong> (Google)</td><td>A lock service for loosely coupled distributed systems. It offers coarse-grained locks and a small amount of reliable storage, through an interface much like a file system, and favors availability and reliability over speed. Paxos sits at its core.</td><td><a href=\"http://static.googleusercontent.com/media/research.google.com/en/us/archive/chubby-osdi06.pdf\">Paper, OSDI 2006</a></td><td><a href=\"/learn/consensus\">Consensus</a></td></tr><tr><td><strong>ZooKeeper</strong></td><td>A distributed, open source coordination service. It offers simple building blocks, arranged like a file system's directory tree, that applications use for synchronization, configuration, groups and naming. It came out of Yahoo.</td><td><a href=\"https://www.slideshare.net/sauravhaloi/introduction-to-apache-zookeeper\">Slides: Introduction to Apache ZooKeeper</a> · <a href=\"https://www.usenix.org/legacy/event/atc10/tech/full_papers/Hunt.pdf\">Paper, USENIX ATC 2010</a> · <a href=\"https://zookeeper.apache.org/doc/current/zookeeperOver.html\">zookeeper.apache.org</a></td><td><a href=\"/learn/consensus#zookeeper-and-etcd-in-practice\">Consensus</a></td></tr><tr><td><strong>Dapper</strong> (Google)</td><td>Google's tracing system for following one request through many services. It keeps overhead low by sampling requests and by adding instrumentation to a small number of shared libraries.</td><td><a href=\"http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/36356.pdf\">Paper, Google technical report 2010</a></td><td><a href=\"/learn/observability#distributed-tracing\">Observability</a></td></tr><tr><td><strong>Kafka</strong></td><td>A distributed messaging system built at LinkedIn to collect and deliver large volumes of log data with low latency. Today it describes itself as an event streaming platform.</td><td><a href=\"https://www.slideshare.net/mumrah/kafka-talk-tri-hug\">Slides: Introduction and Overview of Apache Kafka (TriHUG, July 2013)</a> · <a href=\"https://notes.stephenholiday.com/Kafka.pdf\">Paper, NetDB 2011</a> · <a href=\"https://kafka.apache.org/\">kafka.apache.org</a></td><td><a href=\"/learn/event-streaming#the-log-model\">Event streaming</a>, <a href=\"/learn/queues-and-async\">Queues and async</a></td></tr></tbody></table></div>\n<p>Each paper describes its system as it was when the paper was published, often more than a decade ago. The systems have changed since, and some have been replaced. Read the papers for the reasoning behind each design, which ages much more slowly than the details.</p>","headings":[{"id":"systems-and-papers","title":"Systems and papers","depth":3},{"id":"data-processing","title":"Data processing","depth":4},{"id":"data-stores","title":"Data stores","depth":4},{"id":"file-systems","title":"File systems","depth":4},{"id":"coordination-and-other-infrastructure","title":"Coordination and other infrastructure","depth":4}]},{"id":"company-architectures","title":"Company architectures","html":"<h3 id=\"company-architectures\">Company architectures</h3>\n<p>These write-ups describe how particular companies built their products. Most are posts on <a href=\"https://highscalability.com/\" target=\"_blank\" rel=\"noopener noreferrer\">High Scalability</a>, a blog that summarized conference talks and engineering posts for many years. Many are more than ten years old, so the year matters: read them for how the team reasoned under its constraints, and assume the specific tools have changed since. The year is the post's publication date, or the date of the talk where that's known.</p>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<div class=\"table-wrap\"><table><thead><tr><th>Company</th><th>Write-up</th><th>Year</th><th>Format</th></tr></thead><tbody><tr><td>Amazon</td><td><a href=\"https://highscalability.com/amazon-architecture/\">Amazon Architecture</a></td><td>2007</td><td>Article</td></tr><tr><td>Cinchcast</td><td><a href=\"https://highscalability.com/cinchcast-architecture-producing-1500-hours-of-audio-every-d/\">Producing 1,500 hours of audio every day</a></td><td>2012</td><td>Article</td></tr><tr><td>DataSift</td><td><a href=\"https://highscalability.com/datasift-architecture-realtime-datamining-at-120000-tweets-p/\">Realtime datamining at 120,000 tweets per second</a></td><td>2011</td><td>Article</td></tr><tr><td>Dropbox</td><td><a href=\"https://www.youtube.com/watch?v=PE4gwstWhmc\">How we've scaled Dropbox</a>, Kevin Modzelewski at Stanford</td><td>2012</td><td>Video</td></tr><tr><td>ESPN</td><td><a href=\"https://highscalability.com/espns-architecture-at-scale-operating-at-100000-duh-nuh-nuhs/\">Operating at 100,000 duh nuh nuhs per second</a></td><td>2013</td><td>Article</td></tr><tr><td>Facebook</td><td><a href=\"https://cs.uwaterloo.ca/~brecht/courses/854-Emerging-2014/readings/key-value/fb-memcached-nsdi-2013.pdf\">Scaling Memcache at Facebook</a> (NSDI)</td><td>2013</td><td>Paper</td></tr><tr><td>Facebook</td><td><a href=\"https://cs.uwaterloo.ca/~brecht/courses/854-Emerging-2014/readings/data-store/tao-facebook-distributed-datastore-atc-2013.pdf\">TAO: Facebook's distributed data store for the social graph</a> (USENIX ATC)</td><td>2013</td><td>Paper</td></tr><tr><td>Facebook</td><td><a href=\"https://www.usenix.org/legacy/event/osdi10/tech/full_papers/Beaver.pdf\">Finding a needle in Haystack: Facebook's photo storage</a> (OSDI)</td><td>2010</td><td>Paper</td></tr><tr><td>Facebook</td><td><a href=\"https://highscalability.com/how-facebook-live-streams-to-800000-simultaneous-viewers/\">How Facebook Live streams to 800,000 simultaneous viewers</a></td><td>2016</td><td>Article</td></tr><tr><td>Flickr</td><td><a href=\"https://highscalability.com/flickr-architecture/\">Flickr Architecture</a></td><td>2007</td><td>Article</td></tr><tr><td>Google</td><td><a href=\"https://highscalability.com/google-architecture/\">Google Architecture</a></td><td>2008</td><td>Article</td></tr><tr><td>Instagram</td><td><a href=\"https://highscalability.com/instagram-architecture-14-million-users-terabytes-of-photos/\">14 million users, terabytes of photos</a></td><td>2011</td><td>Article</td></tr><tr><td>Instagram</td><td><a href=\"https://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances\">What powers Instagram: hundreds of instances, dozens of technologies</a></td><td>2011</td><td>Article</td></tr><tr><td>Justin.tv</td><td><a href=\"https://highscalability.com/justintvs-live-video-broadcasting-architecture/\">Justin.tv's live video broadcasting architecture</a></td><td>2010</td><td>Article</td></tr><tr><td>Mailbox</td><td><a href=\"https://highscalability.com/scaling-mailbox-from-0-to-one-million-users-in-6-weeks-and-1/\">From 0 to one million users in 6 weeks</a></td><td>2013</td><td>Article</td></tr><tr><td>Netflix</td><td><a href=\"https://highscalability.com/a-360-degree-view-of-the-entire-netflix-stack/\">A 360 degree view of the entire Netflix stack</a></td><td>2015</td><td>Article</td></tr><tr><td>Netflix</td><td><a href=\"https://highscalability.com/netflix-what-happens-when-you-press-play/\">Netflix: what happens when you press play?</a></td><td>2017</td><td>Article</td></tr><tr><td>Pinterest</td><td><a href=\"https://highscalability.com/scaling-pinterest-from-0-to-10s-of-billions-of-page-views-a/\">From 0 to 10s of billions of page views a month</a></td><td>2013</td><td>Article</td></tr><tr><td>Pinterest</td><td><a href=\"https://highscalability.com/pinterest-architecture-update-18-million-visitors-10x-growth/\">18 million visitors, 10x growth, 12 employees</a></td><td>2012</td><td>Article</td></tr><tr><td>Playfish</td><td><a href=\"https://highscalability.com/playfishs-social-gaming-architecture-50-million-monthly-user/\">50 million monthly users and growing</a></td><td>2010</td><td>Article</td></tr><tr><td>PlentyOfFish</td><td><a href=\"https://highscalability.com/plentyoffish-architecture/\">PlentyOfFish Architecture</a></td><td>2009</td><td>Article</td></tr><tr><td>Salesforce</td><td><a href=\"https://highscalability.com/salesforce-architecture-how-they-handle-13-billion-transacti/\">How they handle 1.3 billion transactions a day</a></td><td>2013</td><td>Article</td></tr><tr><td>Stack Overflow</td><td><a href=\"https://highscalability.com/stack-overflow-architecture/\">Stack Overflow Architecture</a></td><td>2009</td><td>Article</td></tr><tr><td>TripAdvisor</td><td><a href=\"https://highscalability.com/tripadvisor-architecture-40m-visitors-200m-dynamic-page-view/\">40M visitors, 200M dynamic page views, 30TB data</a></td><td>2011</td><td>Article</td></tr><tr><td>Tumblr</td><td><a href=\"https://highscalability.com/tumblr-architecture-15-billion-page-views-a-month-and-harder/\">15 billion page views a month</a></td><td>2012</td><td>Article</td></tr><tr><td>Twitter</td><td><a href=\"https://highscalability.com/scaling-twitter-making-twitter-10000-percent-faster/\">Making Twitter 10000 percent faster</a></td><td>2009</td><td>Article</td></tr><tr><td>Twitter</td><td><a href=\"https://highscalability.com/how-twitter-stores-250-million-tweets-a-day-using-mysql/\">Storing 250 million tweets a day using MySQL</a></td><td>2011</td><td>Article</td></tr><tr><td>Twitter</td><td><a href=\"https://highscalability.com/the-architecture-twitter-uses-to-deal-with-150m-active-users/\">150M active users, 300K QPS, a 22 MB/s firehose</a></td><td>2013</td><td>Article</td></tr><tr><td>Twitter</td><td><a href=\"https://www.infoq.com/presentations/Twitter-Timeline-Scalability/\">Timelines at scale</a>, Raffi Krikorian on InfoQ</td><td>2013</td><td>Video</td></tr><tr><td>Twitter</td><td><a href=\"https://www.youtube.com/watch?v=5cKTP36HVgI\">Big and small data at Twitter</a>, Jeremy Cole at the O'Reilly MySQL Conference</td><td>2011</td><td>Video</td></tr><tr><td>Twitter</td><td><a href=\"https://www.youtube.com/watch?v=z8LU0Cj6BOU\">Operations at Twitter: scaling beyond 100 million users</a>, John Adams at LISA '10</td><td>2010</td><td>Video</td></tr><tr><td>Twitter</td><td><a href=\"https://highscalability.com/how-twitter-handles-3000-images-per-second/\">How Twitter handles 3,000 images per second</a></td><td>2016</td><td>Article</td></tr><tr><td>Uber</td><td><a href=\"https://highscalability.com/how-uber-scales-their-real-time-market-platform/\">How Uber scales their real-time market platform</a></td><td>2015</td><td>Article</td></tr><tr><td>Uber</td><td><a href=\"https://highscalability.com/lessons-learned-from-scaling-uber-to-2000-engineers-1000-ser/\">Lessons learned from scaling Uber to 2000 engineers, 1000 services, and 8000 Git repositories</a></td><td>2016</td><td>Article</td></tr><tr><td>WhatsApp</td><td><a href=\"https://highscalability.com/the-whatsapp-architecture-facebook-bought-for-19-billion/\">The WhatsApp architecture Facebook bought for $19 billion</a></td><td>2014</td><td>Article</td></tr><tr><td>YouTube</td><td><a href=\"https://www.youtube.com/watch?v=w5WVu624fY8\">YouTube Scalability</a>, Cuong Do at a Google Tech Talk (uploaded in 2012)</td><td>2007</td><td>Video</td></tr><tr><td>YouTube</td><td><a href=\"https://highscalability.com/youtube-architecture/\">YouTube Architecture</a></td><td>2008</td><td>Article</td></tr></tbody></table></div>\n<p>Some pairs are worth reading together, because each one shows a design changing as the company grew:</p>\n<ul>\n<li><strong>Facebook's three papers</strong> cover one company's storage at three layers. Memcache is a <a href=\"/learn/cache\">cache</a> in front of MySQL. TAO is a graph store that replaced memcache for many kinds of data (compare it with <a href=\"/learn/design-social-graph\">Design the data structures for a social network</a>). Haystack is a photo store that keeps each photo's metadata in memory, so that reading a photo costs fewer disk operations.</li>\n<li><strong>The two Pinterest posts</strong>, from 2012 and 2013, cover the same team a year apart.</li>\n<li><strong>The seven Twitter entries</strong> run from 2009 to 2016 and follow one company as it grew. Read them with <a href=\"/learn/design-twitter\">Design the Twitter timeline and search</a>.</li>\n</ul>","headings":[{"id":"company-architectures","title":"Company architectures","depth":3}]},{"id":"company-engineering-blogs","title":"Company engineering blogs","html":"<h3 id=\"company-engineering-blogs\">Company engineering blogs</h3>\n<p>If you are interviewing at a company, read a few recent posts from its engineering blog. The questions you get may come from the same domain, and the posts show which problems the company's engineers actually work on.</p>\n<p>Many of these blogs have moved since they were first started, and a few have closed. The links below are the current addresses, checked in October 2026. Where a blog has closed, the link is to an archived copy on the Internet Archive's Wayback Machine.</p>\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n<div class=\"table-wrap\"><table><thead><tr><th>Company</th><th>Blog</th><th>Notes</th></tr></thead><tbody><tr><td>Airbnb</td><td><a href=\"https://medium.com/airbnb-engineering\">The Airbnb Tech Blog</a></td><td>Moved to Medium from its old address, nerds.airbnb.com.</td></tr><tr><td>Atlassian</td><td><a href=\"https://www.atlassian.com/blog/how-we-build\">How we build</a></td><td>The old developer blog now redirects to the general \"Inside Atlassian\" blog. <a href=\"https://web.archive.org/web/20190212050450/https://developer.atlassian.com/blog/\">Archived copy of the developer blog (2019)</a>.</td></tr><tr><td>Amazon Web Services</td><td><a href=\"https://aws.amazon.com/blogs/aws/\">AWS News Blog</a></td><td>Product launches and how AWS services work.</td></tr><tr><td>Bitly</td><td><a href=\"https://word.bitly.com/\">word: the Bitly engineering blog</a></td><td>Still online, but the last post is from November 2017.</td></tr><tr><td>Box</td><td><a href=\"https://blog.box.com/category/engineering\">Box Blog: Engineering</a></td><td></td></tr><tr><td>Cloudera</td><td><a href=\"https://www.cloudera.com/blog.html\">Cloudera Blog</a></td><td>The old developer blog address redirects here.</td></tr><tr><td>Dropbox</td><td><a href=\"https://dropbox.tech/\">Dropbox Tech Blog</a></td><td>Moved from tech.dropbox.com.</td></tr><tr><td>eBay</td><td><a href=\"https://innovation.ebayinc.com/stories/\">eBay Innovation stories</a></td><td>The old eBay Tech Blog address redirects here.</td></tr><tr><td>Etsy</td><td><a href=\"https://www.etsy.com/codeascraft\">Code as Craft</a></td><td>Moved from codeascraft.com.</td></tr><tr><td>Evernote</td><td><a href=\"https://web.archive.org/web/20171220135146/http://blog.evernote.com/tech/\">Evernote Tech Blog (archived, 2017)</a></td><td>Closed. The address now redirects to Evernote's product blog.</td></tr><tr><td>Facebook (Meta)</td><td><a href=\"https://engineering.fb.com/\">Engineering at Meta</a></td><td>Replaces the old Facebook Engineering page.</td></tr><tr><td>Flickr</td><td><a href=\"https://code.flickr.net/\">code.flickr.net</a></td><td>Still online. The latest post is from February 2022.</td></tr><tr><td>Foursquare</td><td><a href=\"https://medium.com/foursquare-direct/tagged/engineering\">Engineering posts on Foursquare's Medium</a></td><td>engineering.foursquare.com now redirects to Foursquare's marketing pages. The latest engineering post is from October 2022.</td></tr><tr><td>GitHub</td><td><a href=\"https://github.blog/engineering/\">The GitHub Blog: Engineering</a></td><td></td></tr><tr><td>Google</td><td><a href=\"https://research.google/blog/\">Google Research Blog</a></td><td>Moved from googleresearch.blogspot.com.</td></tr><tr><td>Groupon</td><td><a href=\"https://medium.com/groupon-eng\">Groupon Product and Engineering</a></td><td>The latest post is from June 2023.</td></tr><tr><td>Heroku</td><td><a href=\"https://www.heroku.com/blog/category/engineering/\">Heroku Blog: Engineering</a></td><td></td></tr><tr><td>High Scalability</td><td><a href=\"https://highscalability.com/\">High Scalability</a></td><td>Not a company blog: summaries of how many companies built their systems, including most of the write-ups above.</td></tr><tr><td>HubSpot</td><td><a href=\"https://product.hubspot.com/blog/topic/engineering\">HubSpot Product Team Blog: Engineering</a></td><td></td></tr><tr><td>Instagram</td><td><a href=\"https://engineering.fb.com/tag/instagram/\">Instagram on Engineering at Meta</a></td><td>Instagram moved its blog here in 2022. The <a href=\"https://instagram-engineering.tumblr.com/\">original Tumblr blog</a> is still online, with posts up to 2015.</td></tr><tr><td>Intel</td><td><a href=\"https://web.archive.org/web/20150317224725/https://software.intel.com/en-us/blogs\">Intel Software Blogs (archived, 2015)</a></td><td>Closed. The old address no longer loads.</td></tr><tr><td>Jane Street</td><td><a href=\"https://blog.janestreet.com/\">Jane Street Tech Blog</a></td><td>Much of it is about OCaml, the language Jane Street uses.</td></tr><tr><td>LinkedIn</td><td><a href=\"https://www.linkedin.com/blog/engineering\">LinkedIn Engineering Blog</a></td><td></td></tr><tr><td>Microsoft</td><td><a href=\"https://devblogs.microsoft.com/engineering-at-microsoft/\">Engineering@Microsoft</a></td><td>The old engineering.microsoft.com site closed and now redirects to Azure DevOps documentation. <a href=\"https://web.archive.org/web/20181231043528/http://engineering.microsoft.com/\">Archived copy (2018)</a>.</td></tr><tr><td>Microsoft</td><td><a href=\"https://devblogs.microsoft.com/python/\">Microsoft for Python Developers Blog</a></td><td>Formerly \"Python Engineering at Microsoft\" on MSDN.</td></tr><tr><td>Netflix</td><td><a href=\"https://netflixtechblog.com/\">Netflix TechBlog</a></td><td>Moved from techblog.netflix.com.</td></tr><tr><td>PayPal</td><td><a href=\"https://developer.paypal.com/community/blog/\">PayPal Developer Community Blog</a></td><td>PayPal's Medium blog now points here too.</td></tr><tr><td>Pinterest</td><td><a href=\"https://medium.com/pinterest-engineering\">Pinterest Engineering Blog</a></td><td></td></tr><tr><td>Quora</td><td><a href=\"https://www.quora.com/q/quoraengineering\">Quora Engineering</a></td><td>The address loads behind a browser check, so it couldn't be checked automatically.</td></tr><tr><td>Reddit</td><td><a href=\"https://redditinc.com/news\">Reddit Inc blog</a> and <a href=\"https://www.reddit.com/r/RedditEng/\">r/RedditEng</a></td><td>redditblog.com redirects to the company blog. Engineering posts go to the r/RedditEng community.</td></tr><tr><td>Salesforce</td><td><a href=\"https://engineering.salesforce.com/\">Salesforce Engineering Blog</a></td><td></td></tr><tr><td>Slack</td><td><a href=\"https://slack.engineering/\">Engineering at Slack</a></td><td></td></tr><tr><td>Spotify</td><td><a href=\"https://engineering.atspotify.com/\">Spotify Engineering</a></td><td>The old address, labs.spotify.com, now hosts Spotify's experimental products instead of the blog.</td></tr><tr><td>Stripe</td><td><a href=\"https://stripe.dev/blog/topic/engineering\">Stripe Dev Blog: Engineering</a></td><td>stripe.com/blog/engineering redirects here.</td></tr><tr><td>Twilio</td><td><a href=\"https://www.twilio.com/en-us/blog\">Twilio Blog</a></td><td>The old engineering address redirects to the main blog.</td></tr><tr><td>Twitter (X)</td><td><a href=\"https://blog.x.com/engineering/en_us\">X Engineering</a></td><td>Moved from blog.twitter.com. The page blocks automated checks, so here is an <a href=\"https://web.archive.org/web/20260921025440/https://blog.x.com/engineering/en_us\">archived copy from September 2026</a>.</td></tr><tr><td>Uber</td><td><a href=\"https://www.uber.com/us/en/blog/engineering/\">Uber Blog: Engineering</a></td><td>Moved from eng.uber.com.</td></tr><tr><td>Yahoo</td><td><a href=\"https://yahooeng.tumblr.com/\">Yahoo Engineering</a></td><td>Still online, but the last post is from March 2019.</td></tr><tr><td>Yelp</td><td><a href=\"https://engineeringblog.yelp.com/\">Yelp Engineering and Product Blog</a></td><td></td></tr><tr><td>Zynga</td><td><a href=\"https://www.zynga.com/blogs/engineering\">Zynga Engineering Blog</a></td><td>Posts are infrequent.</td></tr></tbody></table></div>\n<p>For many more, the community-maintained <a href=\"https://github.com/kilimchoi/engineering-blogs\" target=\"_blank\" rel=\"noopener noreferrer\">engineering-blogs list on GitHub</a> collects hundreds of company and personal engineering blogs. If you know a company blog that's missing, add it there.</p>\n<h3 id=\"further-reading\">Further reading</h3>\n<ul>\n<li><a href=\"https://www.barroso.org/publications/TheTailAtScale.pdf\" target=\"_blank\" rel=\"noopener noreferrer\">The Tail at Scale</a>: Dean and Barroso on why large systems care about their slowest requests, the same concern that made Amazon measure Dynamo at the 99.9th percentile. <a href=\"/learn/performance-and-latency#the-tail-at-scale\">Performance and latency</a> walks through it.</li>\n<li><a href=\"https://github.com/kilimchoi/engineering-blogs\" target=\"_blank\" rel=\"noopener noreferrer\">kilimchoi/engineering-blogs</a>: the largest maintained list of engineering blogs.</li>\n<li><a href=\"https://highscalability.com/\" target=\"_blank\" rel=\"noopener noreferrer\">High Scalability</a>: the archive behind most of the company write-ups in this chapter, searchable by company name.</li>\n<li><a href=\"/learn/design-key-value-store\">Design a key-value store</a>, <a href=\"/learn/design-twitter\">Design the Twitter timeline and search</a> and <a href=\"/learn/design-social-graph\">Design the data structures for a social network</a>: the handbook designs that lean most on the papers above.</li>\n</ul>","headings":[{"id":"company-engineering-blogs","title":"Company engineering blogs","depth":3},{"id":"further-reading","title":"Further reading","depth":3}]}]}