1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/hufengjiu-system-design-primer

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

Системный дизайн: руководство

Системный дизайн: руководство


Мотивация

Научитесь проектировать крупномасштабные системы.

Подготовьтесь к собеседованию по системному дизайну.

Научитесь проектировать крупномасштабные системы

Умение проектировать масштабируемые системы поможет вам стать лучшим инженером.

Системный дизайн — обширная тема. В интернете можно найти огромное количество ресурсов, посвящённых принципам системного дизайна.

Это репозиторий представляет собой организованную коллекцию ресурсов, которые помогут вам научиться создавать масштабные системы.

Учитесь у сообщества открытого исходного кода

Этот проект постоянно обновляется и является открытым исходным кодом.

Вклад приветствуется!

Подготовьтесь к собеседованию по системному дизайну

Помимо собеседований по кодированию, системный дизайн является обязательным компонентом процесса технического собеседования во многих технологических компаниях.

Практикуйте распространённые вопросы собеседования по системному дизайну и сравнивайте свои результаты с образцовыми решениями: обсуждениями, кодом и диаграммами.

Дополнительные темы для подготовки к собеседованию:

Флеш-карточки Анки


Предоставленные колоды флеш-карт Анки используют повторение через определённые промежутки времени, чтобы помочь вам запомнить ключевые концепции системного дизайна.

  • Колода системного дизайна [https://github.com/donnemartin/system-design-primer/tree/master/resources/flash_cards/System%20Design.apkg]
  • Колода упражнений по системному дизайну [https://github.com/donnemartin/system-design-primer/tree/master/resources/flash_cards/System%20Design%20Exercises.apkg]
  • Колода упражнений по объектно-ориентированному дизайну [https://github.com/donnemartin/system-design-primer/tree/master/resources/flash_cards/OO%20Design.apkg]

Отлично подходит для использования в дороге.

Ресурсы для кодирования: интерактивные задачи по кодированию

Ищете ресурсы, которые помогут подготовиться к собеседованию по кодированию?


Обратите внимание на сестринский репозиторий Интерактивные задачи по кодированию, который содержит дополнительную колоду Анки. Контрибьютинг

Учитесь у сообщества.

Не стесняйтесь отправлять пул реквесты, чтобы помочь:

  • исправить ошибки;
  • улучшить разделы;
  • добавить новые разделы;
  • перевести.

Контент, который нуждается в доработке, помещён в раздел «В разработке».

Ознакомьтесь с руководством по контрибьютингу.

Индекс тем проектирования систем

Резюме различных тем проектирования систем, включая плюсы и минусы. Всё — это компромисс.

Каждый раздел содержит ссылки на более подробные ресурсы.


В запросе не было обнаружено кода на каком-либо языке программирования, гиперссылок, специальных тегов форматирования в markdown, html, yaml, json, plantuml и других. Процедура вызова (RPC)

  • Представительский государственный трансфер (REST).
  • Безопасность.
  • Приложение:
    • Таблица степеней двойки.
    • Числа задержки, которые должен знать каждый программист.
    • Дополнительные вопросы на собеседовании по системному проектированию.
    • Реальные архитектуры.
    • Архитектуры компаний.
    • Инженерные блоги компаний.
  • В разработке.
  • Благодарности.
  • Контактная информация.
  • Лицензия.

Учебное пособие

Предлагаемые темы для изучения в зависимости от вашего расписания интервью (краткосрочное, среднесрочное, долгосрочное).

Вопрос: Нужно ли мне знать всё это для собеседования?

Ответ: Нет, вам не нужно знать всё это, чтобы подготовиться к собеседованию.

То, что вас спросят на собеседовании, зависит от таких переменных, как:

  • Ваш опыт работы;
  • Ваша техническая подготовка;
  • На какую должность вы претендуете;
  • С какими компаниями вы проводите собеседование;
  • Удача.

От кандидатов с большим опытом обычно ожидают более глубоких знаний о системном проектировании. От архитекторов или руководителей команд могут ожидать больше знаний, чем от отдельных участников. Ведущие технологические компании, вероятно, проведут один или несколько раундов собеседования по дизайну системы.

Начните широко и углубитесь в нескольких областях. Полезно иметь представление о различных ключевых темах системного проектирования. Адаптируйте следующее руководство в соответствии с вашим графиком, опытом, должностями, на которые вы претендуете, и компаниями, с которыми вы проводите собеседование.

Краткосрочное Среднесрочное Долгосрочное
Прочтите Темы системного проектирования, чтобы получить общее представление о том, как работают системы :+1: :+1: :+1:
Прочитайте несколько статей в Инженерных блогах компаний для компаний, в которых вы проходите собеседование :+1: :+1: :+1:
Ознакомьтесь с несколькими Реальными архитектурами :+1: :+1: :+1:
Изучите Как подойти к вопросу собеседования по системному дизайну :+1: :+1: :+1:
Решите Вопросы собеседования по системному дизайну с решениями Некоторые Многие Большинство
Решите Вопросы объектно-ориентированного проектирования с решениями Некоторые Многие Большинство
Повторите Дополнительные вопросы собеседования по системному дизайну Некоторые Многие Большинство

Как подойти к вопросу собеседования по системному дизайну

Как решить вопрос собеседования по системному дизайну.

Собеседование по системному дизайну — это открытый разговор. Вы должны его вести.

Вы можете использовать следующие шаги, чтобы направлять обсуждение. Чтобы закрепить этот процесс, проработайте раздел Вопросы собеседования по системному дизайну с решениями, используя следующие шаги.

Шаг 1: Опишите варианты использования, ограничения и предположения

Соберите требования и определите рамки проблемы. Задайте вопросы, чтобы уточнить варианты использования и ограничения. Обсудите предположения.

  • Кто будет его использовать?
  • Как они будут его использовать?
  • Сколько пользователей?
  • Что делает система?
  • Каковы входы и выходы системы?
  • Какой объём данных мы ожидаем обработать?
  • Какое количество запросов в секунду мы ожидаем?
  • Каково ожидаемое соотношение чтения и записи? High level design

Опишите высокоуровневый дизайн со всеми важными компонентами.

  • Нарисуйте основные компоненты и связи.
  • Обоснуйте свои идеи.

Шаг 3: Дизайн основных компонентов

Подробно опишите каждый основной компонент. Например, если бы вас попросили разработать сервис сокращения URL, обсудите:

  • Генерацию и хранение хэша полного URL.
    • MD5 (solutions/system_design/pastebin/README.md) и Base62 (solutions/system_design/pastebin/README.md).
    • Коллизии хэшей.
    • SQL или NoSQL.
    • Схему базы данных.
  • Перевод хэшированного URL в полный URL.
    • Поиск в базе данных.
  • API и объектно-ориентированный дизайн.

Шаг 4: Масштабирование дизайна

Определите и устраните узкие места с учётом ограничений. Например, нужно ли вам следующее для решения проблем масштабируемости?

  • Балансировщик нагрузки.
  • Горизонтальное масштабирование.
  • Кэширование.
  • Сегментирование базы данных.

Обсудите возможные решения и компромиссы. Всё является компромиссом. Устраните узкие места, используя принципы масштабируемого системного дизайна.

Приблизительные расчёты

Вас могут попросить сделать некоторые оценки вручную. Обратитесь к Приложению за следующими ресурсами:

Источники и дополнительная литература

Посмотрите следующие ссылки, чтобы получить лучшее представление о том, чего ожидать:

Вопросы собеседования по системному проектированию с решениями

Распространённые вопросы собеседования по системному проектированию с примерами обсуждений, кодом и диаграммами.

Решения связаны с содержимым папки solutions/.

Вопрос
Разработайте Pastebin.com (или Bit.ly) Решение
Разработайте временную шкалу и поиск Twitter (или ленту новостей и поиск Facebook) Решение
Разработайте веб-сканер Решение
Разработайте Mint.com Решение
Разработайте структуры данных для социальной сети Решение
Разработайте хранилище «ключ-значение» для поисковой системы Решение
Разработайте систему ранжирования продаж Amazon по категориям Решение
Разработайте масштабируемую систему на AWS Решение
Добавьте вопрос по системному проектированию Внести вклад

Разработайте Pastebin.com (или Bit.ly)

Посмотреть упражнение и решение

Imgur

Разработайте временную шкалу и поиск Twitter (или ленту новостей и поиск Facebook)

Посмотреть упражнение и решение

Imgur

Разработайте веб-сканер

Посмотреть упражнение и решение

Imgur

Разработайте Mint.com

Посмотреть упражнение и решение

Imgur

Разработайте структуры данных для социальной сети

Посмотреть упражнение и решение

Imgur

Разработайте хранилище «ключ-значение» для поисковой системы

Посмотреть упражнение и решение

Imgur

Разработайте систему ранжирования продаж Amazon по категориям

Посмотреть решение ### Проектирование системы, масштабируемой до миллионов пользователей на AWS

Посмотреть упражнение и решение

Imgur

Спроектируйте систему, которая масштабируется до миллионов пользователей на AWS.

Посмотреть упражнение и решение

Imgur

Вопросы для собеседования по объектно-ориентированному проектированию с решениями

Общие вопросы для собеседования по объектно-ориентированному дизайну с примерами обсуждений, кодом и диаграммами.

Решения связаны с содержимым в папке solutions/

Примечание: этот раздел находится в разработке

Вопрос
Спроектировать хеш-таблицу Решение
Разработать наименее используемый кеш Решение
Спроектировать кол-центр Решение
Создать колоду карт Решение
Продумать парковку Решение
Организовать чат-сервер Решение
Описать круговой массив Внести вклад
Добавить вопрос по объектно-ориентированному проектированию Внести вклад

Темы системного проектирования: начните здесь

Новичок в системном проектировании?

Сначала вам потребуется базовое понимание общих принципов, изучение того, что они собой представляют, как они используются, их плюсы и минусы.

Шаг 1: просмотрите видеолекцию о масштабируемости

Лекция о масштабируемости в Гарварде

  • Темы:
    • Вертикальное масштабирование
    • Горизонтальное масштабирование
    • Кэширование
    • Балансировка нагрузки
    • Репликация базы данных
    • Секционирование базы данных

Шаг 2: ознакомьтесь со статьёй о масштабируемости

Масштабируемость

Следующие шаги

Далее мы рассмотрим высокоуровневые компромиссы:

  • Производительность против масштабируемости
  • Задержка против пропускной способности
  • Доступность против согласованности

Имейте в виду, что всё является компромиссом.

Затем мы углубимся в более конкретные темы, такие как DNS, CDN и балансировщики нагрузки.

Производительность против масштабируемости

Сервис масштабируем, если он приводит к увеличению производительности пропорционально добавленным ресурсам. Как правило, повышение производительности означает обслуживание большего количества единиц работы, но это также может быть связано с обработкой более крупных единиц работы, например, когда наборы данных растут.1

Другой способ взглянуть на производительность и масштабируемость:

  • Если у вас проблема с производительностью, ваша система работает медленно для одного пользователя.
  • Если у вас есть проблема с масштабируемостью, ваша система быстро работает для одного пользователя, но медленно при большой нагрузке.

Источник(и) и дальнейшее чтение

Задержка против пропускной способности

Задержка — это время, необходимое для выполнения какого-либо действия или получения какого-либо результата.

Пропускная способность — это количество таких действий или результатов за единицу времени.

Как правило, следует стремиться к максимальной пропускной способности с приемлемой задержкой.

Источник(и) и дальнейшее чтение

Доступность против согласованности

Теорема CAP


Согласованность — каждое чтение получает самое последнее записанное значение или ошибку. Доступность — каждый запрос получает ответ, без гарантии того, что он содержит самую последнюю версию информации. Устойчивость к разделению — система продолжает работать несмотря на произвольное разделение из-за сетевых сбоев.

Сети ненадёжны, поэтому вам потребуется поддерживать устойчивость к разделению. Вам придётся искать компромисс между согласованностью и доступностью в программном обеспечении.

CP — согласованность и устойчивость к разделению

Ожидание ответа от разделённого узла может привести к ошибке тайм-аута. CP является хорошим выбором, если потребности бизнеса требуют атомарного чтения и записи.

AP — доступность и устойчивость к разделению

Ответы возвращают наиболее доступную версию данных, доступных на любом узле, которая может быть не самой последней. Запись может занять некоторое время для распространения после разрешения разделения.

AP является хорошим выбором, когда бизнес должен допускать возможную согласованность или когда системе необходимо продолжать работу, несмотря на внешние ошибки.

Источники и дальнейшее чтение

Модели согласованности

Имея несколько копий одних и тех же данных, мы сталкиваемся с вариантами их синхронизации, чтобы клиенты имели согласованное представление о данных. Вспомните определение согласованности из теоремы CAP — каждое чтение получает самое последнее записанное значение или ошибку.

Слабая согласованность

После записи чтение может увидеть её, а может и нет. Используется подход «наилучших усилий».

Этот подход используется в таких системах, как memcached. Слабая согласованность хорошо работает в случаях реального времени, таких как VoIP, видеочат и многопользовательские игры в реальном времени. Например, если вы разговариваете по телефону и теряете связь на несколько секунд, то при восстановлении соединения вы не слышите, что было сказано во время потери связи.

Возможная согласованность

После записи чтения в конечном итоге увидят её (обычно в течение миллисекунд). Данные реплицируются асинхронно.

Этот подход используется в таких системах, как DNS и электронная почта. Возможная согласованность хорошо работает в высокодоступных системах.

Сильная согласованность

После записи чтения увидят её. Данные реплицируются синхронно.

Этот подход используется в файловых системах и RDBMS. Сильная согласованность хорошо работает в системах, требующих транзакций.

Источники и дальнейшее чтение

Модели доступности

Существует два взаимодополняющих шаблона для обеспечения высокой доступности: отработка отказа и репликация.

Отработка отказа

Активный-пассивный

При активном-пассивном режиме отработки отказа между активным и пассивным серверами в режиме ожидания отправляются контрольные сигналы. Если контрольный сигнал прерывается, пассивный сервер берёт на себя IP-адрес активного и возобновляет обслуживание.

Продолжительность простоя определяется тем, работает ли пассивный сервер уже в «горячем» режиме ожидания или ему нужно запускаться из «холодного» режима ожидания. Только активный сервер обрабатывает трафик.

Активную-пассивную отработку отказа также можно назвать отработкой отказа ведущий-ведомый.

Активный-активный

В активном-активном режиме оба сервера управляют трафиком, распределяя нагрузку между собой.

Если серверы общедоступны, DNS должен знать об общедоступных IP-адресах обоих серверов. Если серверы являются внутренними, логике приложения необходимо знать о обоих серверах.

Активный-активную отработку отказа также можно назвать отработкой отказа главный-главный.

Недостатки отработки отказа

  • Отработка отказа добавляет больше оборудования и дополнительную сложность.
  • Существует... Потенциальный риск потери данных при сбое активной системы до репликации вновь записанных данных в пассивную.

Репликация

Ведущий-ведомый и ведущий-ведущий

Эта тема подробнее обсуждается в разделе [База данных](#база данных):

Доступность в цифрах

Доступность часто измеряется временем бесперебойной работы (или простоя) как процент времени, когда услуга доступна. Доступность обычно измеряется количеством девяток — услуга с доступностью 99,99 % описывается как имеющая четыре девятки.

Доступность 99.9 % — три девятки

Длительность Допустимое время простоя
Простой в год 8 часов 45 минут 57 секунд
Простой в месяц 43 минуты 49,7 секунды
Простой в неделю 10 минут 4,8 секунды
Простой за день 1 минута 26,4 секунды

Доступность 99.99 % — четыре девятки

Длительность Допустимое время простоя
Простой в год 52 минуты 35,7 секунды
Простой в месяц 4 минуты 23 секунды
Простой в неделю 1 минута 5 секунд
Простой за день 8,6 секунды

Доступность параллельно или последовательно

Если сервис состоит из нескольких компонентов, подверженных сбоям, общая доступность сервиса зависит от того, работают ли компоненты последовательно или параллельно.

Последовательно

Общая доступность снижается, если два компонента с доступностью < 100 % работают последовательно:

Доступность (общая) = Доступность (Foo) * Доступность (Bar)

Если у Foo и Bar была доступность 99,9 %, их общая доступность в последовательном режиме составила бы 99,8 %.

Параллельно

Общая доступность увеличивается, если два компонента с доступностью < 100 % работают параллельно:

Доступность (общая) = 1 - (1 - Доступность (Foo)) * (1 - Доступность (Bar))

Если у Foo и Bar была доступность 99,9 %, их общая доступность в параллельном режиме составила бы 99,9999 %.

Система доменных имён


Источник: презентация по безопасности DNS

Система доменных имён (DNS) преобразует доменное имя, например www.example.com, в IP-адрес.

DNS иерархична, с несколькими авторитетными серверами на верхнем уровне. Ваш маршрутизатор или интернет-провайдер предоставляет информацию о том, к какому DNS-серверу(ам) обращаться при поиске. Серверы нижнего уровня кэшируют сопоставления, которые могут стать устаревшими из-за задержек распространения DNS. Результаты DNS также могут быть кэшированы вашим браузером или ОС на определённый период времени, определяемый временем жизни (TTL).

  • Запись NS (сервер имён) — указывает на DNS-серверы для вашего домена/поддомена.
  • Запись MX (обмен почтой) — указывает почтовые серверы для приёма сообщений.
  • Запись A (адрес) — связывает имя с IP-адресом.
  • Запись CNAME (каноническая) — связывает имя с другим именем или записью CNAME (например, example.com с www.example.com) или с записью A.

Такие сервисы, как CloudFlare и Route 53, предоставляют управляемые DNS-сервисы. Некоторые DNS-службы могут направлять трафик различными способами:

Недостатки: DNS

  • Обращение к DNS-серверу вызывает небольшую задержку, хотя она смягчается описанным выше кэшированием.
  • Управление DNS-сервером может быть сложным и обычно осуществляется [правительствами, интернет-провайдерами и крупными компаниями]. Потенциально дорогостоящие операции
  • Устраняют необходимость установки X.509 сертификатов на каждом сервере.
  • Постоянство сессии — выдача cookie и направление запросов конкретного клиента к одному и тому же экземпляру, если веб-приложения не отслеживают сессии.

Для защиты от сбоев обычно настраивают несколько балансировщиков нагрузки либо в режиме активный-пассивный, либо активный-активный.

Балансировщики нагрузки могут направлять трафик на основе различных метрик, включая:

Уровень 4 балансировки нагрузки

Балансировщик нагрузки уровня 4 анализирует информацию на транспортном уровне, чтобы решить, как распределять запросы. Обычно это включает в себя исходный и целевой IP-адреса и порты в заголовке, но не содержимое пакета. Балансировщики нагрузки уровня 4 пересылают сетевые пакеты на вышестоящий сервер и обратно, выполняя трансляцию сетевых адресов (NAT).

Уровень 7 балансировки нагрузки

Балансировщик нагрузки уровня 7 анализирует прикладной уровень, чтобы определить, как распределить запросы. Это может включать содержимое заголовка, сообщения и cookie. Балансировщик нагрузки уровня 7 завершает сетевой трафик, читает сообщение, принимает решение о балансировке нагрузки, а затем устанавливает соединение с выбранным сервером. Например, балансировщик нагрузки уровня 7 может направлять видеопоток на серверы, на которых размещены видео, и направлять более чувствительный пользовательский биллинговый трафик на защищённые серверы.

За счёт гибкости балансировка нагрузки уровня 4 требует меньше времени и вычислительных ресурсов, чем уровня 7, хотя влияние на производительность может быть минимальным на современном коммерческом оборудовании.

Горизонтальное масштабирование

Балансировщики нагрузки также помогают с горизонтальным масштабированием, улучшая производительность и доступность. Масштабирование за счёт использования коммерческих машин более экономично и приводит к более высокой доступности, чем вертикальное масштабирование одного сервера на более дорогом оборудовании. Также легче найти специалистов для работы на коммерческом оборудовании, чем для специализированных корпоративных систем.

Недостатки горизонтального масштабирования:

  • Масштабирование по горизонтали усложняет систему и включает клонирование серверов.
    • Серверы должны быть без состояния: они не должны содержать никаких данных, связанных с пользователями, таких как сессии или изображения профиля.
    • Сессии можно хранить в централизованном хранилище данных, таком как база данных (SQL, NoSQL) или постоянный кэш (Redis, Memcached).
  • Вниз по потоку серверы, такие как кэши и базы данных, должны обрабатывать больше одновременных подключений по мере масштабирования вверх по потоку.

Недостатки балансировщика нагрузки:

  • Балансировщик нагрузки может стать узким местом в производительности, если у него недостаточно ресурсов или он неправильно настроен.
  • Добавление балансировщика нагрузки для устранения единой точки отказа приводит к увеличению сложности.
  • Один балансировщик нагрузки является единой точкой отказа, настройка нескольких балансировщиков ещё больше увеличивает сложность.

Источники и дополнительная литература

Обратный прокси (веб-сервер) Обратный прокси-сервер — это веб-сервер, который централизует внутренние службы и предоставляет унифицированные интерфейсы для общественности. Запросы от клиентов направляются на сервер, который может их выполнить, прежде чем обратный прокси-сервер вернёт ответ сервера клиенту.

Дополнительные преимущества включают:

  • Повышенную безопасность — скрытие информации о внутренних серверах, чёрный список IP-адресов, ограничение количества подключений на одного клиента;
  • Увеличенную масштабируемость и гибкость — клиенты видят только IP-адрес обратного прокси-сервера, что позволяет масштабировать серверы или изменять их конфигурацию;
  • Терминацию SSL — расшифровку входящих запросов и шифрование ответов сервера, чтобы внутренним серверам не приходилось выполнять эти потенциально дорогостоящие операции;
  • Удаление необходимости установки сертификатов X.509 на каждом сервере;
  • Сжатие — сжатие ответов серверов;
  • Кэширование — возврат ответа для кэшированных запросов;
  • Статический контент — непосредственное обслуживание статического контента: HTML/CSS/JS, фотографии, видео и т. д.

Балансировщик нагрузки против обратного прокси

  • Развёртывание балансировщика нагрузки полезно, когда у вас есть несколько серверов. Часто балансировщики нагрузки направляют трафик на набор серверов, выполняющих одну и ту же функцию.
  • Обратные прокси могут быть полезны даже с одним веб-сервером или сервером приложений, открывая преимущества, описанные в предыдущем разделе.
  • Решения, такие как NGINX и HAProxy, могут поддерживать как обратный прокси уровня 7, так и балансировку нагрузки.

Недостатки обратного прокси

  • Введение обратного прокси приводит к увеличению сложности.
  • Один обратный прокси является единой точкой отказа, а настройка нескольких обратных прокси (например, отказоустойчивость) ещё больше увеличивает сложность.

Источники и дальнейшее чтение

Прикладной уровень


Источник: Введение в архитектуру систем для масштабирования

Отделение веб-слоя от прикладного слоя (также известного как платформенный слой) позволяет независимо масштабировать и настраивать оба слоя. Добавление нового API приводит к добавлению серверов приложений без обязательного добавления дополнительных веб-серверов. Принцип единственной ответственности выступает за небольшие и автономные сервисы, которые работают вместе. Небольшие команды с небольшими сервисами могут более агрессивно планировать быстрый рост.

Работники прикладного уровня также помогают обеспечить асинхронность.

Микросервисы

С этим обсуждением связаны микросервисы, которые можно описать как набор независимо развёртываемых, небольших, модульных сервисов. Каждый сервис работает в уникальном процессе и общается через чётко определённый, лёгкий механизм для достижения бизнес-цели. Например, Pinterest может иметь следующие микросервисы: профиль пользователя, подписчик, лента, поиск, загрузка фотографий и т.д.

Обнаружение служб

Системы, такие как Consul, Etcd и Zookeeper, могут помочь сервисам находить друг друга, отслеживая зарегистрированные имена, адреса и порты. Проверки работоспособности помогают проверить целостность сервиса и часто выполняются с использованием конечной точки HTTP. И Consul, и Etcd имеют встроенную... Хранилище типа «ключ — значение», которое может быть полезно для хранения конфигурационных значений и других общих данных.

Недостатки: уровень приложения

  • Добавление уровня приложения с слабо связанными сервисами требует иного подхода с точки зрения архитектуры, эксплуатации и процесса (в отличие от монолитной системы).
  • Микросервисы могут усложнить развёртывание и эксплуатацию.

Источники и дополнительная литература

База данных


Источник: Масштабирование до первых 10 миллионов пользователей

Система управления реляционными базами данных (СУРБД)

Реляционная база данных, такая как SQL, представляет собой набор элементов данных, организованных в таблицы.

ACID — это набор свойств транзакций реляционной базы данных.

  • Атомарность — каждая транзакция выполняется полностью или не выполняется вообще.
  • Согласованность — любая транзакция переводит базу данных из одного допустимого состояния в другое.
  • Изолированность — выполнение транзакций одновременно даёт те же результаты, что и выполнение их последовательно.
  • Долговечность — после фиксации транзакция остаётся зафиксированной.

Существует множество методов масштабирования реляционных баз данных: основно-резервное копирование, основно-основное копирование, федерация, сегментирование, денормализация и настройка SQL.

Основно-резервное копирование

Мастер обслуживает операции чтения и записи, реплицируя записи на один или несколько резервных серверов, которые обслуживают только операции чтения. Резервные серверы также могут реплицироваться на дополнительные резервные серверы древовидным образом. Если мастер становится недоступен, система может продолжать работать в режиме только для чтения, пока резервный сервер не будет повышен до мастера или не будет подготовлен новый мастер.


Источник: Масштабируемость, доступность, стабильность, шаблоны

Недостатки: основно-резервное копирование
  • Требуется дополнительная логика для повышения резервного сервера до мастера.
  • См. раздел Недостатки: репликация для пунктов, относящихся к обеим моделям основно-резервного и основно-основного копирования.

Основно-основное копирование

Оба мастера обслуживают операции чтения и записи и координируют друг с другом операции записи. Если любой из мастеров выходит из строя, система может продолжить работу с операциями чтения и записи.


Источник: Масштабируемость, доступность, стабильность, шаблоны

Недостатки: основно-основное копирование
  • Вам понадобится балансировщик нагрузки или вам придётся внести изменения в логику приложения, чтобы определить, куда писать.
  • Большинство систем основно-основного копирования либо слабо согласованы (нарушая ACID), либо имеют увеличенную задержку записи из-за синхронизации.
  • По мере добавления узлов записи и увеличения задержки возрастает вероятность конфликтов при разрешении конфликтов.
  • См. раздел Недостатки: репликация для пунктов, связанных с обеими моделями основно-резервного и основно-основного копирования.
Недостатки: репликация
  • Существует риск потери данных, если мастер выйдет из строя до того, как вновь записанные данные смогут быть реплицированы на другие узлы.
  • Записи воспроизводятся на репликах чтения. Если операций записи много, реплики чтения могут замедлиться из-за воспроизведения записей и не смогут выполнять столько операций чтения.
  • Чем больше реплик чтения, тем больше у вас их будет. Репликация

Репликация приводит к увеличению задержки репликации.

  • В некоторых системах запись в мастер может порождать несколько потоков для параллельной записи, тогда как реплики чтения поддерживают только последовательную запись с использованием одного потока.
  • Репликация добавляет больше оборудования и дополнительную сложность.

Источники и дополнительная литература: репликация

  • Масштабируемость, доступность, стабильность, шаблоны (Scalability, availability, stability, patterns).
  • Мультимастерная репликация (Multi-master replication).

Федерация

Федерация (или функциональное разделение) разделяет базы данных по функциям. Например, вместо одной монолитной базы данных у вас может быть три базы данных: форумы, пользователи и продукты, что приводит к уменьшению трафика чтения и записи в каждую базу данных и, следовательно, к меньшей задержке репликации. Меньшие базы данных приводят к тому, что больше данных помещается в памяти, что, в свою очередь, приводит к большему количеству попаданий в кэш из-за улучшенной локальности кэша. Без единого центрального мастера, сериализующего записи, вы можете писать параллельно, увеличивая пропускную способность.

Недостатки федерации:

  • Федерация неэффективна, если ваша схема требует огромных функций или таблиц.
  • Вам нужно будет обновить логику приложения, чтобы определить, в какую базу данных читать и писать.
  • Объединение данных из двух баз данных более сложно при использовании серверной ссылки.
  • Федерация добавляет больше оборудования и дополнительной сложности.

Источники и дополнительная литература: федерация

  • Масштабирование до первых 10 миллионов пользователей (Scaling up to your first 10 million users).

Шардирование

Шардирование распределяет данные по разным базам данных таким образом, что каждая база данных может управлять только подмножеством данных. Если взять в качестве примера базу данных пользователей, то по мере увеличения числа пользователей в кластер добавляется больше сегментов.

Как и преимущества федерации, шардирование приводит к меньшему трафику чтения и записи, меньшей репликации и большему количеству обращений к кэшу. Размер индекса также уменьшается, что обычно улучшает производительность за счёт более быстрых запросов. Если один сегмент выходит из строя, другие сегменты остаются работоспособными, хотя вы захотите добавить некоторую форму репликации, чтобы избежать потери данных. Как и в случае с федерацией, нет единого центрального мастера, который сериализует записи, позволяя вам писать параллельно с увеличенной пропускной способностью.

Распространённые способы разделения таблицы пользователей — либо по инициалам фамилии пользователя, либо по географическому местоположению пользователя.

Недостатки шардирования:

  • Вам потребуется обновить логику вашего приложения для работы с сегментами, что может привести к сложным SQL-запросам.
  • Распределение данных в сегменте может стать неравномерным. Например, группа активных пользователей на сегменте может привести к увеличению нагрузки на этот сегмент по сравнению с другими.
    • Перебалансировка добавляет дополнительную сложность. Функция шардирования, основанная на согласованном хешировании, может уменьшить объём передаваемых данных.
  • Объединение данных из нескольких сегментов более сложно.
  • Шардирование добавляет больше оборудования и дополнительной сложности.

Источники и дополнительная литература: шардирование

  • Пришествие сегмента (The coming of the shard).
  • Архитектура сегментированной базы данных (Shard database architecture).
  • Согласованное хеширование (Consistent hashing).

Денормализация

Денормализация пытается улучшить производительность чтения за счёт некоторой производительности записи. Избыточные копии данных записываются в нескольких таблицах, чтобы избежать дорогостоящих объединений. Некоторые системы управления реляционными базами данных (RDBMS), такие как PostgreSQL и Oracle, поддерживают материализованные представления, которые выполняют работу по хранению избыточной информации и поддержанию согласованности избыточных копий.

После того как данные становятся распределёнными с помощью таких методов, как федерализация и сегментирование, управление объединениями между центрами обработки данных ещё больше усложняется. Денормализация может помочь избежать необходимости в таких сложных объединениях.

В большинстве систем операции чтения могут значительно превосходить операции записи в соотношении 100:1 или даже 1000:1. Операция чтения, приводящая к сложному объединению базы данных, может быть очень затратной, поскольку она тратит значительное количество времени на дисковые операции.

Недостатки денормализации:

  • Данные дублируются.
  • Ограничения могут помочь синхронизировать избыточные копии информации, что усложняет структуру базы данных.
  • Денормализованная база данных при большой нагрузке на запись может работать хуже, чем её нормализованный аналог.

Источники и дополнительная литература: денормализация

Оптимизация SQL

Оптимизация SQL — это обширная тема, и было написано множество книг в качестве справочных материалов.

Важно проводить бенчмаркинг и профилирование, чтобы смоделировать и выявить узкие места.

  • Бенчмаркинг: моделирование ситуаций с высокой нагрузкой с использованием таких инструментов, как ab.
  • Профилирование: включение таких инструментов, как медленный журнал запросов, для отслеживания проблем с производительностью.

Бенчмаркинг и профилирование могут указать вам на следующие оптимизации.

Упрощение схемы

  • MySQL выгружает данные на диск непрерывными блоками для быстрого доступа.
  • Используйте CHAR вместо VARCHAR для полей фиксированной длины. CHAR эффективно обеспечивает быстрый произвольный доступ, тогда как с VARCHAR вы должны найти конец строки, прежде чем переходить к следующей.
  • Для больших блоков текста, таких как посты в блоге, используйте TEXT. TEXT также позволяет выполнять логические поиски. Использование поля TEXT приводит к сохранению указателя на диске, который используется для поиска текстового блока.
  • Для чисел больше 2^32 или 4 миллиардов используйте INT.
  • Чтобы избежать ошибок представления с плавающей запятой, используйте DECIMAL для валюты.
  • Избегайте хранения больших BLOB-объектов, храните местоположение объекта вместо этого.
  • VARCHAR(255) — это максимальное количество символов, которое можно подсчитать в 8-битном числе, часто максимизируя использование байта в некоторых RDBMS.
  • Установите ограничение NOT NULL там, где это применимо, чтобы улучшить производительность поиска.

Использование хороших индексов

  • Столбцы, которые вы запрашиваете (SELECT, GROUP BY, ORDER BY, JOIN), могут работать быстрее с индексами.
  • Индексы обычно представлены в виде самобалансирующегося B-дерева, которое сохраняет данные отсортированными и позволяет выполнять поиск, последовательный доступ, вставки и удаления за логарифмическое время.
  • Размещение индекса может привести к тому, что данные будут храниться в памяти, требуя больше места.
  • Записи также могут замедлиться, так как индекс также необходимо обновить.
  • При загрузке больших объёмов данных может быть быстрее отключить индексы, загрузить данные, а затем перестроить индексы.

Избегание дорогостоящих объединений

Разделение таблиц

  • Разделите таблицу, поместив горячие точки в отдельную таблицу, чтобы помочь сохранить её в памяти.

Настройка кеша запросов

  • В некоторых случаях кеш запросов может привести к проблемам с производительностью.

Источники и дополнительная литература: оптимизация SQL

Как нулевые значения влияют на производительность?

Медленный журнал запросов

NoSQL — это набор элементов данных, представленных в виде хранилища «ключ-значение», хранилища документов, хранилища широких столбцов или графовой базы данных. Данные денормализованы, и объединения обычно выполняются в коде приложения. Большинство хранилищ NoSQL не имеют настоящих транзакций ACID и предпочитают возможную согласованность.

Часто для описания свойств баз данных NoSQL используется термин BASE. В сравнении с теоремой CAP, BASE выбирает доступность вместо согласованности.

  • В основном доступно — система гарантирует доступность.
  • Мягкое состояние — состояние системы может меняться со временем, даже без ввода данных.
  • Возможная согласованность — система станет согласованной в течение определённого периода времени, при условии, что система не получает ввод в этот период.

Помимо выбора между SQL или NoSQL, полезно понять, какой тип базы данных NoSQL лучше всего подходит для вашего случая использования. Мы рассмотрим хранилища «ключ-значение», хранилища документов, хранилища широких столбцов и графовые базы данных в следующем разделе.

Хранилище «ключ-значение»

Абстракция: хеш-таблица

Хранилище «ключ-значение» обычно позволяет выполнять операции чтения и записи за O(1) и часто поддерживается памятью или SSD. Хранилища данных могут поддерживать ключи в лексикографическом порядке, что позволяет эффективно извлекать диапазоны ключей. Хранилища «ключ-значение» позволяют хранить метаданные со значением.

Хранилища «ключ-значение» обеспечивают высокую производительность и часто используются для простых моделей данных или быстро меняющихся данных, таких как слой кэша в памяти. Поскольку они предлагают только ограниченный набор операций, сложность переносится на уровень приложения, если требуются дополнительные операции.

Хранилище «ключ-значение» является основой для более сложных систем, таких как хранилище документов и, в некоторых случаях, графовая база данных.

Источники и дополнительная литература: хранилище «ключ-значение»

Хранилище документов

Абстракция: хранилище «ключ-значение» с документами, хранящимися в качестве значений

Хранилище документов сосредоточено вокруг документов (XML, JSON, двоичные файлы и т. д.), где документ хранит всю информацию для данного объекта. Хранилища документов предоставляют API или язык запросов для запроса на основе внутренней структуры самого документа. Обратите внимание, многие хранилища «ключ-значение» включают функции для работы с метаданными значения, размывая границы между этими двумя типами хранилищ.

На основе базовой реализации документы организуются по коллекциям, тегам, метаданным или каталогам. Хотя документы можно организовать или сгруппировать вместе, документы могут иметь поля, которые полностью отличаются друг от друга.

Некоторые хранилища документов, такие как MongoDB и CouchDB, также предоставляют язык, подобный SQL, для выполнения сложных запросов. DynamoDB поддерживает как «ключ-значения», так и документы.

Хранилища документов обеспечивают высокую гибкость и часто используются для работы с периодически изменяющимися данными.

Источники и дополнительная литература: хранилище документов

Wide column store — это база данных, в которой основной единицей информации является столбец (пара «имя/значение»). Столбцы группируются в семейства столбцов (аналогично таблицам SQL). Семейства суперстолбцов объединяют семейства столбцов. Доступ к каждому столбцу осуществляется с помощью ключа строки, а столбцы с одинаковым ключом строки образуют строку. Каждое значение содержит временную метку для управления версиями и разрешения конфликтов.

Google представил Bigtable как первую базу данных широкого столбца, которая повлияла на широко используемый в экосистеме Hadoop открытый исходный код HBase и Cassandra от Facebook. Такие хранилища, как BigTable, HBase и Cassandra, поддерживают ключи в лексикографическом порядке, что позволяет эффективно извлекать отдельные диапазоны ключей.

Ширококолоночные хранилища обеспечивают высокую доступность и масштабируемость. Они часто используются для очень больших наборов данных.

Источники и дополнительная литература: ширококолоночное хранилище

Графовая база данных

В графовой базе данных каждый узел представляет собой запись, а каждая дуга — связь между двумя узлами. Графовые базы данных оптимизированы для представления сложных отношений со множеством внешних ключей или отношений «многие ко многим».

Графовые базы данных обеспечивают высокую производительность для моделей данных со сложными отношениями, такими как социальная сеть. Они относительно новы и ещё не получили широкого распространения; может быть сложнее найти инструменты разработки и ресурсы. Многие графы можно получить только через REST API.

Источники и дополнительная литература: графовая база данных

Источники и дополнительная литература: NoSQL

SQL или NoSQL

Причины использования SQL:

  • Структурированные данные
  • Строгая схема
  • Реляционные данные
  • Необходимость сложных объединений
  • Транзакции
  • Ясные шаблоны масштабирования
  • Более устоявшиеся: разработчики, сообщество, код, инструменты и т. д.
  • Очень быстрые поиски по индексу

Причины использования NoSQL:

  • Полуструктурированные данные

  • Динамическая или гибкая схема

  • Нереляционные данные

  • Отсутствие необходимости в сложных объединениях

  • Хранение многих ТБ (или ПБ) данных

  • Очень интенсивная работа с данными

  • Очень высокая пропускная способность для IOPS Кэши и источник истины, такие как база данных через аннулирование кэша.

  • Аннулирование кэша — сложная задача, связанная с обновлением кэша возникает дополнительная сложность.

  • Необходимо внести изменения в приложение, например, добавить Redis или memcached.

Источники и дальнейшее чтение

Асинхронность


Источник: Введение в проектирование систем для масштабирования

Асинхронные рабочие процессы помогают сократить время запросов на дорогостоящие операции, которые в противном случае выполнялись бы в режиме реального времени. Они также могут помочь, выполняя трудоёмкую работу заранее, например периодическое агрегирование данных.

Очереди сообщений

Очереди сообщений получают, хранят и доставляют сообщения. Если операция слишком медленная для выполнения в реальном времени, вы можете использовать очередь сообщений со следующим рабочим процессом:

  • Приложение публикует задание в очереди, затем уведомляет пользователя о статусе задания.
  • Рабочий забирает задание из очереди, обрабатывает его, а затем сигнализирует о завершении задания.

Пользователь не блокируется, и задание обрабатывается в фоновом режиме. В это время клиент может дополнительно выполнить небольшой объём обработки, чтобы создать впечатление, что задача выполнена. Например, если вы публикуете твит, он может быть мгновенно размещён в вашей ленте, но может пройти некоторое время, прежде чем ваш твит будет доставлен всем вашим подписчикам.

Redis полезен в качестве простого брокера сообщений, но сообщения могут быть потеряны.

RabbitMQ популярен, но требует адаптации к протоколу AMQP и управления собственными узлами.

Amazon SQS размещается, но может иметь высокую задержку и возможность доставки сообщений дважды.

Очереди задач

Очередь задач получает задачи и связанные с ними данные, выполняет их, а затем доставляет результаты. Они могут поддерживать планирование и использоваться для запуска ресурсоёмких заданий в фоновом режиме.

Celery поддерживает планирование и в основном имеет поддержку Python.

Обратное давление

Если очереди начинают значительно расти, размер очереди может стать больше, чем объём памяти, что приведёт к промахам кэша, чтению с диска и даже снижению производительности. Обратное давление может помочь, ограничивая размер очереди и поддерживая высокую скорость передачи и хорошее время отклика для заданий, уже находящихся в очереди. Как только очередь заполнится, клиенты получат сообщение о том, что сервер занят, или HTTP 503, чтобы повторить попытку позже. Клиенты могут повторить запрос позже, возможно, с экспоненциальной отсрочкой.

Недостатки асинхронности

  • Для таких случаев использования, как недорогие вычисления и рабочие процессы в реальном времени, лучше подходят синхронные операции, поскольку введение очередей может привести к задержкам и усложнению.

Источник(ы) и дальнейшее чтение

Закон Литтла (Little's law) — это формула, которая связывает среднее количество заданий в системе (или очереди), среднее время нахождения задания в системе и среднюю скорость поступления заданий в систему. Закон назван в честь Джона Литтла (John Little), который впервые сформулировал его в 1961 году.

В чём разница между очередью сообщений и очередью задач?

Что такое очередь сообщений и чем она отличается от очереди задач? Почему для работы очереди задач требуется брокер сообщений, такой как RabbitMQ, Redis, Celery или IronMQ?

Коммуникация


Источник: модель OSI с 7 уровнями

Протокол передачи гипертекста (HTTP)

HTTP — это метод кодирования и передачи данных между клиентом и сервером. Это протокол «запрос-ответ»: клиенты отправляют запросы, а серверы выдают ответы с соответствующим содержимым и информацией о статусе выполнения запроса. HTTP является автономным, позволяя запросам и ответам проходить через множество промежуточных маршрутизаторов и серверов, которые выполняют балансировку нагрузки, кэширование, шифрование и сжатие.

Базовый HTTP-запрос состоит из глагола (метода) и ресурса (конечной точки). Ниже приведены распространённые HTTP-глаголы:

Глагол Описание Идемпотентность* Безопасность Кэшируемость
GET Чтение ресурса Да Да Да
POST Создание ресурса или запуск процесса, обрабатывающего данные Нет Нет Да, если ответ содержит информацию о свежести
PUT Создание или замена ресурса Да Нет Нет
PATCH Частичное обновление ресурса Нет Нет Да, если ответ содержит информацию о свежести
DELETE Удаление ресурса Да Нет Нет

*Можно вызывать много раз без разных результатов.

HTTP является протоколом прикладного уровня, полагающимся на протоколы нижнего уровня, такие как TCP и UDP.

Источники и дополнительная литература: HTTP

Транспортный протокол управления (TCP)


Источник: Как сделать многопользовательскую игру

TCP — это ориентированный на соединение протокол по IP-сети (IP network). Соединение устанавливается и разрывается с помощью рукопожатия (handshake). Все отправленные пакеты гарантированно достигают места назначения в исходном порядке и без искажений благодаря:

  • Порядковым номерам и полям контрольной суммы для каждого пакета
  • Пакетам подтверждения (acknowledgement) и автоматической повторной передаче

Если отправитель не получает правильный ответ, он повторно отправит пакеты. Если происходит несколько тайм-аутов, соединение разрывается. TCP также реализует управление потоком (flow control) и контроль перегрузки (congestion control). Эти гарантии вызывают задержки и обычно приводят к менее эффективной передаче, чем UDP.

Чтобы обеспечить высокую пропускную способность, веб-серверы могут поддерживать большое количество открытых TCP-соединений, что приводит к высокому использованию памяти. Может быть дорого иметь большое количество открытых соединений между веб-серверными потоками и, скажем, сервером memcached. Пул соединений может помочь в дополнение к переключению на UDP, где это применимо.

TCP полезен для приложений, требующих высокой надёжности, но менее критичных ко времени. Некоторые примеры включают веб-серверы, информацию базы данных, SMTP, FTP и SSH.

Используйте TCP вместо UDP, когда:

  • Вам нужны все данные в целости и сохранности
  • Вы хотите автоматически наилучшим образом использовать пропускную способность сети

Пользовательский протокол датаграмм (UDP)


Примечание: в тексте запроса присутствуют изображения, однако они не были включены в ответ. Удаленный вызов процедур (RPC)

В RPC клиент вызывает процедуру, которая выполняется в другом адресном пространстве, обычно на удаленном сервере. Процедура кодируется так, как если бы это был локальный вызов процедуры, абстрагируя детали взаимодействия с сервером от клиентской программы. Удаленные вызовы обычно медленнее и менее надежны, чем локальные вызовы, поэтому полезно отличать вызовы RPC от локальных вызовов. Популярные фреймворки RPC включают Protobuf, Thrift и Avro.

RPC — это протокол запрос-ответ:

  • Клиентская программа — вызывает клиентскую процедуру-заглушку. Параметры помещаются в стек, как при локальном вызове процедуры.
  • Процедура-заглушка клиента — упаковывает идентификатор процедуры и аргументы в сообщение запроса.
  • Модуль связи клиента — ОС отправляет сообщение от клиента на сервер.
  • Серверная процедура-заглушка — распаковывает результаты, вызывает серверную процедуру, соответствующую идентификатору процедуры, и передает заданные аргументы.
  • Ответ сервера повторяет шаги, описанные выше, в обратном порядке.

Примеры вызовов RPC:

GET /someoperation?data=anId

POST /anotheroperation
{
  "data":"anId";
  "anotherdata": "another value"
}

RPC фокусируется на предоставлении поведения. RPC часто используются по соображениям производительности во внутренних коммуникациях, поскольку вы можете создавать собственные нативные вызовы для более точного соответствия вашим сценариям использования.

Выберите нативную библиотеку (также известную как SDK), когда:

  • Вы знаете свою целевую платформу.
  • Вы хотите контролировать доступ к своей «логике».
  • Вы хотите контролировать, как происходит управление ошибками вне вашей библиотеки.
  • Производительность и пользовательский опыт являются вашими основными задачами.

HTTP API, соответствующие REST, чаще используются для публичных API.

Недостатки RPC:

  • Клиенты RPC тесно связаны с реализацией сервиса.
  • Для каждой новой операции или варианта использования необходимо определять новый API.
  • Отладку RPC может быть сложно осуществить.
  • Возможно, вы не сможете использовать существующие технологии из коробки. Например, может потребоваться дополнительная работа, чтобы обеспечить... RPC-вызовы кэшируются должным образом на серверах кэширования, таких как Squid.

Передача состояния представления (REST)

REST — это архитектурный стиль, обеспечивающий клиент-серверную модель, где клиент действует с набором ресурсов, управляемых сервером. Сервер предоставляет представление ресурсов и действий, которые могут либо манипулировать ресурсами, либо получать новое представление ресурсов. Вся коммуникация должна быть без сохранения состояния и кэшируемой.

Существует четыре качества интерфейса RESTful:

  • Идентификация ресурсов (URI в HTTP) — используйте один и тот же URI независимо от операции.
  • Изменение представлений (глаголы в HTTP) — использование глаголов, заголовков и тела.
  • Самоописательные сообщения об ошибках (ответ статуса в HTTP) — используйте коды состояния, не изобретайте велосипед.
  • HATEOAS (HTML-интерфейс для HTTP) — ваш веб-сервис должен быть полностью доступен в браузере.

Примеры вызовов REST:

GET /someresources/anId

PUT /someresources/anId {"anotherdata": "another value"}

REST ориентирован на предоставление данных. Он минимизирует связь между клиентом и сервером и часто используется для общедоступных HTTP API. REST использует более общий и унифицированный метод предоставления ресурсов через URI, представление через заголовки и действия через глаголы, такие как GET, POST, PUT, DELETE и PATCH. Будучи без сохранения состояния, REST отлично подходит для горизонтального масштабирования и разделения.

Недостатки REST

  • Если ресурсы не организованы естественным образом или доступ к ним осуществляется по простой иерархии, то REST может не подойти. Например, возврат всех обновлённых записей за последний час, соответствующих определённому набору событий, нелегко выразить в виде пути. В REST это, вероятно, будет реализовано с помощью комбинации пути URI, параметров запроса и, возможно, тела запроса.
  • REST обычно полагается на несколько глаголов (GET, POST, PUT, DELETE, PATCH), которые иногда не подходят для вашего случая использования. Например, перемещение просроченных документов в архивную папку может не соответствовать этим глаголам.
  • Извлечение сложных ресурсов с вложенными иерархиями требует нескольких обращений между клиентом и сервером для отображения отдельных представлений, например, извлечение содержимого записи блога и комментариев к этой записи. Для мобильных приложений, работающих в условиях переменной сети, эти множественные обращения крайне нежелательны.
  • Со временем в ответ API может добавляться больше полей, и старые клиенты будут получать все новые поля данных, даже те, которые им не нужны. Это приводит к увеличению размера полезной нагрузки и увеличению задержек.

Сравнение RPC- и REST-вызовов

Операция RPC REST
Регистрация POST /signup POST /persons
Отписка POST /resign
{
"personid": "1234"
}
DELETE /persons/1234
Чтение информации о человеке GET /readPerson?personid=1234 GET /persons/1234
Чтение списка предметов человека GET /readUsersItemsList?personid=1234 GET /persons/1234/items
Добавление предмета в список предметов человека POST /addItemToUsersItemsList
{
"personid": "1234";
"itemid": "456"
}
POST /persons/1234/items
{
"itemid": "456"
}
Обновление предмета POST /modifyItem
{
"itemid": "456";
"key": "value"
}
PUT /items/456
{
"key": "value"
}
Удаление предмета POST /removeItem
{
"itemid": "456"
}
DELETE /items/456

Источник: Действительно ли вы знаете, почему вы предпочитаете REST вместо RPC

Источники и дополнительная литература: REST и RPC

Этот раздел можно обновить. Рассмотрите возможность внести свой вклад!

Безопасность — это обширная тема. Если у вас нет значительного опыта, опыта в области безопасности или вы не претендуете на должность, требующую знаний о безопасности, вам, вероятно, не нужно знать больше, чем основы:

  • Шифруйте при передаче и хранении данных.
  • Очищайте все пользовательские данные или любые входные параметры, доступные пользователю, чтобы предотвратить XSS (межсайтовый скриптинг) и SQL-инъекцию.
  • Используйте параметризованные запросы для предотвращения SQL-инъекции.
  • Применяйте принцип наименьших привилегий.

Источники и дополнительная литература

  • Контрольный список безопасности API.
  • Руководство по безопасности для разработчиков.
  • Десять основных угроз безопасности OWASP.

Приложение Иногда вас могут попросить сделать приблизительные оценки «на коленке». Например, вам может потребоваться определить, сколько времени потребуется для создания 100 эскизов изображений с диска или сколько памяти займёт структура данных. Таблицы степеней двойки и чисел задержки, которые должен знать каждый программист, являются удобными справочными материалами.

Таблица степеней двойки

Степень Точное значение Приблизительное значение Байты
7 128 1 КБ
8 256
10 1 024 1 тысяча 1 КБ
16 65 536 64 КБ
20 1 048 576 1 миллион 1 МБ
30 1 073 741 824 1 миллиард 1 ГБ
32 4 294 967 296 4 ГБ
40 1 099 511 627 776 1 триллион 1 ТБ

Источник: Степени двойки.

Числа задержки, которые должен знать каждый программист

Задержка Сравнение чисел
Ссылка на кэш L1 0,5 нс
Неверное предсказание перехода 5 нс
Ссылка на кеш L2 7 нс
Блокировка/разблокировка мьютекса 25 нс
Основная память 100 нс
Сжатие 1 Кб байтов с помощью Zippy 10 000 нс
Отправка 1 Кб по сети со скоростью 1 Гбит/с 10 000 нс
Случайное чтение 4 Кб из SSD 150 000 нс
Последовательное чтение 1 Мб из памяти 250 000 нс
Круговой обход в пределах одного центра обработки данных 500 000 нс
Последовательное чтение 1 Мб с SSD 1 000 000 нс
Поиск HDD 10 000 000 нс
Чтение 1 Мб последовательно из памяти 250 000 нс
Передача пакета CA->Нидерланды->CA 150 000 000 нс

Примечания: 1 нс = 10⁻⁹ секунд. 1 мкс = 10⁻³ секунд = 1 000 нс. 1 мс = 10⁻³ секунд = 1 000 мкс = 1 000 000 нс.

Удобные показатели на основе приведённых выше чисел:

  • Последовательное считывание с жёсткого диска со скоростью 30 МБ/с.
  • Последовательное считывание через Ethernet со скоростью 100 МБ/с. Последовательно с SSD со скоростью 1 ГБ/с.
  • Читать последовательно из основной памяти со скоростью 4 ГБ/с.
  • 6–7 обращений по всему миру в секунду.
  • В пределах центра обработки данных — 2000 обращений в секунду.

Числа задержки визуализированы.

Источники и дополнительная литература:

Дополнительные вопросы по проектированию системы на собеседовании

Вопрос Ссылка(и)
Спроектировать службу синхронизации файлов наподобие Dropbox youtube.com
Спроектировать поисковую систему наподобие Google queue.acm.org
stackexchange.com
ardendertat.com
stanford.edu
Спроектировать масштабируемый веб-краулер наподобие Google quora.com
Спроектировать Google Docs code.google.com
neil.fraser.name
Спроектировать хранилище «ключ-значение» наподобие Redis slideshare.net
Спроектировать систему кэширования наподобие Memcached slideshare.net
Спроектировать рекомендательную систему наподобие Amazon hulu.com
ijcai13.org
Спроектировать систему коротких URL наподобие Bitly n00tc0d3r.blogspot.com
Спроектировать приложение для чата наподобие WhatsApp highscalability.com
Спроектировать систему обмена фотографиями наподобие Instagram highscalability.com
highscalability.com
Спроектировать функцию ленты новостей Facebook quora.com
quora.com
slideshare.net
Спроектировать функцию временной шкалы Facebook facebook.com
highscalability.com
Спроектировать функцию чата Facebook erlang-factory.com
facebook.com
Спроектировать функцию поиска по графу наподобие Facebook Системы реального мира

Статьи о том, как разрабатываются реальные системы.

Статьи о том, как разрабатываются системы реального мира.


Источник: Масштабируемость временных шкал Twitter.

Не фокусируйтесь на мельчайших деталях следующих статей, вместо этого:

  • Определите общие принципы, общие технологии и шаблоны в этих статьях.
  • Изучите, какие проблемы решает каждый компонент, где он работает, а где нет.
  • Проанализируйте извлечённые уроки.
Тип Система Ссылка(и)
Обработка данных MapReduce — Распределённая обработка данных от Google research.google.com
Обработка данных Spark — Распределённая обработка данных от Databricks slideshare.net
Обработка данных Storm — Распределённая обработка данных от Twitter slideshare.net
Хранилище данных Bigtable — Распределённая колоночно-ориентированная база данных от Google harvard.edu
Хранилище данных HBase — Открытая реализация Bigtable slideshare.net
Хранилище данных Cassandra — Распределённая колоночно-ориентированная база данных от Facebook slideshare.net
Хранилище данных DynamoDB — Документно-ориентированная база данных от Amazon Архитектуры компаний
Компания Ссылка(и)
Amazon Архитектура Amazon
Cinchcast Производство 1500 часов аудио каждый день
DataSift Анализ данных в реальном времени со скоростью 120 000 твитов в секунду
Dropbox Как мы масштабировали Dropbox
ESPN Работа на скорости 100 000 дух-нух-нухов в секунду
Google Архитектура Google
Instagram 14 миллионов пользователей, терабайты фотографий
Что стоит за Instagram
Justin.tv Архитектура прямой видеотрансляции Justin.Tv
Facebook Масштабирование memcached в Facebook
TAO: Распределённое хранилище данных для социального графа Facebook
Хранение фотографий в Facebook
Как Facebook транслирует Live-видео для 800 000 одновременных зрителей
Flickr Архитектура Flickr
Mailbox От 0 до миллиона пользователей за 6 недель
Netflix Полный обзор всей системы Netflix Стек Netflix: что происходит, когда вы нажимаете кнопку «play»?

Pinterest: от 0 до десятков миллиардов просмотров страниц в месяц.

Playfish: 50 миллионов пользователей ежемесячно и рост.

PlentyOfFish: архитектура PlentyOfFish.

Salesforce: как они обрабатывают 1,3 миллиарда транзакций в день.

Stack Overflow: архитектура Stack Overflow.

TripAdvisor: 40 млн посетителей, 200 млн динамических просмотров страниц, 30 ТБ данных.

Tumblr: 15 миллиардов просмотров страниц в месяц.

Twitter: ускорение Twitter на 10 000 процентов. Хранение 250 миллионов твитов в день с использованием MySQL. Архитектура Twitter для работы с 150 миллионами активных пользователей. Временные шкалы в масштабе. Большие и малые данные в Twitter. Операции в Twitter: масштабирование за пределы 100 миллионов пользователей. Как Twitter обрабатывает 3 000 изображений в секунду.

Uber: как Uber масштабирует свою платформу реального времени. Уроки, извлечённые из масштабирования Uber до 2 000 инженеров, 1 000 сервисов и 8 000 репозиториев Git.

WhatsApp: архитектура WhatsApp, купленная Facebook за 19 миллиардов долларов.

YouTube: масштабируемость YouTube. Архитектура YouTube.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Системный дизайн для начинающих. Развернуть Свернуть
CC-BY-4.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/hufengjiu-system-design-primer.git
git@api.gitlife.ru:oschina-mirror/hufengjiu-system-design-primer.git
oschina-mirror
hufengjiu-system-design-primer
hufengjiu-system-design-primer
master