Изучение системного проектирования может дать инженерам и менеджерам серьезное преимущество на рынке труда. Инженерам это помогает, поскольку они узнают, почему и когда нужно принимать определенные проектные решения, а менеджеры могут лучше понять, как эти решения влияют на бизнес-процессы. Подход «строительных блоков» описывает общие основные компоненты системного проектирования, чтобы вы могли переназначить свои знания для решения проблем любого масштаба.
Концепция системного проектирования очень сложна и постоянно строится на основе самой себя. В этой статье рассматриваются компоненты или основные строительные блоки современного системного проектирования. Если вы хотите ознакомиться с некоторыми другими основами системного проектирования или другими предварительными концепциями, такими как паттерны системного проектирования или масштабируемые веб-приложения, посмотрите статью Полное руководство по системному проектированию.
Мы рассмотрим:
- Что такое системный дизайн?
- Компоненты современного системного дизайна
- Балансировщики нагрузки
- Хранилище ключевых значений
- Хранилище блобов
- Базы данных
- Ограничители скорости
- Система мониторинга
- Распределенная очередь сообщений системы
- Распределенный генератор уникальных идентификаторов
- Распределенный поиск
- Распределенная служба протоколирования
- Распределенный планировщик задач
- Начните работать с современным системным дизайном уже сегодня
- Что такое проектирование систем?
- Компоненты современного системного дизайна
- Балансировщики нагрузки
- Хранилища ключевых значений
- Хранилище блобов
- Базы данных
- Ограничители скорости
- Системы мониторинга
- Распределенные очереди обмена сообщениями
- Распределенные генераторы уникальных идентификаторов
- Распределенный поиск
- Распределенные службы протоколирования
- Распределенные планировщики задач
- Начните изучать современное проектирование систем уже сегодня
- Продолжайте изучать системный дизайн на сайте Educative
- Начать обсуждение
Что такое проектирование систем?
В самом простом смысле, проектирование систем — это процесс определения: строительных блоков и их интеграции, API и моделей данных, которые функционируют вместе для создания крупномасштабных систем.
Важно помнить, что каждая система разрабатывается для удовлетворения определенных заранее установленных функциональных и нефункциональных требований.
Проектирование систем направлено на создание систем, которые являются: надежными, эффективными и обслуживаемыми.
- Надежные системы справляются с неисправностями, сбоями и ошибками.
- Эффективные системы отвечают всем потребностям пользователей, а также требованиям бизнеса.
- Обслуживаемые системы гибкие и легко масштабируются. В обслуживаемых системах также легко добавлять новые функции.
Системный дизайн использует концепции компьютерных сетей, параллельных вычислений и распределенных систем для создания систем, которые хорошо работают и масштабируются. Концепции проектирования систем основываются на предварительных знаниях о распределенных системах. Вкратце, распределенные системы — это совокупность компьютеров, которые взаимодействуют друг с другом, образуя единый компьютер для конечного пользователя. Этот стиль архитектуры проектирования систем известен тем, что хорошо масштабируется, но при этом является сложным по своей природе.
Компоненты современного системного дизайна
Более точный термин для описания этих компонентов — «строительные блоки».
Идея современного системного дизайна исходит из подхода, при котором строительные блоки собираются в единое целое.
Рассматривая отдельные концепции системного дизайна как строительные блоки для формирования более крупного целого, мы можем разложить сложные проблемы на составляющие в удобоваримой и понятной форме. Проблемы проектирования систем, как правило, имеют некоторые общие черты. Однако большинство конкретных деталей уникальны. Выделив эти уникальные строительные блоки и описав их по одному, мы можем использовать их как независимые строительные блоки при проектировании системы. Важно учитывать шаблоны проектирования программного обеспечения, которые мы видим, когда речь идет о проектировании крупномасштабных систем.
Многие из строительных блоков, рассмотренных в этой статье, также доступны для использования в общедоступных облаках. Возможно, вы знакомы с некоторыми из этих услуг, предлагаемых через Amazon Web Services (AWS), Microsoft Azure и Google Cloud Platform (GCP).
Узнайте больше об устройстве службы облачных вычислений Azure.
Балансировщики нагрузки
Балансировка нагрузки является ключевым элементом проектирования системы. Она включает в себя делегирование задач по заданной ширине ресурсов.
В среднем к системе могут поступать миллионы запросов в секунду. Балансировщики нагрузки гарантируют, что все эти запросы могут быть обработаны, распределяя их между доступными серверами.
Таким образом, серверы получат более управляемый поток задач, и уменьшится вероятность того, что один сервер будет перегружен запросами. Равномерное распределение вычислительной нагрузки позволяет ускорить время отклика и увеличить пропускную способность веб-трафика.
Балансировщики нагрузки являются важной частью процесса проектирования системы. Они обеспечивают несколько ключевых свойств, необходимых для современного веб-дизайна.
- Масштабирование: Балансировщики нагрузки облегчают масштабирование, как вверх, так и вниз, маскируя изменения, вносимые в количество серверов.
- Доступность: Разделяя запросы, балансировщики нагрузки поддерживают доступность системы даже в случае отключения сервера.
- Производительность: Направление запросов на серверы с низким трафиком уменьшает время отклика для конечного пользователя.
Хранилища ключевых значений
Хранилище ключевых значений или база данных ключевых значений — это системы хранения данных, похожие на хэш-таблицы или словари. Хеш-таблицы и словари являются ассоциативными, поскольку хранят информацию в виде пары в формате (ключ, значение). Информация может быть легко извлечена и отсортирована, так как каждое значение связано с ключом.
Хранилища ключевых значений — это распределенные хэш-таблицы (DHT).
Распределенные хэш-таблицы — это просто децентрализованные версии хэш-таблиц. Это означает, что они используют общие пары ключ-значение и методы поиска.
Ключи в хранилище ключевых значений рассматривают данные как единую непрозрачную коллекцию. Хранимые данные могут быть блобом, именем сервера, изображением или чем угодно, что пользователь захочет сохранить. Значения называются непрозрачными типами данных, поскольку они эффективно скрыты методом хранения. Важно, чтобы типы данных были непрозрачными для поддержки таких концепций, как сокрытие информации и объектно-ориентированное программирование (ООП).
Примерами современных крупномасштабных хранилищ ключевых значений являются Amazon DynamoDB и Microsoft Cassandra.
Хранилище блобов
Blob, или бинарное хранилище больших объектов, — это решение для хранения неструктурированных данных. Эти данные могут быть практически любого типа: фотографии, аудио, мультимедиа, исполняемый код и т.д.
В блоб-хранилищах используются плоские схемы организации данных, то есть отсутствует иерархия каталогов и подкаталогов.
Большинство служб хранения блобов, таких как Microsoft Azure или AWS S3, построены по правилу «запись один раз, чтение много» или WORM. Это обеспечивает защиту важных данных, поскольку после записи данные могут быть прочитаны, но не изменены.
Хранилища блобов идеально подходят для любых приложений с большим объемом данных. К наиболее известным пользователям блочных хранилищ относятся:
- YouTube (Google Cloud Storage)
- Netflix (Amazon S3)
- Facebook (Tectonic)
Эти сервисы генерируют огромные объемы данных через большие медиафайлы. По оценкам, только YouTube ежедневно генерирует петабайт (1024 терабайта!) данных.
Базы данных
Традиционные методы хранения файлов имеют существенные ограничения, когда речь идет о масштабировании и расширении функциональности системы. Ответом на эти ограничения являются базы данных.
База данных — это организованная коллекция данных, к которым можно легко получить доступ и изменить. Базы данных существуют для того, чтобы упростить процесс хранения, извлечения, изменения и удаления данных.
Существует два основных типа баз данных:
- SQL, реляционные базы данных
- NoSQL, нереляционные базы данных
В двух словах, реляционные базы данных структурированы, используют заранее определенную схему и записывают такие данные, как контактные номера и адреса. Нереляционные базы данных являются неструктурированными и используют динамическую схему. Нереляционные базы данных — это каталоги файлов, в которых хранится информация, например, личные профили или предпочтения покупателей.
Базы данных — это почти универсальный строительный блок системного дизайна, и здесь есть много интересного. Для более глубокого изучения баз данных ознакомьтесь с этим учебником по проектированию баз данных.
Ограничители скорости
Ограничитель скорости устанавливает лимит на количество запросов, которые будет выполнять служба. Он будет дросселировать запросы, которые превышают этот порог.
Ограничители скорости являются важной линией обороны для сервисов и систем. Они предотвращают переполнение служб запросами. Запрещая чрезмерное количество запросов, они могут снизить потребление ресурсов.
В некоторых случаях ограничители скорости могут выполнять функции, аналогичные балансировщикам нагрузки. В системах, обрабатывающих большие объемы данных, они помогают контролировать поток данных между машинами.
Системы мониторинга
Системы мониторинга — это программное обеспечение, позволяющее системным администраторам контролировать инфраструктуру. Этот компонент системного дизайна важен, поскольку он создает единое централизованное место для наблюдения за общей производительностью потенциально большой системы компьютеров в режиме реального времени.
Системы мониторинга должны иметь возможность отслеживать такие факторы, как:
- Процессоры
- Память сервера
- Маршрутизаторы
- Коммутаторы
- Полоса пропускания
- Приложения
- Производительность и доступность важных сетевых устройств
Распределенные очереди обмена сообщениями
Очередь обмена сообщениями — это посредник между двумя связанными сущностями, известными как производители и потребители. Производитель создает сообщения, а потребители получают и обрабатывают их.
Очереди обмена сообщениями помогают повысить производительность за счет асинхронной связи, поскольку производители и потребители действуют независимо друг от друга. В результате очередь обмена сообщениями помогает разделить или уменьшить зависимость в системе. Это повышает надежность и позволяет создать более простую, менее загроможденную систему. Кроме того, асинхронный обмен сообщениями способствует масштабируемости. Можно добавить больше потребителей, чтобы компенсировать возросшую нагрузку.
Существует несколько вариантов использования распределенной очереди сообщений.
- Отправка электронных писем: Как следует из названия, очередь обмена сообщениями позволяет отправлять электронные письма. Многим различным службам требуется отправлять электронные письма по разным причинам, включая проверку учетной записи и сброс пароля.
- Постобработка данных: Приложения с поддержкой мультимедиа обрабатывают изображения и видео для различных форматов или платформ. Это может быть трудоемким и ресурсоемким процессом, но очереди сообщений позволяют выполнять обработку в автономном режиме, чтобы уменьшить задержки конечного пользователя.
- Рекомендательные системы: Многие сайты используют файлы cookie для персонализации контента пользователя. Эта система получает данные пользователя и обрабатывает их. Для повышения эффективности этого процесса можно использовать очередь сообщений, поскольку фоновая обработка данных может занимать много времени.
Распределенные генераторы уникальных идентификаторов
Важно пометить объекты в системе уникальным идентификатором. В большой распределенной системе каждую секунду могут происходить миллионы событий, поэтому нам нужен метод их различения. Генератор уникальных идентификаторов выполняет эту задачу и позволяет регистрировать и отслеживать потоки событий для целей отладки или обслуживания.
В большинстве случаев это универсальный уникальный идентификатор (UUID). Это 128-битные числа, которые выглядят следующим образом: 123e4567e89b12d3a456426614174000
in hexadecimal. При таком размере числа существует огромное количество возможных идентификаторов, но нет полной гарантии, что все они будут уникальными.
Мы можем использовать центральную базу данных, которая принимает заданный ID и делает его уникальным, каждый раз увеличивая значение на единицу. К сожалению, при использовании базы данных существует одна точка отказа, которая может прервать весь процесс генерации идентификатора.
Концепцию использования базы данных можно разнообразить с помощью обработчика диапазонов. Обработчики диапазона включают в себя несколько серверов, каждый из которых охватывает диапазон значений идентификатора. Одному серверу могут быть присвоены значения от 100 000 до 300 000. Как только он достигнет ID 300 001, он свяжется с центральным сервером, чтобы получить новый диапазон значений. Это повышает доступность системы, позволяя ей оставаться работоспособной в случае сбоя.
Собственный генератор уникальных идентификаторов Facebook называется Canopy. Canopy использует систему под названием TraceID для обеспечения сквозного отслеживания производительности.
Распределенный поиск
Строки поиска могут иметь решающее значение для просмотра больших веб-сайтов с сотнями или даже тысячами страниц. Большинство современных сайтов имеют панели поиска, помогающие пользователям найти именно то, что они ищут. За каждой строкой поиска стоит поисковая система.
Поисковые системы состоят из трех основных элементов:
- Краулер: находит/собирает контент и создает документы.
- Индексатор: создает индекс для поиска
- Поисковая машина: выполняет поисковый запрос по индексу.
Распределенные поисковые системы надежны и идеально подходят для горизонтального масштабирования. Ярким примером цифрового продукта для распределенного поиска является Elasticsearch.
Распределенные службы протоколирования
Ведение журнала — это процесс записи данных, в частности, событий, происходящих в программной системе. Файл журнала — это запись этих данных. Они могут документировать действия сервисов, транзакций, микросервисов или любые другие данные, которые могут быть полезны при отладке.
Ведение журнала в распределенной системе становится все более важным, поскольку все больше проектов переходят от монолитных к микросервисным архитектурам. Ведение журналов в микросервисной архитектуре удобно тем, что журналы можно проследить по потоку событий от конца до конца. Поскольку микросервисы могут создавать взаимозависимости в системе, и отказ одного сервиса может каскадировать на другие, ведение журнала помогает определить первопричину сбоя.
Распределенные планировщики задач
В вычислительной технике задача — это единица работы, которая требует вычислительных ресурсов в течение определенного времени.
Этими ресурсами могут быть:
- процессорное время
- память
- Хранилище
- пропускная способность сети
Важно, чтобы такие задачи, как загрузка изображений или размещение постов в социальных сетях, были асинхронными, чтобы не заставлять пользователя ждать окончания фоновых задач.
Планировщики задач являются посредниками в балансе спроса и предложения между задачами и ресурсами для управления рабочим процессом системы. Распределяя ресурсы, планировщики задач могут обеспечить эффективное достижение целей на уровне задач и на уровне системы.
Планировщики задач используются в широком спектре систем:
- облачные вычислительные сервисы
- Большие распределенные системы
- узлы на базе одной ОС
Ярким примером планировщика задач для больших распределенных систем является планировщик задач Facebook: Async.
Начните изучать современное проектирование систем уже сегодня
Теперь вы должны иметь представление о том, что требуется для проектирования системы и почему применяются те или иные решения по проектированию систем. Это далеко не полный список всех возможных строительных блоков, которые могут понадобиться вам на пути к проектированию системы, но они являются надежной основой для дальнейшего развития.
Как уже упоминалось, каждый строительный блок в системном дизайне имеет функциональные и нефункциональные требования, которые должны быть выполнены.
После изучения того, что делает каждая система и почему они спроектированы именно так, как они спроектированы, мы рекомендуем научиться выполнять эти требования, чтобы создавать системы самостоятельно. Мы предлагаем совершенно новый курс, разработанный экспертами по проектированию систем, под названием Grokking Modern System Design for Software Engineers and Managers. В этом курсе описаны все вышеупомянутые строительные блоки и многое другое, а затем представлены сценарии системного проектирования реальных приложений.
Существует еще пять строительных блоков, неотъемлемых для проектирования систем, которые не обсуждаются в этой статье. К ним относятся:
- Система доменных имен (DNS)
- Сеть доставки контента (CDN)
- Распределенное кэширование
- Система публикации-подписки
- Шардированные счетчики
К концу курса вы будете понимать, как создавать и реализовывать современные строительные блоки системного дизайна, а также решать любые потенциальные проблемы системного дизайна, возникающие на собеседовании.
Кроме того, вы изучите методы, протоколы и принципы проектирования крупномасштабных распределенных систем, которые успешно выдержали испытание временем. Вот лишь некоторые из этих систем:
- YouTube
- Uber
- Instagram и многие другие.
Счастливого обучения!
Продолжайте изучать системный дизайн на сайте Educative
- Как подготовиться к собеседованию по системному дизайну в 2022 году
- Основы системного проектирования: Что такое теорема CAP?
- Как машинное обучение дает вам преимущество в проектировании систем
Начать обсуждение
Что еще о системном проектировании следует знать новичку? Была ли эта статья полезной? Сообщите нам об этом в комментариях ниже!