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