Я пытаюсь создать общий планировщик заданий, чтобы расширить свои архитектурные знания и способность думать о вопросах проектирования системы в интервью. До сих пор то, что я придумал, ниже. Можете ли вы указать, где я должен работать, чтобы быть всеобъемлющим в моем подходе к решению этой проблемы?
Я прочитал много ресурсов в Интернете, но вам нужно определенное руководство для продвижения вперед.
Создайте общий планировщик заданий для компании X (который является одним из больших технологические фирмы сегодня).
Использовать случаи
Создать/прочитать/обновить/удалить задания
Изучите задания, которые были запущены в прошлое (тип работы, время, детали)
Ограничения
Сколько заданий будет выполняться в системе за секунду?
= # заданий/час из-за пользователей + # заданий/час из-за машин
= 1m * 0,5/day/24/3600 + 1m/50 * 20/24/3600
~ = 12 заданий/сек
Сколько данных система должна хранить?
Рассуждение: я только сохраняю детали выполнения задания, фактическое работа (script исполнение) выполняется > на других машинах, а некоторые из собранные данные - это время окончания, состояние успеха/отказа и т.д. Это > все, скорее всего, текст, возможно, с графикой для иллюстрации. я будет хранить данные → всех заданий, выполняемых в системе, через планировщик заданий (т.е. за последние 10 лет)
= (Размер страницы, на которой заданы детали задания + размер данных, собранных по заданию) * Количество заданий * 365 > дней * 10 лет = 1 МБ * 900 000 * 365 * 10
~ = 3600 000 000 МБ
= 3600 000 ГБ
= 3600 ТБ = 3,6 PB
Абстрактная конструкция
Основываясь на приведенной выше информации, нам не нужно слишком много машины для хранения данных. Я бы разбил дизайн на следующее:
Уровень приложения: обслуживает запросы, показывает детали пользовательского интерфейса.
Уровень хранения данных: действует как большая хеш-таблица: хранит сопоставления ключевое значение (ключевыми были бы задания, организованные dateTime, которые они запускали, в то время как значения будут показывать детали этих заданий). Это значит, что легкий поиск исторических и/или запланированных заданий.
Узкие места:
Трафик: 12 заданий/сек не слишком сложны. Если это всплески, мы можем используйте балансировщик нагрузки для распределения заданий на разные серверы для выполнение.
Данные: при 3,6 ТБ нам нужна хеш-таблица, которая может быть легко запрашивается для быстрого доступа к заданиям, выполненным в выражение.
Масштабирование абстрактного дизайна
Характер этого планировщика заданий заключается в том, что каждая работа обладает одним из несколько состояний: Ожидание, Ошибка, Успех, Прекращено. Нет бизнес-логики Возвращает небольшие данные.
Для обработки трафика мы можем иметь сервер приложений, который обрабатывает 12 запросов/сек и резервную копию, если этот сбой не выполняется. В В будущем мы можем использовать балансировщик нагрузки для уменьшения количества запросов переход на каждый сервер (при условии, что > 1 сервер находится в производстве) Преимущество из этого было бы сократить количество запросов/сервера, увеличить доступности (в случае сбоя одного сервера и обработки трафика spike-y а).
Для хранения данных, чтобы хранить 3,6 ТБ данных, нам понадобится несколько машин удерживать его в базе данных. Мы можем использовать db noSQL или SQL db. Учитывая, как последнее имеет более широкое применение и поддержку сообщества, которые помогут в вопросах устранения неполадок и используется крупными фирмами в настоящий момент, я выберет mySQL db.
По мере роста данных я бы принял следующие стратегии для обработки это:
1) Создайте уникальный индекс на хеше
2) Увеличьте mySQL db вертикально, добавив больше памяти
3) Разделите данные путем окантовки
4) Используйте стратегию репликации ведущего-подчиненного с мастер-мастером репликация для обеспечения избыточности данных
Заключение
Следовательно, это будет мой дизайн компонентов планировщика заданий.