Я пытаюсь создать общий планировщик заданий, чтобы расширить свои архитектурные знания и умение думать о вопросах проектирования системы в интервью. До сих пор то, что я придумал, ниже. Можете ли вы указать, где я должен работать, чтобы быть всеобъемлющим в моем подходе к решению этой проблемы?Создайте общий планировщик заданий
Я прочитал много ресурсов в Интернете, но вам нужно определенное руководство в продвижении вперед.
Создайте общий планировщик заданий для компании X (которая является одной из крупных современных технологий ).
Прецеденты
Создание/чтение/обновление/удаление заданий
Исследовать рабочие места, которые были бежать в прошлое (тип работы, время, проведенные, деталь)
сдерживающего
Сколько рабочих мест будет выполняться в системе в секунду?
= # работа/час из-за пользователей + # Работа/час из-за машин
= 1м * 0,5/день/24/3600+ 1м/50 * 20/24/3600
~ = 12 рабочих мест/сек
Сколько данных система должна хранить?
Рассуждение: Я только хранение задания деталей исполнения, фактическая работа (выполнение скрипта) выполняется> на других машинах, а некоторые из данных, собранных является время окончания, успех статус/неисправность, и т.д.. Это> все, скорее всего, текст, возможно, с графикой для иллюстрации. Я будет хранить данные>> все работы, выполняемые на в системе через планировщик заданий (т.е. в течение последних 10 лет)
= (размер страницы, где детали заданий устанавливаются + размер данных, собранных о работе) * # рабочих мест * 365> дней * 10 лет = 1 MB * 900 000 * 365 * 10
~ = 3600 000 000 MB
= 3600 000 GB
= 3600 ТБ = 3.6 PB
Аннотация дизайн
На основе приведенной выше информации, мы не должны иметь слишком много машины для хранения данных. Я разбил бы проект на , следующий:
Накладной слой: обслуживает запросы, показывает детали пользовательского интерфейса.
хранения данных слоя: Действует как большой хэш-таблицы: Сохраняет отображения ключ-значение (ключ будет рабочие места, организованные DATETIME они бегут, в то время как значения будут показывать подробности этих работ). Это позволит легко найти исторические и/или запланированные задания .
Узкие:
трафика: 12 рабочих мест/сек не слишком сложно. Если это всплески, мы можем использовать балансировщик нагрузки для распределения заданий на разные серверы для выполнения .
Данные: при 3,6 ТБ нам нужна хеш-таблица, которая может быть легко запрошена для быстрого доступа к заданиям, которые были выполнены в приложении .
Масштабирование абстрактный дизайн
Характер этой работы планировщика является то, что ему каждая работа обладает одна из нескольких состояний: В ожидании, не удалось, успех, расторгнуто. Нет бизнес-логики Возвращает небольшие данные.
Для обработки трафика у нас может быть сервер приложений, который обрабатывает 12 запросов/сек, а резервная копия - в случае сбоя. В будущем мы можем использовать балансировщик нагрузки, чтобы уменьшить количество запросов , идущих на каждый сервер (при условии, что> 1 сервер находится в производстве). Преимущество в этом случае - уменьшить количество запросов/сервер, увеличить доступность (в случае, если один сервер терпит неудачу и обрабатывает трафик spike-y хорошо).
Для хранения данных, чтобы хранить 3,6 ТБ данных, нам понадобится несколько машин , чтобы хранить их в базе данных. Мы можем использовать db noSQL или SQL db. Учитывая, как последний имеет более широкое использование и поддержку сообщества, что помогло бы в решении проблем и использовалось крупными фирмами в данный момент, I выберет mySQL db.
По мере роста данных, я бы принять следующие стратегии для обработки его:
1) Создать уникальный индекс на хэш
2) Шкала MySQl дБ по вертикали, добавив больше памяти
3) Разделите данные путем оштукатуривания
4) Используйте стратегию репликации ведущего-ведомого с репликацией master-master , чтобы обеспечить избыточность данных
Заключение
Таким образом, это будет мой дизайн компонентов планировщика заданий.
Я предлагаю вам взглянуть на архитектуру одного из существующих масштабных планировщиков заданий. slurm (https://computing.llnl.gov/linux/slurm/) и grid-engine (http://gridscheduler.sourceforge.net/) приходят на ум в качестве главных кандидатов. –