Блоки
Введение в строительные блоки для современного системного дизайна
Узнайте, как системный дизайн похож на использование кубиков Lego для создания больших и увлекательных артефактов.
В этом разделе мы рассмотрим:
- Подход «снизу вверх» к современному системному дизайну
- Принятые условности
Подход «снизу вверх» к современному системному дизайну
Проблемы системного дизайна обычно имеют некоторые сходства, хотя конкретные детали часто уникальны. Мы выделили эти сходства между различными п роблемами проектирования в виде базовых строительных блоков, которые мы рассмотрим. Один пример строительного блока — это компонент балансировки нагрузки, который, вероятно, будет использоваться в каждой задаче проектирования так или иначе.
Цель выделения строительных блоков — подробно обсудить их проектирование только один раз. Это значит, что в дальнейшем мы сможем использовать их где угодно, не вдаваясь в подробности снова. Мы можем рассматривать строительные блоки как кирпичики для создания более эффективных и мощных систем.
Многие из обсуждаемых нами строительных блоков также доступны для реального использования в публичных облаках, таких как Amazon Web Services (AWS), Azure и Google Cloud Platform (GCP). Мы можем использовать такие конструкции для создания системы, чтобы укрепить наше понимание. (Мы не будем строить систему в этом курсе, но оставляем это как упражнение для заинтересованных учеников.)
Применение строительных блоков для создания подхода «снизу вверх» к проектированию систем
Мы рассмотрим следующие строительные блоки в деталях:
- Система доменных имен (Domain Name System): Этот строительный блок фокусируется на том, как спроектировать иерархические и распределенные системы имен для компьютеров, подключенных к Интернету через различные интернет-протоколы.
- Балансировщики нагрузки (Load Balancers): Здесь мы поймем дизайн балансировщика нагрузки, который используется для справедливого распределения запросов от клиентов среди пула доступных серверов. Он также снижает нагрузку и может обходить неработающие серверы.
- Базы данных (Databases): Этот строительный блок позволяет нам хранить, извлекать, изменять и удалять данные в связи с различными процедурами обработки данных. Здесь мы обсудим типы баз данных, репликацию, разделение и анализ распределенных баз данных.
- Хранилище ключ-значение (Key-Value Store): Это нереляционная база данных, которая хранит данные в виде пары ключ-значение. Здесь мы объясним проектирование хранилища ключ-значение вместе с важными концепциями, такими как достижение масштабируемости, долговечности и настраиваемости.
- Сеть доставки контента (Content Delivery Network): В этой главе мы спроектируем сеть доставки контента (CDN), которая используется для хранения вирусного контента, такого как видео, изображения, аудио и веб-страницы. Она эффективно доставляет контент конечным пользователям, снижая задержки и нагрузку на центры обработки данных.
- Секвенсор (Sequencer): В этом строительном блоке мы сосредоточимся на проектировании генератора уникальных идентификаторов с основным акцентом на поддержании причинности. Он также объясняет три различных метода генерации уникальных идентификаторов.
- Мониторинг сервисов (Service Monitoring): Системы мониторинга критически важны в распределенных системах, поскольку они помогают анализировать систему и оповещать заинтересованные стороны в случае возникновения проблемы. Мониторинг часто полезен для раннего предупреждения, чтобы системные администраторы могли действовать до того, как проблема станет серьезной. Здесь мы создадим две системы мониторинга: одну для серверных ошибок и другую для ошибок на стороне клиента.
- Распределенный кеш (Distributed Caching): В этом строительном блоке мы спроектируем распределенную систему кеширования, где несколько серверов кеша координируют хранение часто запрашиваемых данных.
- Распределенная очередь сообщений (Distributed Messaging Queue): В этом строительном блоке мы сосредоточимся на проектировании очереди, состоящей из нескольких серверов, которая используется между взаимодействующими сущностями, называемыми производителями и потребителями. Она помогает разделить производителей и потребителей, что приводит к независимой масштабируемости и повышению надежности.
- Система публикации-подписки (Publish-Subscribe System): В этом строительном блоке мы сосредоточимся на проектировании асинхронного метода связи между сервисами, называемого системой публикации-подписки (pub-sub system). Она популярна в серверлес (serverless), микросервисных архитектурах и системах обработки данных.
- Ограничитель скорости (Rate Limiter): Здесь мы спроектируем систему, которая ограничивает входящие запросы к сервису на основе заранее определенного лимита. Обычно используется как защитный слой для сервисов, чтобы предотвратить их чрезмерное использование — как намеренное, так и случайное.
- Хранилище Blob (Blob Store): Этот строительный блок фокусируется на решении для хранения неструктурированных данных, таких как мультимедийные файлы и двоичные исполняемые файлы.
- Распределенный поиск (Distributed Search): Поисковая система принимает запрос от пользователя и возвращает релевантный контент за несколько секунд или меньше. Этот строительный блок фокусируется на трех неотъемлемых компонентах: обход, индексирование и поиск.
- Распределенное логирование (Distributed Logging): Логирование — это операция интенсивного ввода-вывода, которая занимает много времени и медленная. Здесь мы спроектируем систему, которая позволяет сервисам в распределенной системе эффективно регистрировать свои события. Система будет масштабируемой и надежной.
- Распределенное планирование задач (Distributed Task Scheduling): Мы спроектируем распределенную систему планирования задач, которая является посредником между задачами и ресурсами. Она интеллектуально распределяет ресурсы для задач, чтобы удовлетворить цели на уровне задач и на уровне системы. Часто используется для разгрузки фоновой обработки, выполняемой асинхронно.
- Шардированные счетчики (Sharded Counters): Этот строительный блок демонстрирует эффективную распределенную систему подсчета для работы с миллионами одновременных запросов на чтение/запись, таких как лайки на твите знаменитости.
Мы расположили строительные блоки топологически, так что блоки, которые зависят от других, идут позже.
Принятые условности (Conventions)
Для пояснения мы будем использовать раздел «Требования» всякий раз, когда мы проектируем строительный блок (и проблему дизайна). Раздел «Требования» будет подчеркивать ожидаемые результаты, которые мы хотим получить от разработанного дизайна. «Требования» будут иметь две подкатегории:
-
Функциональные требования (Functional requirements): Они представляют функции, которые пользователь разработанной системы сможет использовать. Например, система позволит пользователю искать контент с помощью строки поиска.
-
Нефункциональные требования (NFRs): Нефункциональные требования — это критерии, по которым пользователь системы будет считать систему пригодной для использования. NFR может включать такие требования, как высокая доступность, низкая задержка, масштабируемость и так далее.
Давайте начнем с наших строительных блоков.
Таблица продуктов
Serverless Computing — это новая категория в нашей таблице, которая включает функции серверлес-вычислений от Amazon (AWS Lambda), Azure (Azure Functions) и Google Cloud (Cloud Functions). Эти сервисы позволяют вам запускать код в ответ на события и автоматически управлять необходимыми вычислительными ресурсами, без необходимости управлять серверами вручную.
Дополнительные сервисы, не описанные выше
| Building Block | Описание | Примеры технологий и инструментов |
|---|---|---|
| Databases | Системы для хранения, извлечения, модификации и удаления данных в различных типах баз данных. | ClickHouse |
| Key-Value Store | Нереляционные базы данных, хранящие данные в виде пар ключ-значение. | Redis, Memcached |
| Distributed Caching | Системы, координирующие кеширование данных на нескольких серверах для быстрого доступа к часто используемым данным. | Redis, Memcached |
| Distributed Messaging Queue | Очереди сообщений, используемые для взаимодействия между сервисами, обеспечивающие независимую масштабируемость и надежность. | Kafka, RabbitMQ |
| Publish-Subscribe System | Асинхронные системы связи между сервисами, популярные в микросервисных архитектурах и системах обработки данных. | Kafka, RabbitMQ |
| Distributed Search | Поисковые системы, принимающие запросы от пользователей и возвращающие релевантный контент за несколько секунд или меньше. | Elasticsearch |
| Distributed Logging | Системы логирования, позволяющие сервисам в распределенной системе эффективно регистрировать свои события. | Elasticsearch |