[English](README.md) | [日本語](README-ja.md) | **[Русский](README-ru.md)** | [简体中文](README-zh-Hans.md) | [繁體中文](README-zh-TW.md) # Пособие по проектированию систем


## Мотивация > Узнайте, как проектировать крупномасштабные системы. > > Подготовьтесь к собеседованию по проектированию системы. ### Научитесь проектировать крупномасштабные системы Умение проектировать масштабируемые системы поможет вам стать лучшим инженером. Проектирование систем - это широкая тема. В сети есть **огромное количество ресурсов** по принципам проектирования систем. Этот репозиторий представляет собой **организованную коллекцию** ресурсов, которые помогут вам научиться создавать системы на большом масштабе. ### Учитесь у сообщества по разработке ПО с открытым исходным кодом Это постоянно обновляемый проект с открытым исходным кодом. [Contributions](#contributing) очень приветствуются! ### Подготовка к собеседованию по проектированию системы В дополнение к интервью по написанию кода, проектирование систем является **обязательным компонентом процесса технического интервью** во многих технологических компаниях. **Практикуйте общие вопросы по проектированию систем** и **сравнивайте** свои результаты с **примерами решений**: обсуждения, код и диаграммы. Дополнительные темы для подготовки к собеседованию: * [Study guide](#study-guide) * [How to approach a system design interview question](#how-to-approach-a-system-design-interview-question) * [System design interview questions, **with solutions**](#system-design-interview-questions-with-solutions) * [Object-oriented design interview questions, **with solutions**](#object-oriented-design-interview-questions-with-solutions) * [Additional system design interview questions](#additional-system-design-interview-questions) ## Anki flashcards


Предоставленные [карточки Anki](https://apps.ankiweb.net/) могут быть использованы для повторения и запоминания ключевых концепций проектирования систем. * [System design deck](https://github.com/donnemartin/system-design-primer/tree/master/resources/flash_cards/System%20Design.apkg) * [System design exercises deck](https://github.com/donnemartin/system-design-primer/tree/master/resources/flash_cards/System%20Design%20Exercises.apkg) * [Object oriented design exercises deck](https://github.com/donnemartin/system-design-primer/tree/master/resources/flash_cards/OO%20Design.apkg) Отлично подходят для использования на ходу. ### Coding Resource: Interactive Coding Challenges Ищете ресурсы для подготовки к [**Coding Interview**](https://github.com/donnemartin/interactive-coding-challenges)?


Посмотрите другой репозиторий [**Interactive Coding Challenges**](https://github.com/donnemartin/interactive-coding-challenges), который тоже содержит колоду карт Anki: * [Coding deck](https://github.com/donnemartin/interactive-coding-challenges/tree/master/anki_cards/Coding.apkg) ## Содействие > Учитесь у сообщества. Не стесняйтесь отправлять запросы на: * Исправление ошибок * Улучшение разделов * Добавление новых разделов * [Перевод](https://github.com/donnemartin/system-design-primer/issues/28) Контент, который нуждается в некоторой полировке, помещается в раздел [В разработке](#under-development). Ознакомьтесь с [Принципами Содействия](CONTRIBUTING.md). ## Index of system design topics > Обобщение различных тем по проектирования систем, включая преимущества и недостатки. **Любое решение требует уступок**. > > Каждый раздел содержит ссылки на более подробное описание.


* [System design topics: start here](#system-design-topics-start-here) * [Step 1: Review the scalability video lecture](#step-1-review-the-scalability-video-lecture) * [Step 2: Review the scalability article](#step-2-review-the-scalability-article) * [Next steps](#next-steps) * [Performance vs scalability](#performance-vs-scalability) * [Latency vs throughput](#latency-vs-throughput) * [Availability vs consistency](#availability-vs-consistency) * [CAP theorem](#cap-theorem) * [CP - consistency and partition tolerance](#cp---consistency-and-partition-tolerance) * [AP - availability and partition tolerance](#ap---availability-and-partition-tolerance) * [Consistency patterns](#consistency-patterns) * [Weak consistency](#weak-consistency) * [Eventual consistency](#eventual-consistency) * [Strong consistency](#strong-consistency) * [Availability patterns](#availability-patterns) * [Fail-over](#fail-over) * [Replication](#replication) * [Availability in numbers](#availability-in-numbers) * [Domain name system](#domain-name-system) * [Content delivery network](#content-delivery-network) * [Push CDNs](#push-cdns) * [Pull CDNs](#pull-cdns) * [Load balancer](#load-balancer) * [Active-passive](#active-passive) * [Active-active](#active-active) * [Layer 4 load balancing](#layer-4-load-balancing) * [Layer 7 load balancing](#layer-7-load-balancing) * [Horizontal scaling](#horizontal-scaling) * [Reverse proxy (web server)](#reverse-proxy-web-server) * [Load balancer vs reverse proxy](#load-balancer-vs-reverse-proxy) * [Application layer](#application-layer) * [Microservices](#microservices) * [Service discovery](#service-discovery) * [Database](#database) * [Relational database management system (RDBMS)](#relational-database-management-system-rdbms) * [Master-slave replication](#master-slave-replication) * [Master-master replication](#master-master-replication) * [Federation](#federation) * [Sharding](#sharding) * [Denormalization](#denormalization) * [SQL tuning](#sql-tuning) * [NoSQL](#nosql) * [Key-value store](#key-value-store) * [Document store](#document-store) * [Wide column store](#wide-column-store) * [Graph Database](#graph-database) * [SQL or NoSQL](#sql-or-nosql) * [Cache](#cache) * [Client caching](#client-caching) * [CDN caching](#cdn-caching) * [Web server caching](#web-server-caching) * [Database caching](#database-caching) * [Application caching](#application-caching) * [Caching at the database query level](#caching-at-the-database-query-level) * [Caching at the object level](#caching-at-the-object-level) * [When to update the cache](#when-to-update-the-cache) * [Cache-aside](#cache-aside) * [Write-through](#write-through) * [Write-behind (write-back)](#write-behind-write-back) * [Refresh-ahead](#refresh-ahead) * [Asynchronism](#asynchronism) * [Message queues](#message-queues) * [Task queues](#task-queues) * [Back pressure](#back-pressure) * [Communication](#communication) * [Transmission control protocol (TCP)](#transmission-control-protocol-tcp) * [User datagram protocol (UDP)](#user-datagram-protocol-udp) * [Remote procedure call (RPC)](#remote-procedure-call-rpc) * [Representational state transfer (REST)](#representational-state-transfer-rest) * [Security](#security) * [Appendix](#appendix) * [Powers of two table](#powers-of-two-table) * [Latency numbers every programmer should know](#latency-numbers-every-programmer-should-know) * [Additional system design interview questions](#additional-system-design-interview-questions) * [Real world architectures](#real-world-architectures) * [Company architectures](#company-architectures) * [Company engineering blogs](#company-engineering-blogs) * [Under development](#under-development) * [Credits](#credits) * [Contact info](#contact-info) * [License](#license) ## Study guide > Предлагаемые темы для повторения в зависимости от того, сколько у вас есть времени для подготовки к интервью (мало, средне, много) ![Imgur](http://i.imgur.com/OfVllex.png) **Вопрос: Надо ли мне знать все из этого документа для интервью?** **Ответ: Нет, не обязательно**. То, что вас будут спрашивать на интервью, зависит от: * Вашего опыта - сколько времени и чем вы занимались * Должности, на которую вы собеседуетесь * Компания, в которую вы собеседуетесь * Удача Ожидается, что более опытные кандидаты в общем случае знают больше о проектировании систем, а архитекторы и руководители комманд знают больше, чем индивидуальные разработчики. Топовые IT компании скорее всего будут проводить один или более этапов собеседования по проектированию систем. Начинайте широко, и углубляейтесь в некоторые области. Это поможет узнать больше о различных темах по проектированию систем. Корректируйте ваш план в зависомости от того, сколько у вас есть времени, какой у вас опыт, на какую должность вы собеседуетесь и в какие компании. * **Короткий срок** - настраиватесь на **широту** покрытия тем. Тренируйтесь отвечать на **некоторые** вопросы. * **Средний срок** - настраиватесь на **широту** и **немного глубины** покрытия тем. Тренируйтесь отвечать на **многие** вопросы. * **Длительный срок** - настраиватесь на **широту** и **больше глубины** покрытия тем. Тренируйтесь отвечать на **большинство** вопросов. | | Малый срок | Средний срок | Длительный срок | |---|---|---|---| | Читайте [System design topics](#index-of-system-design-topics), чтобы получить общее понимание, как работают системы | :+1: | :+1: | :+1: | | Почитайте несколько статей из блогов компаний, в который вы собеседуетесь [Company engineering blogs](#company-engineering-blogs) | :+1: | :+1: | :+1: | | Посмотрите несколько [Real world architectures](#real-world-architectures) | :+1: | :+1: | :+1: | | [How to approach a system design interview question](#how-to-approach-a-system-design-interview-question) | :+1: | :+1: | :+1: | | [System design interview questions with solutions](#system-design-interview-questions-with-solutions) | Немного | Много | Большинство | | [Object-oriented design interview questions with solutions](#object-oriented-design-interview-questions-with-solutions) | Немного | Много | Большинство | | [Additional system design interview questions](#additional-system-design-interview-questions) | Немного | Много | Большинство | ## How to approach a system design interview question > Как отвечать на вопросы на интерьвю по проектированию систем Это интервью является **открытой беседой**. Ожидается, что вы возьмете инициативу по его ведению на себя. Изучите раздел [System design interview questions with solutions](#system-design-interview-questions-with-solutions) и используйте шаги, описанные ниже. ### Step 1: Outline use cases, constraints, and assumptions Соберите требование и оцените рамки задачи. Задавайте вопросы, чтобы уточнить варианты использования и ограничения. Обсудите допущения. * Кто будет использовать решение? * Как его будут использовать? * Сколько пользователей? * Что система должна делать? * Что система получает на вход, и что должно быть на выходе? * Какое количество данных система должна обрабатывать? * Сколько ожидается запросов в секунду? * Какое соотношение количества операций на чтение и запись? ### Step 2: Create a high level design Сделайте набросок проекта с наиболее важными компонентами: * Выделите главные компоненты и связи между ними * Обоснуйте ваши идеи ### Step 3: Design core components Детализируйте каждый компонент. Например, если вас попросили разработать [design a url shortening service](solutions/system_design/pastebin/README.md), обсудите следующие моменты: * Генерация и хранения хэша оригинального URL * [MD5](solutions/system_design/pastebin/README.md) и [Base62](solutions/system_design/pastebin/README.md) * Коллизии хэш-функции * SQL или NoSQL * Схема базы данных * Перевод хэшированного URL в оригинальный URL * Поиск в базе данных * API и объектно-ориентированное проектирование ### Step 4: Scale the design Определите узкие места и разберитесь с ними, учитывая данные ограничения. Например, для решение проблем с масштабируемостью, может ли вам понадобиться что-то из: * Балансировщик нагрузки * Горизонтальное машстабирование * Кэширование * Шардинг (sharding) базы данных Обсудите потенциальные варианты и уступки. Разберитесь с узкими местами используя [principles of scalable system design](#index-of-system-design-topics). ### Back-of-the-envelope calculations Вас могу спросить сделать оценку решения по некоторые параметрам. Некоторые разделы [Appendix](#appendix) могут с этим помочь: * [Use back of the envelope calculations](http://highscalability.com/blog/2011/1/26/google-pro-tip-use-back-of-the-envelope-calculations-to-choo.html) * [Powers of two table](#powers-of-two-table) * [Latency numbers every programmer should know](#latency-numbers-every-programmer-should-know) ### Source(s) and further reading Посмотрите следующие ссылки, чтобы понять, что можно ожидать (внешние ссылки без перевода): * [Use back of the envelope calculations](http://highscalability.com/blog/2011/1/26/google-pro-tip-use-back-of-the-envelope-calculations-to-choo.html) * [Powers of two table](#powers-of-two-table) * [Latency numbers every programmer should know](#latency-numbers-every-programmer-should-know) ## System design interview questions with solutions > Распространенные задачи с обсуждением, кодом и диаграммами. > > Решение находятся в директории `solutions/`. | Задача на проектирование | | |---|---| | Pastebin.com (или Bit.ly) | [Решение](solutions/system_design/pastebin/README.md) | | Лента и поиск в Twitter (или Facebook) | [Решение](solutions/system_design/twitter/README.md) | | Веб-сканер | [Решение](solutions/system_design/web_crawler/README.md) | | Система управление личными финансами Mint.com | [Решение](solutions/system_design/mint/README.md) | | Структура данных для социальной сети | [Решение](solutions/system_design/social_graph/README.md) | | Хранилище типа ключ-значение для поисковика | [Решение](solutions/system_design/query_cache/README.md) | | Рейтинг продаж по категориям в Amazon | [Решение](solutions/system_design/sales_rank/README.md) | | Система, которая масштабируется до миллиона пользователей на AWS | [Решение](solutions/system_design/scaling_aws/README.md) | | Добавьте задачу | [Решение](#contributing) | ### Design Pastebin.com (or Bit.ly) [Требования и решение](solutions/system_design/pastebin/README.md) ![Imgur](http://i.imgur.com/4edXG0T.png) ### Design the Twitter timeline and search (or Facebook feed and search) [Требования и решение](solutions/system_design/twitter/README.md) ![Imgur](http://i.imgur.com/jrUBAF7.png) ### Design a web crawler [Требования и решение](solutions/system_design/web_crawler/README.md) ![Imgur](http://i.imgur.com/bWxPtQA.png) ### Design Mint.com [Требования и решение](solutions/system_design/mint/README.md) ![Imgur](http://i.imgur.com/V5q57vU.png) ### Design the data structures for a social network [Требования и решение](solutions/system_design/social_graph/README.md) ![Imgur](http://i.imgur.com/cdCv5g7.png) ### Design a key-value store for a search engine [Требования и решение](solutions/system_design/query_cache/README.md) ![Imgur](http://i.imgur.com/4j99mhe.png) ### Design Amazon's sales ranking by category feature [Требование и решение](solutions/system_design/sales_rank/README.md) ![Imgur](http://i.imgur.com/MzExP06.png) ### Design a system that scales to millions of users on AWS [Требования и решение](solutions/system_design/scaling_aws/README.md) ![Imgur](http://i.imgur.com/jj3A5N8.png) ## Object-oriented design interview questions with solutions > Распространенные задачи с обсуждением, кодом и диаграммами. > > Решение находятся в директории `solutions/`. >**Внимание, этот раздел находится в стадии разработки** | Задачи на проектировние | | |---|---| | Хэш таблица | [Решение](solutions/object_oriented_design/hash_table/hash_map.ipynb) | | Кэширование с удалением давно используемых (Least recently used - LRU) | [Решение](solutions/object_oriented_design/lru_cache/lru_cache.ipynb) | | Центр обработки звонков | [Решение](solutions/object_oriented_design/call_center/call_center.ipynb) | | Колода карт | [Решение](solutions/object_oriented_design/deck_of_cards/deck_of_cards.ipynb) | | Парковка | [Решение](solutions/object_oriented_design/parking_lot/parking_lot.ipynb) | | Чат сервер | [Решение](solutions/object_oriented_design/online_chat/online_chat.ipynb) | | Циклический массив | [Contribute](#contributing) | | Добавьте задачу | [Contribute](#contributing) | ## System design topics: start here Только начинайте изучать проектирование систем? Для начала, вам понадобится понимание базовых принципов, как они используются, их преимущества и недостатки. ### Step 1: Review the scalability video lecture [Лекция по масштабированию в Гарварде](https://www.youtube.com/watch?v=-W9F__D3oY4) * Темы: * Вертикальное масштабирование * Горизонтальное масштабирование * Кэширование * Балансировка нагрузки * Репликация баз данных * Секцирование (Partitioning) баз данных ### Step 2: Review the scalability article [Масштабирование](http://www.lecloud.net/tagged/scalability/chrono) * Темы: * [Клонирование](http://www.lecloud.net/post/7295452622/scalability-for-dummies-part-1-clones) * [Базы данных](http://www.lecloud.net/post/7994751381/scalability-for-dummies-part-2-database) * [Кэши](http://www.lecloud.net/post/9246290032/scalability-for-dummies-part-3-cache) * [Асинхронность](http://www.lecloud.net/post/9699762917/scalability-for-dummies-part-4-asynchronism) ### Next steps Далее, изучим уступки в общем виде: * **Производительность** и **масштабирование** * **Задержка** и **пропускная способность** * **Доступность** и **согласованность данных** Помните, что **везде необходимы уступки**. Далее, изучем более детально DNS, CDN, балансировщики нагрузки и другие темы. ## Performance vs scalability Сервис считается **масштабируемым**, если его **производительность** растет пропорционально добавленным ресурсам. Обычно под увеличением производительности подразумевают увеличение количества обрабатываемых единиц работы. Однако, это может быть и обработка более крупных единиц работы, как, например, при росте объема данных.1 Иначе говоря: * если у вас проблемы с **производительностью**, ваша система медленная для одного пользователя; * если у вас проблемы с **масштабируемостью**, ваша системы быстрая для одного пользователя, но становится медленной под большой нагрузкой. ### Source(s) and further reading * [A word on scalability](http://www.allthingsdistributed.com/2006/03/a_word_on_scalability.html) * [Scalability, availability, stability, patterns](http://www.slideshare.net/jboner/scalability-availability-stability-patterns/) ## Latency vs throughput **Задержка** - это время, необходимое для выполнения действия или достижения некоторого результата. **Пропускная способность** - это количество такие действий или результататов в единицу времени. Обычно следует стремиться к **максимальной пропускной способности**, при этом сохраняя **задержку приемлимой**. ### Source(s) and further reading * [Understanding latency vs throughput](https://community.cadence.com/cadence_blogs_8/b/sd/archive/2010/09/13/understanding-latency-vs-throughput) ## Availability vs consistency ### CAP theorem


Источник: CAP theorem revisited
Дополнительный источник: Wikipedia

В распределенный системах можно обеспечить только два из трех свойств, указанных ниже: * **Согласованность данных (Consistency)** - каждый запрос на чтение возвращает самые актуальные данные либо ошибку. * **Доступность (Availability)** - любой запрос возвращает результат, но без гарантии, что он содержит самую актуальную версию данных. * **Устойчивость к разделению (Partition Tolerance)** - система продолжает работать, несмотря на произвольное разделение узлов системы из-за проблем с сетью. *Сетевые соединения ненадеждны, поэтому поддерживать **устойчивость к разделению** необходимо. Выбор придется делать между **согласованностью данных** и **доступностью**.* #### CP - consistency and partition tolerance При таком подходе ожидание ответа от узла может привести к ошибке - истечению времени ожидания (timeout error). CP решение хорошо подходит для систем, где необходима атомарность операций чтения и записи. #### AP - availability and partition tolerance При таком решении ответы на запросы возвращают данные, которые могут быть не самыми актуальными. Операция на запись может занять некоторое время, если придется ожидать восстановления потерянного соединения с одним из узлов распределенной системы. AP решение подходит для систем, где система должна продолжать работать несмотря на внешние ошибки и допустима [eventual consistency](#eventual-consistency). ### Source(s) and further reading * [CAP theorem revisited](http://robertgreiner.com/2014/08/cap-theorem-revisited/) * [A plain english introduction to CAP theorem](http://ksat.me/a-plain-english-introduction-to-cap-theorem) * [CAP FAQ](https://github.com/henryr/cap-faq) ## Consistency patterns В распределенной системе можете существовать несколько копий одних и тех же данных. Для достижения согласованности данных, получаемых клиенстким приложением, существует несколько подходов синхронизации этих копий. ### Weak consistency После операции записи данных, операция чтения может увидеть эти данные, а может и не увидеть. Используется подход, при котором можно сделать как можно лучше, но с учетом данной ситуации. Этот подход используеются в таких системах, как memcached. Слабая согласованность применяется в таких системах как VoIP, видео чаты и игры реального времени на несколько игроков. ### Eventual consistency После операции записи данных, операция чтения в конечном счете увидит эти данные (обычно в течение нескольких миллисекунд). Данных в таком случае реплицируются асинхронно. Такой подход используется в таких системах, как DNS и электронная почта. Согласованность в конечном счете хорошо подходит для систем с высокой доступностью. ### Strong consistency После операции записи данных, операция чтения увидит эти данны. Данные реплицируются синхронно. Такой подход используеются в файловых системаях и реляционных БД. Сильная согласованность хорошо подходит для систем, где требуются транзакции. ### Source(s) and further reading * [Transactions across data centers](http://snarfed.org/transactions_across_datacenters_io.html) ## Availability patterns Для обеспечения высокой доступности существует два основных паттерна: **отказоустойчивость** и **репликация**. ### Fail-over #### Active-passive В таком режиме, активный и пассивны сервер, находящийся в режиме ожидание, обмениваются специальными сообщениями - heartbeats. Если такой сообщение не получается, то пассивный сервер получает IP адрес активного сервера и восстанавливает работу сервера. Время простоя определяется в каком состоянии находится пассивный сервер: * горячее (hot) ожидание - сервер уже работает * холодное (cold) ожидание - сервер должен быть запущен. Только активный сервер может обрабатывать клиентские запросы. #### Active-active В таком режиме, оба сервера обрабатывают клиентские запросы, распределяют нагрузку между собой. Если сервера имеют общий доступ, то публичные IP адреса обоих серверов должны быть зарегистрированы в DNS. Если сервера находятся во внутренней сети, то клиентское приложение знать про оба сервера. Режим "активный-активный" также известен как "ведущий-ведущий". ### Disadvantage(s): failover * Отказоустойчивость делает систему более сложной и требует большего количества аппаратного обеспечения. * Существует вероятность потери данных, если данных не успели реплицироваться во время переключения активного и пассивного серверов. ### Replication #### Master-slave and master-master Эта тема обсуждается далее в разделе [Database](#database): * [Master-slave replication](#master-slave-replication) * [Master-master replication](#master-master-replication) ### Availability in numbers Доступность обычно измеряется как сотношение времени, когда система доступна ко всему промежутку времени измерения. Обычно это количество девяток. Говорят, что сервис с доступностью 99.99%, имеет доступность в четыре девятки. #### 99.9% availability - three 9s | Длительность | Допустимое время простоя | |------------------------|--------------------------| | Время простоя в год | 8ч 45мин 57сек | | Время простоя в месяц | 43мин 49.7сек | | Время простоя в неделю | 10мин 4.8сек | | Время простоя в день | 1мин 26.4сек | #### 99.99% availability - four 9s | Длительность | Допустимое время простоя | |------------------------|--------------------------| | Время простоя в год | 52мин 35.7сек | | Время простоя в месяц | 4мин 23сек | | Время простоя в неделю | 1мин 5сек | | Время простоя в день | 8.6сек | #### Availability in parallel vs in sequence Если сервис состоит из нескольких компонентов, которые могут отказать в обслуживании, доступность сервиса зависит от того, как связаны эти компоненты - последовательно или параллельно. ###### In sequence Общая доступность уменьшается, если два компонента (например, Foo и Bar) с доступностью менее 100% связаны последовательно: ``` Доступность (Общая) = Доступность (Foo) * Доступность (Bar) ``` ###### In parallel Общая доступность увеличивается, если два компонента с доступностью менее 100% связаны параллельно: ``` Доступность (Общая) = 1 - (1 - Доступность (Foo)) * (1 - Доступность (Bar)) ``` ## Domain name system TBD ### Disadvantage(s): DNS TBD ### Source(s) and further reading TBD ## Content delivery network TBD ### Push CDNs TBD ### Pull CDNs TBD ### Disadvantage(s): CDN TBD ### Source(s) and further reading TBD ## Load balancer TBD ### Layer 4 load balancing TBD ### Layer 7 load balancing TBD ### Horizontal scaling TBD #### Disadvantage(s): horizontal scaling TBD ### Disadvantage(s): load balancer TBD ### Source(s) and further reading TBD ## Reverse proxy (web server) TBD ### Load balancer vs reverse proxy TBD ### Disadvantage(s): reverse proxy TBD ### Source(s) and further reading TBD ## Application layer TBD ### Microservices TBD ### Service Discovery TBD ### Disadvantage(s): application layer TBD ### Source(s) and further reading TBD ## Database TBD ### Relational database management system (RDBMS) TBD #### Master-slave replication TBD ##### Disadvantage(s): master-slave replication TBD #### Master-master replication TBD ##### Disadvantage(s): master-master replication TBD ##### Disadvantage(s): replication TBD ##### Source(s) and further reading: replication TBD #### Federation TBD ##### Disadvantage(s): federation TBD ##### Source(s) and further reading: federation TBD #### Sharding TBD ##### Disadvantage(s): sharding TBD ##### Source(s) and further reading: sharding TBD #### Denormalization TBD ##### Disadvantage(s): denormalization TBD ###### Source(s) and further reading: denormalization TBD #### SQL tuning TBD ##### Tighten up the schema TBD ##### Use good indices TBD ##### Avoid expensive joins TBD ##### Partition tables TBD ##### Tune the query cache TBD ##### Source(s) and further reading: SQL tuning TBD ### NoSQL TBD #### Key-value store TBD ##### Source(s) and further reading: key-value store TBD #### Document store TBD ##### Source(s) and further reading: document store TBD #### Wide column store TBD ##### Source(s) and further reading: wide column store TBD #### Graph database TBD ##### Source(s) and further reading: graph TBD #### Source(s) and further reading: NoSQL TBD ### SQL or NoSQL TBD ##### Source(s) and further reading: SQL or NoSQL TBD ## Cache TBD ### Client caching TBD ### CDN caching TBD ### Web server caching TBD ### Database caching TBD ### Application caching TBD ### Caching at the database query level TBD ### Caching at the object level TBD ### When to update the cache TBD #### Cache-aside TBD ##### Disadvantage(s): cache-aside TBD #### Write-through TBD ##### Disadvantage(s): write through TBD #### Write-behind (write-back) TBD ##### Disadvantage(s): write-behind TBD #### Refresh-ahead TBD ##### Disadvantage(s): refresh-ahead TBD ### Disadvantage(s): cache TBD ### Source(s) and further reading TBD ## Asynchronism TBD ### Message queues TBD ### Task queues TBD ### Back pressure TBD ### Disadvantage(s): asynchronism TBD ### Source(s) and further reading TBD ## Communication TBD ### Hypertext transfer protocol (HTTP) TBD #### Source(s) and further reading: HTTP TBD ### Transmission control protocol (TCP) TBD ### User datagram protocol (UDP) TBD #### Source(s) and further reading: TCP and UDP TBD ### Remote procedure call (RPC) TBD #### Disadvantage(s): RPC TBD ### Representational state transfer (REST) TBD #### Disadvantage(s): REST TBD ### RPC and REST calls comparison TBD #### Source(s) and further reading: REST and RPC TBD ## Security TBD ### Source(s) and further reading TBD ## Appendix TBD ### Powers of two table TBD #### Source(s) and further reading TBD ### Latency numbers every programmer should know TBD #### Latency numbers visualized ![](https://camo.githubusercontent.com/77f72259e1eb58596b564d1ad823af1853bc60a3/687474703a2f2f692e696d6775722e636f6d2f6b307431652e706e67) #### Source(s) and further reading * [Latency numbers every programmer should know - 1](https://gist.github.com/jboner/2841832) * [Latency numbers every programmer should know - 2](https://gist.github.com/hellerbarde/2843375) * [Designs, lessons, and advice from building large distributed systems](http://www.cs.cornell.edu/projects/ladis2009/talks/dean-keynote-ladis2009.pdf) * [Software Engineering Advice from Building Large-Scale Distributed Systems](https://static.googleusercontent.com/media/research.google.com/en//people/jeff/stanford-295-talk.pdf) ### Additional system design interview questions > Распространенные задачи на интервью по проектированию систем со ссылками на решение. | Задача | Ссылки | |---|---| | Design a file sync service like Dropbox | [youtube.com](https://www.youtube.com/watch?v=PE4gwstWhmc) | | Design a search engine like Google | [queue.acm.org](http://queue.acm.org/detail.cfm?id=988407)
[stackexchange.com](http://programmers.stackexchange.com/questions/38324/interview-question-how-would-you-implement-google-search)
[ardendertat.com](http://www.ardendertat.com/2012/01/11/implementing-search-engines/)
[stanford.edu](http://infolab.stanford.edu/~backrub/google.html) | | Design a scalable web crawler like Google | [quora.com](https://www.quora.com/How-can-I-build-a-web-crawler-from-scratch) | | Design Google docs | [code.google.com](https://code.google.com/p/google-mobwrite/)
[neil.fraser.name](https://neil.fraser.name/writing/sync/) | | Design a key-value store like Redis | [slideshare.net](http://www.slideshare.net/dvirsky/introduction-to-redis) | | Design a cache system like Memcached | [slideshare.net](http://www.slideshare.net/oemebamo/introduction-to-memcached) | | Design a recommendation system like Amazon's | [hulu.com](https://web.archive.org/web/20170406065247/http://tech.hulu.com/blog/2011/09/19/recommendation-system.html)
[ijcai13.org](http://ijcai13.org/files/tutorial_slides/td3.pdf) | | Design a tinyurl system like Bitly | [n00tc0d3r.blogspot.com](http://n00tc0d3r.blogspot.com/) | | Design a chat app like WhatsApp | [highscalability.com](http://highscalability.com/blog/2014/2/26/the-whatsapp-architecture-facebook-bought-for-19-billion.html) | Design a picture sharing system like Instagram | [highscalability.com](http://highscalability.com/flickr-architecture)
[highscalability.com](http://highscalability.com/blog/2011/12/6/instagram-architecture-14-million-users-terabytes-of-photos.html) | | Design the Facebook news feed function | [quora.com](http://www.quora.com/What-are-best-practices-for-building-something-like-a-News-Feed)
[quora.com](http://www.quora.com/Activity-Streams/What-are-the-scaling-issues-to-keep-in-mind-while-developing-a-social-network-feed)
[slideshare.net](http://www.slideshare.net/danmckinley/etsy-activity-feeds-architecture) | | Design the Facebook timeline function | [facebook.com](https://www.facebook.com/note.php?note_id=10150468255628920)
[highscalability.com](http://highscalability.com/blog/2012/1/23/facebook-timeline-brought-to-you-by-the-power-of-denormaliza.html) | | Design the Facebook chat function | [erlang-factory.com](http://www.erlang-factory.com/upload/presentations/31/EugeneLetuchy-ErlangatFacebook.pdf)
[facebook.com](https://www.facebook.com/note.php?note_id=14218138919&id=9445547199&index=0) | | Design a graph search function like Facebook's | [facebook.com](https://www.facebook.com/notes/facebook-engineering/under-the-hood-building-out-the-infrastructure-for-graph-search/10151347573598920)
[facebook.com](https://www.facebook.com/notes/facebook-engineering/under-the-hood-indexing-and-ranking-in-graph-search/10151361720763920)
[facebook.com](https://www.facebook.com/notes/facebook-engineering/under-the-hood-the-natural-language-interface-of-graph-search/10151432733048920) | | Design a content delivery network like CloudFlare | [figshare.com](https://figshare.com/articles/Globally_distributed_content_delivery/6605972) | | Design a trending topic system like Twitter's | [michael-noll.com](http://www.michael-noll.com/blog/2013/01/18/implementing-real-time-trending-topics-in-storm/)
[snikolov .wordpress.com](http://snikolov.wordpress.com/2012/11/14/early-detection-of-twitter-trends/) | | Design a random ID generation system | [blog.twitter.com](https://blog.twitter.com/2010/announcing-snowflake)
[github.com](https://github.com/twitter/snowflake/) | | Return the top k requests during a time interval | [cs.ucsb.edu](https://www.cs.ucsb.edu/sites/cs.ucsb.edu/files/docs/reports/2005-23.pdf)
[wpi.edu](http://davis.wpi.edu/xmdv/docs/EDBT11-diyang.pdf) | | Design a system that serves data from multiple data centers | [highscalability.com](http://highscalability.com/blog/2009/8/24/how-google-serves-data-from-multiple-datacenters.html) | | Design an online multiplayer card game | [indieflashblog.com](http://www.indieflashblog.com/how-to-create-an-asynchronous-multiplayer-game.html)
[buildnewgames.com](http://buildnewgames.com/real-time-multiplayer/) | | Design a garbage collection system | [stuffwithstuff.com](http://journal.stuffwithstuff.com/2013/12/08/babys-first-garbage-collector/)
[washington.edu](http://courses.cs.washington.edu/courses/csep521/07wi/prj/rick.pdf) | | Design an API rate limiter | [https://stripe.com/blog/](https://stripe.com/blog/rate-limiters) | | Add a system design question | [Contribute](#contributing) | ### Real world architectures > Статья о том, как спроектированы действующие системы.


Источник: Twitter timelines at scale

**Не вдавайтесь в мельчайшие подробности, вместо этого:* * Определите основные принципы, общие технологии и шаблоны, которые встречаются в этих статьях * Изучите, какие проблемы решаются каждым компонентом, где это работает, а где нет * Обратите внимание секции, описывающие полученный опыт и работу над ошибками | Тип | Система | Ссылки | |---|---|---| | Обработка данных | **MapReduce** - Распределенная обработка данных от Google | [research.google.com](http://static.googleusercontent.com/media/research.google.com/zh-CN/us/archive/mapreduce-osdi04.pdf) | | Обработка данных | **Spark** - Распределенная обработка данных от Databricks | [slideshare.net](http://www.slideshare.net/AGrishchenko/apache-spark-architecture) | | Обработка данных | **Storm** - Распределенная обработка данных от Twitter | [slideshare.net](http://www.slideshare.net/previa/storm-16094009) | | | | | | Хранилище данных | **Bigtable** - Распределенная колоночная база данных от Google | [harvard.edu](http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/chang06bigtable.pdf) | | Хранилище данных | **HBase** - Реализация Bigtable с открытым исходным кодом | [slideshare.net](http://www.slideshare.net/alexbaranau/intro-to-hbase) | | Хранилище данных | **Cassandra** - Распределенная колоночная база данных от Facebook | [slideshare.net](http://www.slideshare.net/planetcassandra/cassandra-introduction-features-30103666) | Хранилище данных | **DynamoDB** - Документно-ориенитрованная база данных от Amazon | [harvard.edu](http://www.read.seas.harvard.edu/~kohler/class/cs239-w08/decandia07dynamo.pdf) | | Хранилище данных | **MongoDB** - Документно-ориенитрованная база данных | [slideshare.net](http://www.slideshare.net/mdirolf/introduction-to-mongodb) | | Хранилище данных | **Spanner** - Глобально-распределенная база данных от Google | [research.google.com](http://research.google.com/archive/spanner-osdi2012.pdf) | | Хранилище данных | **Memcached** - Распределенный кэш, хранящийся в памяти | [slideshare.net](http://www.slideshare.net/oemebamo/introduction-to-memcached) | | Хранилище данных | **Redis** - Распеределенная система кэширавния с возможностью сохранения и типами данных | [slideshare.net](http://www.slideshare.net/dvirsky/introduction-to-redis) | | | | | | Файловая система | **Google File System (GFS)** - Распределенная файловая система | [research.google.com](http://static.googleusercontent.com/media/research.google.com/zh-CN/us/archive/gfs-sosp2003.pdf) | | Файловая система | **Hadoop File System (HDFS)** - Реализация GFS с открытым исходным кодом | [apache.org](http://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html) | | | | | | Другое | **Chubby** - Система блокировки для слабосвязанных распределенных систем от Google | [research.google.com](http://static.googleusercontent.com/external_content/untrusted_dlcp/research.google.com/en/us/archive/chubby-osdi06.pdf) | | Другое | **Dapper** - Система отслеживания операций в распределенных системах | [research.google.com](http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/36356.pdf) | Другое | **Kafka** - Очередь сообщений Pub/sub от LinkedIn | [slideshare.net](http://www.slideshare.net/mumrah/kafka-talk-tri-hug) | | Другое | **Zookeeper** - Централизованная инфраструктура и сервисы для синхронизации распределенных систем | [slideshare.net](http://www.slideshare.net/sauravhaloi/introduction-to-apache-zookeeper) | | | Добавьте архитектуру | [Contribute](#contributing) | ### Company architectures | Компания | Ссылки | |---|---| | Amazon | [Amazon architecture](http://highscalability.com/amazon-architecture) | | Cinchcast | [Producing 1,500 hours of audio every day](http://highscalability.com/blog/2012/7/16/cinchcast-architecture-producing-1500-hours-of-audio-every-d.html) | | DataSift | [Realtime datamining At 120,000 tweets per second](http://highscalability.com/blog/2011/11/29/datasift-architecture-realtime-datamining-at-120000-tweets-p.html) | | DropBox | [How we've scaled Dropbox](https://www.youtube.com/watch?v=PE4gwstWhmc) | | ESPN | [Operating At 100,000 duh nuh nuhs per second](http://highscalability.com/blog/2013/11/4/espns-architecture-at-scale-operating-at-100000-duh-nuh-nuhs.html) | | Google | [Google architecture](http://highscalability.com/google-architecture) | | Instagram | [14 million users, terabytes of photos](http://highscalability.com/blog/2011/12/6/instagram-architecture-14-million-users-terabytes-of-photos.html)
[What powers Instagram](http://instagram-engineering.tumblr.com/post/13649370142/what-powers-instagram-hundreds-of-instances) | | Justin.tv | [Justin.Tv's live video broadcasting architecture](http://highscalability.com/blog/2010/3/16/justintvs-live-video-broadcasting-architecture.html) | | Facebook | [Scaling memcached at Facebook](https://cs.uwaterloo.ca/~brecht/courses/854-Emerging-2014/readings/key-value/fb-memcached-nsdi-2013.pdf)
[TAO: Facebook’s distributed data store for the social graph](https://cs.uwaterloo.ca/~brecht/courses/854-Emerging-2014/readings/data-store/tao-facebook-distributed-datastore-atc-2013.pdf)
[Facebook’s photo storage](https://www.usenix.org/legacy/event/osdi10/tech/full_papers/Beaver.pdf)
[How Facebook Live Streams To 800,000 Simultaneous Viewers](http://highscalability.com/blog/2016/6/27/how-facebook-live-streams-to-800000-simultaneous-viewers.html) | | Flickr | [Flickr architecture](http://highscalability.com/flickr-architecture) | | Mailbox | [From 0 to one million users in 6 weeks](http://highscalability.com/blog/2013/6/18/scaling-mailbox-from-0-to-one-million-users-in-6-weeks-and-1.html) | | Netflix | [A 360 Degree View Of The Entire Netflix Stack](http://highscalability.com/blog/2015/11/9/a-360-degree-view-of-the-entire-netflix-stack.html)
[Netflix: What Happens When You Press Play?](http://highscalability.com/blog/2017/12/11/netflix-what-happens-when-you-press-play.html) | | Pinterest | [From 0 To 10s of billions of page views a month](http://highscalability.com/blog/2013/4/15/scaling-pinterest-from-0-to-10s-of-billions-of-page-views-a.html)
[18 million visitors, 10x growth, 12 employees](http://highscalability.com/blog/2012/5/21/pinterest-architecture-update-18-million-visitors-10x-growth.html) | | Playfish | [50 million monthly users and growing](http://highscalability.com/blog/2010/9/21/playfishs-social-gaming-architecture-50-million-monthly-user.html) | | PlentyOfFish | [PlentyOfFish architecture](http://highscalability.com/plentyoffish-architecture) | | Salesforce | [How they handle 1.3 billion transactions a day](http://highscalability.com/blog/2013/9/23/salesforce-architecture-how-they-handle-13-billion-transacti.html) | | Stack Overflow | [Stack Overflow architecture](http://highscalability.com/blog/2009/8/5/stack-overflow-architecture.html) | | TripAdvisor | [40M visitors, 200M dynamic page views, 30TB data](http://highscalability.com/blog/2011/6/27/tripadvisor-architecture-40m-visitors-200m-dynamic-page-view.html) | | Tumblr | [15 billion page views a month](http://highscalability.com/blog/2012/2/13/tumblr-architecture-15-billion-page-views-a-month-and-harder.html) | | Twitter | [Making Twitter 10000 percent faster](http://highscalability.com/scaling-twitter-making-twitter-10000-percent-faster)
[Storing 250 million tweets a day using MySQL](http://highscalability.com/blog/2011/12/19/how-twitter-stores-250-million-tweets-a-day-using-mysql.html)
[150M active users, 300K QPS, a 22 MB/S firehose](http://highscalability.com/blog/2013/7/8/the-architecture-twitter-uses-to-deal-with-150m-active-users.html)
[Timelines at scale](https://www.infoq.com/presentations/Twitter-Timeline-Scalability)
[Big and small data at Twitter](https://www.youtube.com/watch?v=5cKTP36HVgI)
[Operations at Twitter: scaling beyond 100 million users](https://www.youtube.com/watch?v=z8LU0Cj6BOU)
[How Twitter Handles 3,000 Images Per Second](http://highscalability.com/blog/2016/4/20/how-twitter-handles-3000-images-per-second.html) | | Uber | [How Uber scales their real-time market platform](http://highscalability.com/blog/2015/9/14/how-uber-scales-their-real-time-market-platform.html)
[Lessons Learned From Scaling Uber To 2000 Engineers, 1000 Services, And 8000 Git Repositories](http://highscalability.com/blog/2016/10/12/lessons-learned-from-scaling-uber-to-2000-engineers-1000-ser.html) | | WhatsApp | [The WhatsApp architecture Facebook bought for $19 billion](http://highscalability.com/blog/2014/2/26/the-whatsapp-architecture-facebook-bought-for-19-billion.html) | | YouTube | [YouTube scalability](https://www.youtube.com/watch?v=w5WVu624fY8)
[YouTube architecture](http://highscalability.com/youtube-architecture) | ### Company engineering blogs > Вопросы могут быть связаны с архитектурой компаний, в которые вы собеседуетесь. * [Airbnb Engineering](http://nerds.airbnb.com/) * [Atlassian Developers](https://developer.atlassian.com/blog/) * [AWS Blog](https://aws.amazon.com/blogs/aws/) * [Bitly Engineering Blog](http://word.bitly.com/) * [Box Blogs](https://blog.box.com/blog/category/engineering) * [Cloudera Developer Blog](http://blog.cloudera.com/) * [Dropbox Tech Blog](https://tech.dropbox.com/) * [Engineering at Quora](http://engineering.quora.com/) * [Ebay Tech Blog](http://www.ebaytechblog.com/) * [Evernote Tech Blog](https://blog.evernote.com/tech/) * [Etsy Code as Craft](http://codeascraft.com/) * [Facebook Engineering](https://www.facebook.com/Engineering) * [Flickr Code](http://code.flickr.net/) * [Foursquare Engineering Blog](http://engineering.foursquare.com/) * [GitHub Engineering Blog](http://githubengineering.com/) * [Google Research Blog](http://googleresearch.blogspot.com/) * [Groupon Engineering Blog](https://engineering.groupon.com/) * [Heroku Engineering Blog](https://engineering.heroku.com/) * [Hubspot Engineering Blog](http://product.hubspot.com/blog/topic/engineering) * [High Scalability](http://highscalability.com/) * [Instagram Engineering](http://instagram-engineering.tumblr.com/) * [Intel Software Blog](https://software.intel.com/en-us/blogs/) * [Jane Street Tech Blog](https://blogs.janestreet.com/category/ocaml/) * [LinkedIn Engineering](http://engineering.linkedin.com/blog) * [Microsoft Engineering](https://engineering.microsoft.com/) * [Microsoft Python Engineering](https://blogs.msdn.microsoft.com/pythonengineering/) * [Netflix Tech Blog](http://techblog.netflix.com/) * [Paypal Developer Blog](https://devblog.paypal.com/category/engineering/) * [Pinterest Engineering Blog](https://medium.com/@Pinterest_Engineering) * [Quora Engineering](https://engineering.quora.com/) * [Reddit Blog](http://www.redditblog.com/) * [Salesforce Engineering Blog](https://developer.salesforce.com/blogs/engineering/) * [Slack Engineering Blog](https://slack.engineering/) * [Spotify Labs](https://labs.spotify.com/) * [Twilio Engineering Blog](http://www.twilio.com/engineering) * [Twitter Engineering](https://blog.twitter.com/engineering/) * [Uber Engineering Blog](http://eng.uber.com/) * [Yahoo Engineering Blog](http://yahooeng.tumblr.com/) * [Yelp Engineering Blog](http://engineeringblog.yelp.com/) * [Zynga Engineering Blog](https://www.zynga.com/blogs/engineering) #### Source(s) and further reading Хотите добавить блог? Во избежание дублирования, добавьте его в этот репозиторий: * [kilimchoi/engineering-blogs](https://github.com/kilimchoi/engineering-blogs) ## Under development Заинтересованы в добавлении раздела или в завершении того, что уже в процессе? [Содействуйте!](#contributing)! * Распределенные вычисления с MapReduce * Согласованное хеширование * Scatter gather * [Содействие](#contributing) ## Credits Источники указаны в самом документе. Особая благодарность: * [Hired in tech](http://www.hiredintech.com/system-design/the-system-design-process/) * [Cracking the coding interview](https://www.amazon.com/dp/0984782850/) * [High scalability](http://highscalability.com/) * [checkcheckzz/system-design-interview](https://github.com/checkcheckzz/system-design-interview) * [shashank88/system_design](https://github.com/shashank88/system_design) * [mmcgrana/services-engineering](https://github.com/mmcgrana/services-engineering) * [System design cheat sheet](https://gist.github.com/vasanthk/485d1c25737e8e72759f) * [A distributed systems reading list](http://dancres.github.io/Pages/) * [Cracking the system design interview](http://www.puncsky.com/blog/2016-02-13-crack-the-system-design-interview) ## Contact info Сообщайте мне, если вы хотите обсудить любые проблемы, вопросы или комментарии к этому документу. Моя контактная информация доступна здесь: [GitHub page](https://github.com/donnemartin). ## License *I am providing code and resources in this repository to you under an open source license. Because this is my personal repository, the license you receive to my code and resources is from me and not my employer (Facebook).* Copyright 2017 Donne Martin Creative Commons Attribution 4.0 International License (CC BY 4.0) http://creativecommons.org/licenses/by/4.0/