Сейчас мы работаем над новым проектом - разработка.
онлайн квест , суть которого в том, что программисты, разделенные на два лагеря (ИТ-специалисты и специалисты ФСБ), будут решать самые разные задачи в области программирования на своем любимом языке, проходя при этом интересную историю, читая красочный комикс с захватывающий сценарий.
Скажем сразу, ограничений по языкам программирования нет. Единственное ограничение: их могут просто не установить на сервера из-за их редкости, например.
Сегодня мы хотели бы поговорить о проблемах, с которыми мы столкнулись при разработке серверной части.
Самой важной проблемой проекта было обеспечение безопасности серверов во время игры, потому что.
Мы позволим вам запускать по сути чужой код без каких-либо ограничений доступа к ресурсам.
Те.
При запуске программ мы должны настроить среду таким образом, чтобы завершенная программа (которая на самом деле может оказаться установщиком вируса) не ломала сервер и удалялась по завершении работы.
При решении задачи необходимо составить список пунктов, составляющих задачу.
Наш список выглядит следующим образом:
- У нас есть сервер, на котором будет работать какое-то программное обеспечение, полученное из внешнего источника, и которое, по сути, не знает, что оно будет делать во время работы;
- В будущем появится большое количество пользователей, которые будут загружать на сервер большое количество приложений.
Некоторые из них, вполне возможно, могут даже оказаться вирусами: мы разрешим загружать все, от php до exe файлов.
Проблема аналогичная, но немного шире: программа может оставаться резидентной и работать на сервере;
- При запуске программы будут потреблять огромное количество ресурсов.
Как вы понимаете, в таких условиях это не выход, потому что.
сервер обязательно упадет, это вопрос времени.
Когда кто-то пишет программу с какой-то ужасной ошибкой или когда кто-то загружает вирус.
Здесь, кстати, возникает еще одна проблема: вы можете испортить результаты соперников, используя их как свои.
Если бы нашей платформой был Linux, это было бы решением.
Это было бы хорошее и устойчивое решение, которое устроило бы всех как по стоимости, так и по времени создания.
Однако исторически наша группа — .
NET-разработчики и эта система нам чужда.
Поэтому, чтобы не подрывать безопасность сервера незнанием тонкостей, было решено придерживаться платформы Windows. Вы можете создать песочницу в Windows. По этому вопросу было проведено целое исследование.
Например, вы можете ограничить процесс объемом оперативной памяти, которую он выделяет. Или по объему дисковой памяти, которую может занять файловая система.
Ограничить процесс можно практически во всем, однако, простите меня Билл Гейтс, в ОС Windows слишком много вирусов, а значит, все эти препятствия можно устранить, например, с помощью вируса.
Поэтому на полпути разработки этой версии от нее было решено отказаться.
Несмотря на то, что по сути это было бы крутое решение: нет проблем со сбором результатов работы программы, и нет проблем с очисткой деятельности программы.
С помощью объектов ядра Windows, называемых Jobs, накладываются ограничения на использование ресурсов ОС, а с помощью правил в NTFS накладываются ограничения на работу в файловой системе.
Почти именно то, что нужно, но чувство самосохранения подсказывало, что еще есть варианты, которые можно сделать достаточно быстро.
На самом деле этот вариант лежит на поверхности, как первое, что приходит на ум.
Есть виртуальная машина, на которой нужно развернуть необходимое приложение и файлы.
Далее приложение запускается, его вывод собирается в файл, а после завершения работы файл забирается из виртуальной машины, которая в свою очередь сбрасывается в исходное состояние.
Данное решение имеет ряд преимуществ, которые делают его выигрышным по всем параметрам:
- Состояние машины сбрасывается, а это значит, что внутри как минимум апокалипсис, или удаление операционной системы с жестких дисков.
Неважно, что происходит. По окончании работы (или по таймауту) просто берём и откатываемся к снапшоту.
- Окружающая среда не разрушается после того, как предыдущая машина закончила работу.
- Вы можете контролировать каждую мелочь.
- Однако есть один недостаток: сложное управление.
Однако, как оказалось, есть замечательный продукт: VirtualBox, у которого есть богатый API и так необходимый мне агент. Почему я так рад появлению готового агента? Чем больше компонентов мы запустим с нуля, тем больше ошибок отловим.
Не потому, что мы такие неопытные, нет. Просто всегда есть ошибки, а во вновь написанном ПО тем более.
Код, отлаженный сотнями тысяч прогонов, намного лучше, чем код, написанный самостоятельно.
По этой же причине мы отказались от одного рискованного шага: для экономии ресурсов мы могли использовать ReactOS в качестве гостевой операционной системы.
Это действительно было бы возможно.
Если бы не одно НО.
Некоторые переводчики просто не там начинали.
Нисколько.
Возможно, в этой ОС есть всего одна ошибка, и она находится глубоко в ядре.
Но его наличие затронет половину приложений и создаст ощущение нестабильности происходящего.
Если бы не это, мы бы выбрали его, хотя бы по следующим причинам:
- Он практически ничего не занимает на жестком диске (~ 40 МБ).
- Он почти не занимает оперативной памяти (~ 40 МБ)
- Почти не требует ресурсов процессора
Эта великолепная операционная система станет идеальной, если ее тщательно отполировать до состояния, свободного от ошибок.
Легкая Windows, время запуска которой исчисляется секундами (~5).
Итак, окончательное решение:
- Хостинг облачный.
У него есть API, можно динамически, программно увеличивать узлы, если на сервер придут тысячи людей и начнут играть.
Вы также можете динамически отключить их.
- Узел поднимается из шаблона.
Шаблон содержит Windows, Git, VirtualBox и скрипт. Скрипт загружает из репозитория последнюю версию исполняемых файлов и запускает сервис.
- Служба запускается, подхватывает VirtualBox, ищет на нем шаблонную виртуальную машину и в зависимости от конфигурации клонирует ее в нескольких копиях.
Машина предварительно настроена с интерпретаторами PHP, Perl, Python, Ruby, Lua, а также Java, версией .
Net Framework 3.5. Винда 7 64бит.
- Начинает прослушивать очередь команд.
- При поступлении команды она парсится на свободную виртуальную машину, загружается скрипт плеера или EXE-файл и запускается.
У вас есть 30 секунд, чтобы решить задачу.
По истечении времени или завершении процесса файл output.log, в который записан ход выполнения программы OUTPUT, копируется на хост-машину, а виртуальная машина сбрасывается в исходное состояние с откатом к последнему снимку.
- Результаты попадают в браузер.
На данный момент мы можем говорить о следующих результатах нашей работы:
- Единственное, что нам не нравится, это размер образа виртуальной машины.
На рабочей станции клонирование образа размером 4 ГБ на пять узлов занимает около 20–30 минут. Исправить ошибку было бы кошмаром.
Поэтому наличие готового агента на стороне гостевой виртуальной машины и наличие стабильных версий интерпретаторов — это отдельный большой плюс.
Это в некоторой степени гарантирует бесперебойную работу гостевой машины.
Скоро загрузим и узнаем, как он поведет себя в облаке;
- Общее время, которое занимает весь путь от браузера до виртуальной машины, запуск, ожидание завершения и обратно - в виде логов (с учетом отката гостевой машины в исходное состояние) занимает 4 секунды максимум Загрузка процессора 20%.
Это отличный результат. Те.
при запуске сервера с 5 запущенными виртуальными машинами мы сможем обрабатывать до 75 проверок заданий в минуту.
То есть можно предположить, что можно обойтись всего одним сервером.
На всякий случай второй подойдет. И третий, если один из двух сработает (а вдруг!).
- Мы не проверяли адреса электронной почты при подписке по простой причине: во-первых, если они введут неверные адреса, люди все равно будут получать почту.
Во-вторых, зачем рассылать спам о том, что ты типа подписался, если можно просто написать это на экране? И в-третьих: зачем заставлять людей заходить в свой почтовый ящик, чтобы удалить этот спам? :)
А пока добро пожаловать на сайт игры (и не забудьте написать в комментариях, на каком языке вы хотели бы решать задачи?):
Теги: #игра #квест #распределенные вычисления #Разработка сайтов #.
NET
-
Босния И Герцеговина
19 Oct, 24 -
Как Продвигать Свое Видео На Youtube
19 Oct, 24 -
Проект За 7 Дней. Дело Для Быстрого Старта.
19 Oct, 24 -
Интернет-Кафе Вместо Спальни
19 Oct, 24 -
Medusa Api: Написание Полнотекстового Rss
19 Oct, 24