Python multiprocessing, Manager и Big Data

Есть веб приложение, которое работает на веб сокетах, а значит и многопользовательское.
Предполагаются высокие нагрузки, в том числе и на процессор.

В связи с тем что пайтон однопоточный (по умолчанию), я боюсь, что могу не выдержать наплыва людей.
По этому хотелось для начала дать возможность серверу работать со всеми ресурсами сервера.

Самой первой проблемой встала архитектура, которая удобная при разработке, но не очень для масштабирования. Если кратко, есть контроллеры, сервисы, фабрики, мапперы и домены. Проблема встала с доменами, если кратко, домены содержат интерфейс для работы с данными. Сами домены кэшируются внутри мейн процесса и живут там, до тех пор, пока домен не запрашивался более 10 минут. Так-же у доменов реализована система блокировок, чтоб никто не мог его изменить, если его кто-то другой хочет изменить.

И вот суть проблемы, доменов может быть много, в одной ситуации (очень мало вероятной) может быть создано до 4кк доменов одного типа, все данные хранятся в оперативке, потому что этими доменами пользуются юзеры. Соответственно если сделать новый процесс, то все данные будут у каждого процесса свои и начать изменения может кто угодно, в свою очередь потерев данные другого процесса.

На сколько опасно использовать Manager из пакета multiprocessing для синхронизации данных между процессами?
По скорости, могу ли я получить проблему, что из-за большого объема данных я очень и очень сильно просяду на скорости получения этих-же данных?
Так-же, можно ли использовать Manager для горизонтального масштабирования?
  • Вопрос задан
  • 3210 просмотров
Пригласить эксперта
Ответы на вопрос 2
Antigluk
@Antigluk
По поводу безопасности Manager'ов не могу сказать.
Но могу посоветовать использовать какую-то очередь и ряд worker'ов которые выполняют задания этой очереди. Как вариант - rabbitmq/pika для пайтона. Для кеша использовать отдельно in-memory сервис, типа redis.

То есть архитектура Web -> Queue -> Worker -> Data
Worker-ы общаются с кешом
Таким образом горизонтально расширяя кол-во воркеров и редис-реплик мы можем увеличивать производительность линейно
Ответ написан
Комментировать
celery может быть тебя в чемто выручит.
а нельзя ли хранить все твои структуры не в текущем процессе а в чем нибудь стороннем? тогда и обращаться с разных процессов будет без проблем.
mongodb позволяет хранить неструктурированные данные, возможно он тебе и нужен
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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