@ivodopyanov
NLP, python, numpy, tensorflow

Как правильно реализовать «тяжелый» внутренний сервис в Django?

Проблема:
На моем веб-сайте есть некоторый функционал с объектами, которые требуют много времени на инициализацию. Поэтому я инициализирую их один раз и храню в памяти. Однако они к тому же сами по себе они занимают довольно много памяти. Поэтому сейчас получается, что каждый worker от Apache создает свой собственный набор таких объектов, и лимит по памяти у веб-хостера достигается очень быстро.

Как я представляю себе решение:
Я хочу, чтобы все worker'ы Apache обращались к одному и тому же объекту - чтобы не создавать в каждом потоке свой. Т.е. должен быть один отдельный поток, в котором будут храниться все эти объекты, а потоки, которые обслуживают запросы к серверу, будут посылать запросы к этому потоку. Функционал этот достаточно быстрый, поэтому очереди создаваться не должно.

Вопрос:
Как правильно реализовать такую архитектуру в Django? Надо ли это сделать на уровне Python или используя какие-то механизмы от Django? Должно ли это быть отдельным приложением с REST API?
  • Вопрос задан
  • 485 просмотров
Решения вопроса 1
@nirvimel
Нужно вынести тяжелые объекты за пределы веб-сервера в отдельный процесс, интерфейс к ним обеспечить через RPC на любом транспорте (например, ZeroMQ или голый TCP в качестве транспорта). Это будет архитектурно более правильно. Веб-сервер при этом останется легковесным, многопоточным (что у вас под Apache? Gunicorn? UWSGI? - многопоточность - их задача) и, главное, stateless (каким он и должен быть). А процесс, инкапсулирующий тяжелый объект, станет сервером RPC, прединициализированным, оптимально закешированным, не вызывающим перерасход памяти (расход почти постоянный и не зависит от нагрузки со стороны веб-клиентов) и, главное, statefull (каким он, скорее всего, вам и нужен).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы